使用 `Microsoft.Office.Interop.Excel` (COM) 操作 Excel 雖然直觀,但缺點明顯:需安裝 Office、啟動進程慢、記憶體佔用高、無法在無介面伺服器運行。追求高效能、無依賴的生產環境,主流方案有二:
string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'";
using (var conn = new OleDbConnection(connStr)) {
conn.Open();
// 讀取整張工作表
var dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheet = dt.Rows[0]["TABLE_NAME"].ToString();
// 依儲存格座標更新:將 A1 視為 (0,0),需自行換算
string sql = "UPDATE [" + sheet + "] SET F2 = '新值' WHERE F1 = '鍵值'";
new OleDbCommand(sql, conn).ExecuteNonQuery();
}
優點: 無 Office 依賴、速度快、支援 SQL 語法。
缺點: 僅支援「列」導向操作,難以直接用「行號、列號」定位單一儲存格;需安裝 Access Database Engine。
// EPPlus 範例
using (var pkg = new ExcelPackage(new FileInfo("test.xlsx"))) {
var ws = pkg.Workbook.Worksheets[0];
ws.Cells[3, 5].Value = "精準寫入第3行第5列"; // 1-based 索引
pkg.Save();
}
優點: 物件模型豐富、支援樣式/公式/圖表、純 Managed Code、跨平台 (Core/5+/6/7/8)。
缺點: 超大檔 (百萬列+) 記憶體壓力大,可改用 NPOI SXSSF 流式寫入。
| 場景 | 推薦 |
|---|---|
| 簡單批量導入導出、資料量 < 10 萬列 | EPPlus / ClosedXML |
| 需在 Linux 容器運行、無 Office 環境 | NPOI / ClosedXML |
| 極大檔案、串流寫入、低記憶體 | NPOI SXSSF |
| 舊專案維護、僅需簡單 UPDATE/INSERT | OLEDB (配合 ACE Driver) |
拋棄 COM,擁抱現代 .NET Excel 生態,讀寫效能提升 10 倍以上,部署零負擔。