ws.Cells[i, j] = value 每次跨 COM 邊界,萬筆資料需數分鐘。
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(Type.Missing);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
// 1. 寫入標題列 (一維陣列)
Excel.Range headerRange = ws.get_Range("A1", "H1");
object[] headers = { "標題1", "標題2", "標題3", "標題4", "標題5", "標題6", "標題7", "標題8" };
headerRange.Value = headers;
// 2. 寫入資料區 (二維陣列)
if (listView.Items.Count > 0)
{
Excel.Range dataStart = ws.get_Range("A2", Type.Missing);
object[,] data = new object[listView.Items.Count, 8];
foreach (ListViewItem lvi in listView.Items)
{
data[lvi.Index, 0] = lvi.Text;
data[lvi.Index, 1] = lvi.SubItems[1].Text;
data[lvi.Index, 2] = lvi.SubItems[2].Text;
data[lvi.Index, 3] = lvi.SubItems[3].Text;
data[lvi.Index, 4] = lvi.SubItems[4].Text;
data[lvi.Index, 5] = lvi.SubItems[5].Text;
data[lvi.Index, 6] = lvi.SubItems[6].Text;
data[lvi.Index, 7] = lvi.SubItems[7].Text;
}
// 擴展範圍至資料大小
Excel.Range dataRange = dataStart.get_Resize(listView.Items.Count, 8);
dataRange.Value = data; // 一次寫入!
// 自動調整欄寬
dataRange.EntireColumn.AutoFit();
}
app = null; // 釋放 COM 參考
| 技巧 | 效果 |
|---|---|
Range.Value = object[] | 一維陣列 → 橫向寫入一列 |
Range.Value = object[,] | 二維陣列 → 區塊寫入 (Row, Col) |
get_Resize(rows, cols) | 動態調整 Range 大小以符合陣列維度 |
EntireColumn.AutoFit() | 一次調整整欄寬度 |
app.ScreenUpdating = false、app.Calculation = XlCalculation.xlCalculationManualapp.Quit()、釋放所有 COM 物件 (Marshal.ReleaseComObject)ClosedXML、EPPlus 純 .NET 套件,無需安裝 ExcelRange.Value = 陣列 是 C# 操作 Excel 最高效的寫入模式。將資料在記憶體組好陣列,一次跨 COM 邊界,效能指數級提升。