我现在做的是一个winform程序,现在想把DataGridView中的数据导出到Excel中,用的是Interop包,程序如下,在导出的时候(未完全导出之前),单击excel界面,程序会停止,而且报错,报错信息:Exception from HRESULT: 0x800AC472;谢了先!下面是程序:
public bool ExportDataGridview(DataGridView datagridview, bool isShowExcel)
{
if (datagridview.Rows.Count == 0)
return false; Excel.Application excel = new Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Visible = isShowExcel; for (int i = 0; i < datagridview.ColumnCount; i++)
{
excel.Cells[1, i + 1] = datagridview.Columns[i].HeaderText;
} for (int i = 0; i < datagridview.RowCount - 1; i++)
{
for (int j = 0; j < datagridview.ColumnCount; j++)
{
excel.Cells[i + 2, j + 1] = datagridview[j, i].Value.ToString();
}
}
return true;
}
public bool ExportDataGridview(DataGridView datagridview, bool isShowExcel)
{
if (datagridview.Rows.Count == 0)
return false; Excel.Application excel = new Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Visible = isShowExcel; for (int i = 0; i < datagridview.ColumnCount; i++)
{
excel.Cells[1, i + 1] = datagridview.Columns[i].HeaderText;
} for (int i = 0; i < datagridview.RowCount - 1; i++)
{
for (int j = 0; j < datagridview.ColumnCount; j++)
{
excel.Cells[i + 2, j + 1] = datagridview[j, i].Value.ToString();
}
}
return true;
}
{
for (int i = 0; i <dt.Rows.Count; i++)
{
for (int j=0;j<dt.Columns.Count;j++)
{
excelSheet.Cells[i+1,j+1] = dt.Rows[i][j].ToString();
}
}
}
不可否认这段程序会不出错误的运行,但是效率就比较低了,会随着数据行和列的增加而增加,主要的时间都耗在了Excel单元格的读取上。让我们改进一下,利用DataRow.ItemArray:public void DataTableToExcel(DataTable dt){ int colCount = dt.Columns.Count;for (int i = 0; i <dt.Rows.Count; i++){ excelSheet.get_Range(excelSheet.Cells[i+1,1], excelSheet.Cells[i+1, colCount]).Value2 = dt.Rows[i].ItemArray; }
}这就有了很大进步,效率与数据列的多少已经无关了,对于这个改进我在网上还没有看到,为此我还曾沾沾自喜,但是这个方法的效率依然不高,尤其是灵活性不够。以上效率的损失主要是每导出一条记录都要与Excel交互一次,如果我们把数据准备好一次性写入Excel是否效率更快?看如下程序:public void DataTableToExcel(DataTable dt){ int rowCount = dt.Rows.Count;int colCount = dt.Columns.Count;object[,] dataArray = new object[rowCount,colCount];for (int i = 0; i <rowCount; i++){for (int j=0;j<colCount;j++){ dataArray[i, j] = dt.Rows[i][j]; }}excelSheet.get_Range("A1", excelSheet.Cells[rowCount, colCount]).Value2 = dataArray;}