前置準備
- 安裝 Microsoft Office(含 Word)
- 專案加入參考:
Microsoft.Office.Interop.Word(COM 標籤)
- 引用命名空間:
using Word = Microsoft.Office.Interop.Word;
核心操作類別
| 類別 | 用途 |
Application | Word 應用程式實例,控制啟動、結束、可見性 |
Document | 單一 .doc/.docx 文件,提供內容編輯、儲存、列印 |
Range/Selection | 文件內容區域/選取範圍,支援文字插入、格式設定 |
Paragraphs | 段落集合,適合逐段寫入 |
完整範例:建立、寫入、開啟、修改字型、儲存
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;
namespace WordAutomationDemo
{
public partial class Form1 : Form
{
private Word.Application _app;
private Word.Document _doc;
private object _missing = Missing.Value;
public Form1() { InitializeComponent(); }
private void btnCreate_Click(object sender, EventArgs e)
{
string path = Path.Combine(Application.StartupPath, "test.doc");
if (File.Exists(path)) File.Delete(path);
_app = new Word.Application();
_doc = _app.Documents.Add(ref _missing, ref _missing, ref _missing, ref _missing);
// 寫入內容
_doc.Paragraphs.Last.Range.Text = "你好\r\n";
_doc.Paragraphs.Last.Range.Text = "這是測試程式";
// 儲存並關閉
_doc.SaveAs2(ref path, ref _missing, ref _missing, ref _missing,
ref _missing, ref _missing, ref _missing, ref _missing,
ref _missing, ref _missing, ref _missing, ref _missing,
ref _missing, ref _missing, ref _missing, ref _missing);
_doc.Close(ref _missing, ref _missing, ref _missing);
_app.Quit(ref _missing, ref _missing, ref _missing);
rtbLog.Text = path + "\r\n建立成功";
}
private void btnOpenModify_Click(object sender, EventArgs e)
{
if (fontDialog1.ShowDialog() != DialogResult.OK) return;
object path = @"D:\asp.docx";
_app = new Word.Application();
_doc = _app.Documents.Open(ref path, ref _missing, ref _missing, ref _missing,
ref _missing, ref _missing, ref _missing, ref _missing,
ref _missing, ref _missing, ref _missing, ref _missing,
ref _missing, ref _missing, ref _missing, ref _missing);
_doc.Content.Font.Size = fontDialog1.Font.Size;
_doc.Content.Font.Name = fontDialog1.Font.Name;
_doc.Save();
rtbLog.Text = _doc.Content.Text;
_doc.Close(ref _missing, ref _missing, ref _missing);
_app.Quit(ref _missing, ref _missing, ref _missing);
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
// 確保釋放 COM 物件
if (_doc != null) Marshal.ReleaseComObject(_doc);
if (_app != null) Marshal.ReleaseComObject(_app);
base.OnFormClosing(e);
}
}
}
重要最佳實務
- 一定要釋放 COM 物件:使用
Marshal.ReleaseComObject,否則 Word 進程會殘留在背景。
- 避免在迴圈中逐字操作:改用
Range 批次寫入,效能差異可達百倍。
- 伺服器端自動化風險:Microsoft 不建議在無人值守的伺服器上使用 Interop。生產環境請改用 Open XML SDK(
DocumentFormat.OpenXml)或第三方庫(NPOI、Aspose.Words)。
- 選用參數:C# 4.0+ 可用
ref missing 簡化呼叫;舊版需逐一傳遞 ref missing。