| 方案 | 優點 | 缺點 |
| 水晶報表/ActiveReports | 功能強、設計器完善 | 授權費高、學習曲線陡、格子報表靈活性差 |
| RDLC (VS2005+) | 免費、集成 VS | 邏輯複雜時編碼困難、需 VS2005+ |
| Excel 自動化 | 佈局極靈活、用戶熟悉、代碼精確控制 | 需安裝 Excel、COM 互操作性能一般、服務端無 UI 環境需注意 |
核心代碼:模板填充
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
public void ExportReport()
{
Excel.Application excel = null;
Excel._Workbook wb = null;
Excel._Worksheet ws = null;
Excel.Range rng = null;
object opt = Missing.Value;
try
{
excel = new Excel.Application();
wb = excel.Workbooks.Open(@"z:\Book1.xls", opt, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt, opt);
ws = (Excel._Worksheet)wb.Worksheets[1];
string[] data = { "Cure", "26", "dahuzizyd.cnblogs.com", "漢", "按時?放..." };
rng = ws.get_Range("B1", opt); rng.Value = data[0];
rng = ws.get_Range("E1", opt); rng.Value = data[1];
rng = ws.get_Range("B2", opt); rng.Value = data[2];
rng = ws.get_Range("E2", opt); rng.Value = data[3];
rng = ws.get_Range("A3", opt); rng.Value = data[4];
excel.DisplayAlerts = false;
wb.SaveAs(@"z:\Book2.xls", opt, opt, opt, opt, opt,
Excel.XlSaveAsAccessMode.xlNoChange, opt, opt, opt, opt);
}
catch (Exception ex) { MessageBox.Show(ex.Message); }
finally
{
wb?.Close(opt, opt, opt);
excel?.Workbooks.Close();
excel?.Quit();
Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(excel);
wb = null; excel = null;
GC.Collect(); GC.WaitForPendingFinalizers();
}
}
關鍵最佳實踐
- 釋放 COM 對象:
Marshal.ReleaseComObject + GC.Collect,否則 Excel 進程殘留。
- DisplayAlerts = false:禁止彈窗阻塞自動化流程。
- 使用 Missing.Value:可選參數佔位,避免 Type.Missing 重複代碼。
- 錯誤處理:文件鎖定、路徑不存在、版本不兼容均需捕獲。
痛點與改進方向
- 硬編碼單元格地址("B1")維護困難 → 下一篇引入「標記單元格」約定($+字段名)實現通用綁定。
- 大量數據逐單元格寫入極慢 → 批量寫入
Range.Value = object[,]。
- 服務端無 Excel → 考慮
EPPlus、NPOI、ClosedXML 純 .NET 庫。
- 上一篇文章: C# 內存管理深度解析(一):棧與堆核心概念、類型分類
- 下一篇文章: C# 操作 Excel 生成報表(二):操作現有圖表並導出
Copyright ©
程式碼之家 All Rights Reserved