在 C# 中操作 Excel 時,逐儲存格寫入(Cells[i, j] = value)速度極慢,尤其資料量大時明顯拖慢效能。本文介紹利用 Range.Value 屬性搭配二維陣列,一次將大量資料寫入 Excel 的高效技巧。
Excel.Application app = new Excel.ApplicationClass();
if (app == null)
{
MessageBox.Show("Excel 無法啟動");
return;
}
app.Visible = true;
Excel.Workbooks wbs = app.Workbooks;
Excel.Workbook wb = wbs.Add(Missing.Value);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
// 1. 寫入標題列 (A1~H1)
Excel.Range headerRange = ws.get_Range("A1", "H1");
object[] headers = { "標題1", "標題2", "標題3", "標題4", "標題5", "標題6", "標題7", "標題8" };
headerRange.Value = headers;
// 2. 批次寫入資料列 (從 A2 開始)
if (listView.Items.Count > 0)
{
Excel.Range dataStart = ws.get_Range("A2", Missing.Value);
// 建立二維陣列 [列數, 欄數]
object[,] dataArray = new object[listView.Items.Count, 8];
foreach (ListViewItem item in listView.Items)
{
dataArray[item.Index, 0] = item.Text;
dataArray[item.Index, 1] = item.SubItems[1].Text;
dataArray[item.Index, 2] = item.SubItems[2].Text;
dataArray[item.Index, 3] = item.SubItems[3].Text;
dataArray[item.Index, 4] = item.SubItems[4].Text;
dataArray[item.Index, 5] = item.SubItems[5].Text;
dataArray[item.Index, 6] = item.SubItems[6].Text;
dataArray[item.Index, 7] = item.SubItems[7].Text;
}
// 調整 Range 大小以符合陣列維度
Excel.Range dataRange = dataStart.get_Resize(listView.Items.Count, 8);
dataRange.Value = dataArray;
// 自動調整欄寬
dataRange.EntireColumn.AutoFit();
}
app = null; // 釋放 COM 物件參考
Range.Value 可直接指派一維陣列(單列/單欄)或二維陣列(多列多欄),Excel 會一次性填入對應區域,避免跨進程呼叫的效能損耗。
以起始儲存格 A2 為基準,呼叫 get_Resize(列數, 欄數) 取得與資料陣列維度完全一致的 Range,再一次指派 Value。
操作完成後將 app 設為 null,配合 GC 釋放 Excel 進程,避免殘留 EXCEL.EXE。
| 寫入方式 | 1000 列 x 8 欄 耗時 (約) |
|---|---|
| 逐儲存格 | 30~60 秒 |
| Range + 陣列批次 | 0.5~1 秒 |
批次寫入效能提升 50~100 倍,極適合報表匯出、大量資料轉存等情境。
[列, 欄],且基底為 0。object,Excel 會自動轉換。善用 Range.Value 搭配陣列,是 C# 操作 Excel 最高效的寫入模式。只需幾行代碼,即可將記憶體中的資料結構瞬間傾印至工作表,大幅縮短匯出等待時間。