如何提高C#中将数据导入到Excel的性能
C#中将表数据导入Excel一般都是将数据逐个Cell的插入到Excel里。如下(只是代码片断):
…
Object missing = Missing.Value;
Excel.Application myexcel = new Excel.Application(); //新建EXCEL实例
myexcel.Application.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); //打开filename表
myexcel.Visible = false;
Excel.Workbook myworkbook = myexcel.Workbooks[1];
Excel.Worksheet myworksheet = (Excel.Worksheet)myexcel.Worksheets[1];//声明一页的实例
…
for (int i = 0; i < rownum; i++)
{
GridViewRow gvr = mydata.Rows[i];
for (int j = 0; j < colnum; j++)
{
myexcel.Cells[i + 8, j + 1] = "'" + gvr.Cells[j].Text.Replace(" ","");
}
}
…
但是,由于对Excel的Cell赋值效率很低(因为每对Cell赋一次值都回导致调用一次Excel COM+组件的接口),所有如果数据多起来的话,对Excel COM+组件的访问就会很频繁,从而导致程序运行效率极其低下。
要解决这个问题主要是减少对Cell的访问次数。查阅Excel的API可知,可以通过对它的一个属性Value2赋值(数组)来实现和上述代码一样的作用。这就可以避免了频繁访问Cell而导致的性能急剧下降。
改进后的代码如下:
…
Array arr = Array.CreateInstance(typeof(String), rownum, colnum);
for (i = 0; i < rownum; i++)
{
for (j = 0; j < colnum; j++)
{
arr.SetValue(mydata.Rows[i].Cells[j].Text.Replace(" ", ""), i, j);
}
}
Excel.Range range = myworksheet.get_Range(myworksheet.Cells[5, 1], myworksheet.Cells[rownum + 4, colnum]);
range.Value2 = arr;
…
BTW:老是觉得Excel的属性Value2的命名看起来很不舒服,有点不是很规范。不知他们为什么要这样命名。