| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| **Interop (COM 自動化)** | 功能完整 (100% Word 能力)、支援複雜排版/列印/轉 PDF、原生事件模型 | 需安裝 Word、不可在伺服器端無人值守運行 (EULA 限制)、效能差、版本相容性問題、記憶體洩漏風險 | 桌面端工具、批次列印、需精確還原 Word 排版 |
| **Open XML SDK (Office Open XML)** | 無需安裝 Office、高效能、伺服器端安全、開源、跨平台 | 學習曲線陡峭、需理解 OOXML 結構、複雜排版轉換需自行實作 | 伺服器端報表生成、大量文件處理、雲端服務 |
| **第三方庫 (Aspose.Words, DocX, NPOI)** | API 友好、無 Office 依賴、功能豐富 | 商業授權成本 (Aspose)、部分功能不如 Interop 完整 | 商業專案、需平衡開發效率與部署限制 |
using Word = Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;
public void GenerateReport() {
Word.Application app = null;
Word.Document doc = null;
try {
app = new Word.Application();
app.Visible = false; // 後台運行
app.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
doc = app.Documents.Add(Template: @"C:\Templates\Report.dotx"); // 或 Add() 新建
// 書籤替換
if (doc.Bookmarks.Exists("Title"))
doc.Bookmarks["Title"].Range.Text = "年度報告";
// 表格填充
Word.Table table = doc.Tables[1];
table.Cell(2, 2).Range.Text = "數據值";
// 另存為 PDF
doc.SaveAs2(@"C:\Output\Report.pdf", Word.WdSaveFormat.wdFormatPDF);
}
catch (Exception ex) { /* 日誌記錄 */ }
finally {
// 嚴格釋放 COM 物件 (逆序)
if (doc != null) { doc.Close(false); Marshal.ReleaseComObject(doc); }
if (app != null) { app.Quit(false); Marshal.ReleaseComObject(app); }
GC.Collect(); GC.WaitForPendingFinalizers(); // 強制清理
}
}
原答案「直接查 MSDN、用宏錄製參考代碼」是**最高效、最權威**的學習路徑。Interop 雖強大,但請嚴守「桌面端用、嚴格釋放 COM、伺服器端禁用」三大鐵律。