優化後從 DataTable 匯入 60,000 筆資料,耗時不到兩分鐘。
public void WriteDataToSpreadsheet(SpreadsheetClass spreadsheet, DataTable dt,
int startRow, int startCol, bool withCaption, int startRecord, int limited, int[] textColumns)
{
Worksheet sheet = spreadsheet.ActiveSheet;
int rowCount = 0, totalRow = 0, maxRow = 65535;
int row = startRow, col = startCol;
if (withCaption)
{
foreach (DataColumn dc in dt.Columns) { sheet.Cells[row, col] = dc.Caption; col++; }
row++; totalRow++; col = startCol;
}
// 建立欄位名稱陣列 (A..Z, AA..ZZ)
string[] A2Z = { "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z" };
var A2ZZ = new List(A2Z);
foreach (var c1 in A2Z) foreach (var c2 in A2Z) A2ZZ.Add(c1 + c2);
string lastColName = A2ZZ[dt.Columns.Count - 1];
var dataList = new List
object[,] 二維陣列清單,避免逐儲存格寫入。Range.set_Value 一次將整列陣列寫入工作表區塊,大幅減少 COM 呼叫開銷。