Excel高速导出
之前也写过很多次DataTable导出到Excel,用的基本上都是直接写单元格的形式:workSheet.Cells[x, y]=dt.Rows[i][j].ToString();
在数据量小的时候这种方法看不出问题,但数据量大的时候,弊端就很明显了。
我的数据量在2800行左右,这种导出方法用时在30秒左右。
经过一番折腾,终于找到了一个可以高速导出的方法。
关键部分就是:range.Value2 = objData;//objData是一个二维数组
代码
// 创建Excel对象
Excel.Application xlApp = new Excel.ApplicationClass();
if (xlApp == null)
{
strMsg="Excel无法启动";
return false;
}
// 创建Excel工作薄
Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
Excel.Range range =null;
// 列索引,行索引,总列数,总行数
int colIndex = 0;
int RowIndex = 0;
int colCount = tmpDataTable.Columns.Count;
int RowCount = tmpDataTable.Rows.Count;
// 创建缓存数据
object[,] objData = new object[RowCount + 1, colCount];
// 获取列标题
foreach (DataColumn dc in tmpDataTable.Columns)
{
objData[RowIndex, colIndex++] = dc.ColumnName;
}
// 获取数据
for (RowIndex = 1; RowIndex < RowCount; RowIndex++)
{
for (colIndex = 0; colIndex < colCount; colIndex++)
{
objData[RowIndex, colIndex] = tmpDataTable.Rows[RowIndex - 1][colIndex].ToString();
}
}
// 写入Excel
range= xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[RowCount, colCount]);
range.Value2 = objData;
// 保存
try
{
xlBook.Saved = true;
xlBook.SaveCopyAs(strFileName);
xlApp.Quit();
System.Diagnostics.Process.Start("Excel.exe", strFileName);
}
catch(Exception ee)
{
strMsg=ee.Message;
return false;
}
finally
{
xlApp = null;
GC.Collect();
}
Excel.Application xlApp = new Excel.ApplicationClass();
if (xlApp == null)
{
strMsg="Excel无法启动";
return false;
}
// 创建Excel工作薄
Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
Excel.Range range =null;
// 列索引,行索引,总列数,总行数
int colIndex = 0;
int RowIndex = 0;
int colCount = tmpDataTable.Columns.Count;
int RowCount = tmpDataTable.Rows.Count;
// 创建缓存数据
object[,] objData = new object[RowCount + 1, colCount];
// 获取列标题
foreach (DataColumn dc in tmpDataTable.Columns)
{
objData[RowIndex, colIndex++] = dc.ColumnName;
}
// 获取数据
for (RowIndex = 1; RowIndex < RowCount; RowIndex++)
{
for (colIndex = 0; colIndex < colCount; colIndex++)
{
objData[RowIndex, colIndex] = tmpDataTable.Rows[RowIndex - 1][colIndex].ToString();
}
}
// 写入Excel
range= xlSheet.get_Range(xlApp.Cells[1, 1], xlApp.Cells[RowCount, colCount]);
range.Value2 = objData;
// 保存
try
{
xlBook.Saved = true;
xlBook.SaveCopyAs(strFileName);
xlApp.Quit();
System.Diagnostics.Process.Start("Excel.exe", strFileName);
}
catch(Exception ee)
{
strMsg=ee.Message;
return false;
}
finally
{
xlApp = null;
GC.Collect();
}
(这个方法是从CSDN上一位朋友共享的资料中得到的,具体地址没记住,还请作者见谅。)
采用这种方式再次导出,时间不到1秒。


浙公网安备 33010602011771号