需要將資料庫查詢結果匯出至 Excel,且必須符合特定的版面格式(如合併儲存格、標題樣式、固定欄寬、公式等),而非單純的資料表匯出。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| NPOI / EPPlus (推薦) | 無需安裝 Office;效能好;支援 .xls/.xlsx;功能豐富(樣式、公式、圖表) | 需學習 API;複雜版面程式碼較多 | 伺服器端批次匯出、高效能需求、無 Office 環境 |
| Excel Interop (COM) | 完整控制 Excel 所有功能;可直接操作現有檔案 | 需安裝 Office;效能差;佔用大量記憶體;伺服器端不建議使用 | 客戶端工具、需即時開啟 Excel 互動、極複雜格式 |
| VBA 巨集 | 在 Excel 內部執行,速度快 | 需啟用巨集;維護困難;安全性限制 | 固定模板、內部人員使用、邏輯極複雜 |
| HTML/CSV 偽裝 .xls | 實作最簡單 | 無法控制格式、樣式、公式;Excel 開啟會警告 | 極簡單資料表、無格式要求 |
針對「按格式輸出」需求,最穩健的做法是預先製作好 Excel 模板檔,程式只負責「填資料」。
// 載入模板
using (var fs = new FileStream("Template.xlsx", FileMode.Open, FileAccess.Read))
{
var workbook = new XSSFWorkbook(fs);
var sheet = workbook.GetSheet("Sheet1");
// 寫入標題列
var headerRow = sheet.GetRow(0);
headerRow.GetCell(0).SetCellValue("匯出時間:" + DateTime.Now);
// 寫入資料列 (假設從第 2 列開始)
int rowIndex = 1;
foreach (var item in dataList)
{
var row = sheet.CreateRow(rowIndex++);
row.CreateCell(0).SetCellValue(item.Id);
row.CreateCell(1).SetCellValue(item.Name);
row.CreateCell(2).SetCellValue(item.Amount);
}
// 強制重新計算公式
workbook.GetCreationHelper().CreateFormulaEvaluator().EvaluateAll();
// 輸出
using (var outFs = new FileStream("Output.xlsx", FileMode.Create))
{
workbook.Write(outFs);
}
}
不要嘗試用程式碼從零建構複雜 Excel 版面。「模板 + 程式填資料」是業界標準作法,兼顧維護性、效能與格式精確度。NPOI (免費開源) 或 EPPlus (功能更強、商業授權) 是 .NET 伺服器端匯出 Excel 的首選。