首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 操作 Word 2002 與 Excel 2002 完全指南:COM 互操作實戰

     編輯:關於C語言

前言

Office XP (2002) 通過 COM 接口暴露強大功能。C# 配合 .NET 的 COM 互操作,能像 VB6 一樣輕鬆調用 Office 對象模型。本文詳解準備 PIA、編譯運行、核心編程模式與常見坑點。

環境準備

  • OS: Windows XP / 2000 + SP
  • Office XP + SP
  • .NET Framework + SP
  • Office XP Primary Interop Assemblies (PIA)
  • Visual Studio .NET

核心概念:PIA 與 ILDASM

PIA 讓 C# 編譯器識別 Office COM 類型。使用 ILDASM 可檢視 Microsoft.Office.Interop.Word.dll 中的類型結構:

  • 命名空間:Microsoft.Office.Interop.Word
  • 核心類:Application 實現 ApplicationEvents2_Event 接口

編譯與引用 PIA

csc /r:"C:\Office XP PIAs\Microsoft.Office.Interop.Word.dll" example1.cs

運行時若找不到 PIA,會拋出 FileNotFoundException 或 TypeInitializationException。

六大實戰範例精要

範例 1:啟動與關閉 Word

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)。

範例 2:創建新文檔並保存

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

範例 3:打開文檔、選取範圍、剪切


_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 傳遞。

範例 4:事件處理


// 定義委託實例
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。

範例 5:Office 助手動畫

引用 Office.dll 額外 PIA,演示 Assistant 動畫。

範例 6:Excel 索引屬性與默認屬性


// 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 但文檔寫 VariantVariant 自動封送為 .NET Object正常傳遞 object,值類型會自動裝箱
SaveAs/Open 簽名在版本間不同Office XP 新增參數用 #if OfficeXP 區分調用 SaveAs2000/Open2000
事件處理程序參數需 refVB 默認 ByRef,C# 默認 ByVal在委託簽名和處理函數中加 ref

總結

C# COM 互操作讓現有 Office 自動化代碼資產得以重用。掌握 PIA 引用、可選參數處理、事件訂閱、索引屬性訪問器等核心模式,即可高效開發 Office 集成方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved