Office XP (2002) 通過 COM 接口暴露強大功能。C# 配合 .NET 的 COM 互操作,能像 VB6 一樣輕鬆調用 Office 對象模型。本文詳解準備 PIA、編譯運行、核心編程模式與常見坑點。
PIA 讓 C# 編譯器識別 Office COM 類型。使用 ILDASM 可檢視 Microsoft.Office.Interop.Word.dll 中的類型結構:
Microsoft.Office.Interop.WordApplication 實現 ApplicationEvents2_Event 接口csc /r:"C:\Office XP PIAs\Microsoft.Office.Interop.Word.dll" example1.cs
運行時若找不到 PIA,會拋出 FileNotFoundException 或 TypeInitializationException。
Application app = new Application();
// 關閉需傳三個 ref object 參數
object saveChanges = Missing.Value;
object originalFormat = Missing.Value;
object routeDocument = Missing.Value;
app.Quit(ref saveChanges, ref originalFormat, ref routeDocument);
關鍵點:C# 無可選參數,必須用 Missing.Value 佔位;所有參數必須 ref 傳遞(VB 默認 ByRef)。
object visible = true;
_Document doc = app.Documents.Add(ref Missing.Value, ref Missing.Value, ref Missing.Value, ref visible);
doc.Words.First.InsertBefore("Hello Word!");
// Office XP 用 SaveAs2000,Office 2000 用 SaveAs
doc.SaveAs2000(ref fileName, ...); // 11 個 ref 參數
編譯需定義符號:/d:OfficeXP
_Document doc = app.Documents.Open2000(ref fileName, ...);
object first = 0, last = doc.Characters.Count;
Range r = doc.Range(ref first, ref last);
r.Select();
Thread.Sleep(2000);
r.Cut(); // 或用 Delete
注意:Range 參數必須顯式封裝為 object,否則隱式轉換會產生右值無法 ref 傳遞。
// 定義委託實例
ApplicationEvents3_DocumentOpenEventHandler myOpenDoc = new ApplicationEvents3_DocumentOpenEventHandler(MyOpenEventHandler);
ApplicationEvents3_DocumentChangeEventHandler myChangeDoc = new ApplicationEvents3_DocumentChangeEventHandler(DocChange);
// 訂閱事件
app.DocumentOpen += myOpenDoc;
app.DocumentChange += myChangeDoc;
// 退出前取消訂閱
app.DocumentChange -= myChangeDoc;
用 ILDASM 查看事件處理程序簽名(Invoke 方法),再對照 VB 文檔確定參數含義。C# 需用 ref 對應 VB 的 ByRef。
引用 Office.dll 額外 PIA,演示 Assistant 動畫。
// C# 無索引屬性語法,必須呼叫訪問器
Range wksRange = wks.get_Range("A2", "D2"); // 而非 wks.Range["A2","D2"]
// 設置屬性
wks.set_Range("A2", "D2", myRange);
// 默認屬性 Item 在 Excel 中映射為 get__Default / set__Default
_Worksheet wks2 = (_Worksheet)wkb.Worksheets["Market Share!"]; // 索引器語法生效
| 問題 | 原因 | 解決 |
|---|---|---|
| 參數類型為 object 但文檔寫 Variant | Variant 自動封送為 .NET Object | 正常傳遞 object,值類型會自動裝箱 |
| SaveAs/Open 簽名在版本間不同 | Office XP 新增參數 | 用 #if OfficeXP 區分調用 SaveAs2000/Open2000 |
| 事件處理程序參數需 ref | VB 默認 ByRef,C# 默認 ByVal | 在委託簽名和處理函數中加 ref |
C# COM 互操作讓現有 Office 自動化代碼資產得以重用。掌握 PIA 引用、可選參數處理、事件訂閱、索引屬性訪問器等核心模式,即可高效開發 Office 集成方案。