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的命名看起來很不舒服,有點不是很規範。不知他們為什麼要這樣命名。