C#写入excel数据的效率问题
利用C#(windows)实现将datatable中数据写入excel文件,我看网上有许多方法,参考了其中一部分,我采用了将datatable中的数据依次写入到xls的cell中的方法,具体代码如下:
-----------------------------------------
private void DTtoExcel(DataTable dt,String fname)
{
Excel.Application excel = new Excel.Application();
int rowIndex = 1;
int colIndex = 0;
Excel.Workbook xbook = excel.Workbooks.Add(true);
foreach (DataColumn col in dt.Columns)
{
colIndex++;
excel.Cells[1, colIndex] = col.ColumnName;
}
foreach (DataRow row in dt.Rows)
{
rowIndex++;
colIndex = 0;
foreach (DataColumn col in dt.Columns)
{
colIndex++;
excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
}
xbook.SaveAs(fname,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
xbook = null;
excel.Quit();
excel = null;
}
------------------------------------------------------
这段代码可以实现将datatable数据写入xls,但是我觉得效率好低,对于一个2500行,20列的xls,写入要接近5分钟,我觉得有点接受不了。
我之前在C#(Web)下写过同样的一个功能,是利用HtmlTextWriter和StringWriter来实现的,对于同样一个xls,只要5秒钟左右,这二者效率不可比,我想问问在windows下能不能也通过数据流来实现写入xls?如果不能够,那有什么方法可以提高写入xls的效率呢?
------解决方案--------------------Winform 程序也可以用 Web 功能的,相应的命名空间,也可以用 HtmlTextWriter 。
------解决方案--------------------DataTable dt = GetData(); //此处会返回50000条记录的DataTable对象
string[, ] StringArray = ConvertDataTableToStringArray(dt); // 此处将DataTable中的数据导入到string二维数组中
Excel.Range StringRange = (Excel.Range)workSheet.Cells[2, 1];
StringRange = StringRange.get_Resize(dt.Rows.Count, dt.Columns.Count);
StringRange.Value2 = StringArray ;
Save(); // 保存Excel file
这样速度会快很多
楼主试试吧
------解决方案--------------------影响Excel的速度很多,常见的就是每写一个单元格,就会刷屏,所以要把它的选项关掉
但是有,可以利用Excel内置的特性,让Excel自己去处理速度的问题,所以,你先获得你的数据,
然后根据你的行列数,实例一个Range,然后,把数据一次性赋值给Range
楼上就是利用这一特性,奖数据转换为二维数组,赋给Range的Value2 属性
------解决方案--------------------楼主可以用批量写入的方法,这种方式非常快:
先把数据填充到一个二维数组,再将二维数组填充到RANGE.
示例代码:
C# code
Excel.Application xApp = new Excel.ApplicationClass();
string[,] strs = new string[9, 9];
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
strs[i, j] = Convert.ToString((i + 1) * (j + 1));
Excel.Workbook xBook = xApp.Workbooks.Add(Missing.Value);
Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Worksheets[1];
xSheet.get_Range(xSheet.Cells[1, 1], xSheet.Cells[9, 9]).Value = strs;
------解决方案--------------------
private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true; //提示是否创建(*****).xls文件
saveFileDialog.Title = "导出Excel文件到";
//进度条
progressBar1.Refresh();
progressBar1.Visible = true;