使用 microsoft visual c# 進(jìn)行 microsoft word 2002 和 excel 2002 編程
kerry loynd 和 siew-moi khor
microsoft corporation
2002年10月
適用于:
microsoft® office xp
microsoft visual c#™
摘要:了解 microsoft c# 和大型復(fù)雜的 com 服務(wù)器之間的 com 互操作性。本文介紹了如何準(zhǔn)備 office xp com 對(duì)象以及如何在 c# 程序中使用這些對(duì)象,同時(shí)還提供了一些提示,幫助您理解為何某些操作必須通過特定方法才能實(shí)現(xiàn)。
在 msdn downloads(英文)下載或?yàn)g覽 odc_offcs.exe。目錄
- 簡(jiǎn)介
- 系統(tǒng)要求
- .net 的一些快速入門知識(shí)
- 使用 office xp 主互操作程序集
- 代碼演練
- 示例 1:?jiǎn)?dòng) word application 對(duì)象
- 示例 2:創(chuàng)建新 word 文檔
- 示例 3:打開現(xiàn)有的 word 文檔
- 示例 4:使用 word 公開的事件
- 示例 5:動(dòng)畫顯示 office 助手
- 示例 6:默認(rèn)屬性和索引屬性
- 小結(jié)
簡(jiǎn)介
microsoft® office xp 最強(qiáng)大的功能之一,就是其組件(例如 microsoft excel 2002 和 microsoft word 2002)以組件對(duì)象模型 (com) 接口的形式公開其功能。通過 microsoft visual basic® 6.0 訪問這些 com 接口要相對(duì)容易些,但要通過 c 或 c++ 來使用這些接口和公共類,則會(huì)比較困難。然而,擁有托管擴(kuò)展的 microsoft .net 和 microsoft c#™ 或 microsoft visual c++® 卻能夠象 visual basic 6.0 一樣,輕松地使用 office xp 公開的 com 對(duì)象。
本文假定您要進(jìn)行 office xp 編程。盡管本文通篇提供了 msdn® 文檔的超鏈接,但要掌握本文介紹的內(nèi)容,您應(yīng)該已經(jīng)熟悉或者能夠訪問 office xp 編程文檔。
該文檔介紹了 office xp 提供的接口和公共類及其使用方法。文檔內(nèi)容以 visual basic 編程語言形式表達(dá),因此您需要在頭腦中對(duì)其中的方法和事件簽名進(jìn)行轉(zhuǎn)換。本文將介紹如何進(jìn)行這種轉(zhuǎn)換,如何準(zhǔn)備 office xp 的 com 對(duì)象,以及如何在 c# 程序中使用這些 com 對(duì)象。最后,本文還提供了一些提示,幫助您理解為何某些操作必須通過特定方法才能實(shí)現(xiàn)。通過此信息,您就應(yīng)能夠利用其他使用 c# 的 com 服務(wù)器。系統(tǒng)要求
要運(yùn)行示例,計(jì)算機(jī)上需要安裝以下軟件: - microsoft windows® xp 或 microsoft windows 2000 及相關(guān)的 service pack (sp)
- microsoft office xp 及相關(guān)的 sp
- microsoft .net framework(英文)及相關(guān)的 sp
- microsoft office xp primary interop assemblies (pia)(英文)
- microsoft visual studio® .net
.net 的一些快速入門知識(shí)
.net 技術(shù)引入了程序集的概念,并將其作為基本的可執(zhí)行單元。程序集可以是可執(zhí)行文件 (.exe) 或動(dòng)態(tài)鏈接庫 (.dll),并可以包含多個(gè)文件。程序集包含有關(guān)運(yùn)行程序所需的代碼、類型和資源的全部信息。
要使用 office xp 公開的 com 對(duì)象,需要使用主互操作程序集 (pia),這樣 c# 編譯器就能夠找到 office xp 公開的接口和公共類。
有關(guān)互操作程序集或 pia 方面的內(nèi)容,本文將不做詳細(xì)介紹。有關(guān) pia 的詳細(xì)信息,請(qǐng)參閱 primary interop assemblies (pia)(英文)。本文的使用 office xp 主互操作程序集一節(jié)提供了 office xp pia 的下載地址。
了解一下已公開的類型信息通常會(huì)給您一些啟示。microsoft visual studio® .net 提供了一個(gè)稱作 ildasm 的工具,用于列出封裝在程序集中的類型信息。圖 1 是 ildasm 顯示 word 2002 主互操作性程序集信息的部分屏幕快照。注意:要打開 ildasm 工具,請(qǐng)單擊“開始”,指向“程序”,指向“microsoft visual studio .net”,然后指向 visual studio .net tools(visual studio .net 工具)并單擊 visual studio .net command prompt(visual studio .net 命令提示)。在 visual studio .net command prompt(visual studio .net 命令提示)窗口中,鍵入 ildasm。ildasm 窗口隨后打開。要查看某一特定互操作程序集或 pia 的類型信息,在 file(文件)菜單中,單擊 open(打開)。瀏覽到互操作程序集或 pia 的所在位置,選擇要查看的互操作程序集或 pia 并單擊 open(打開)。

圖 1:使用 ildasm 工具查看互操作程序集的類型信息
如圖 1 所示,程序集位于 microsoft.office.interop.word.dll 中,而接口和公共類則封裝在 microsoft.office.interop.word 命名空間中。application 公共類已經(jīng)展開,這樣就可以看到,它擴(kuò)展(按照 c++ 和 c# 用語,為派生)了 application,并且在 word 中實(shí)現(xiàn)了 applicationevents2_event 接口。所有這些內(nèi)容都將在本文后續(xù)部分進(jìn)行詳細(xì)討論。使用 office xp 主互操作程序集
在運(yùn)行本文包含的示例之前,應(yīng)該在計(jì)算機(jī)上安裝 microsoft office xp primary interop assemblies (pias)(英文)。安裝完 pia 后必須將其置于編譯器和已完成程序可以訪問的位置。有關(guān)詳細(xì)信息,請(qǐng)參閱 office xp pia 下載文檔中包含的自述文件和“.net framework developer's guide”(要閱讀它,請(qǐng)單擊“開始”,指向“程序”,然后指向 microsoft .net framework sdk 并單擊 documentation [文檔])中的“assembly location”一文。
本文出于演示目的,將 office xp pia 解壓縮到以下文件夾:c:/office xp pias/。然后將其安裝到全局程序集緩存 (gac) 并進(jìn)行注冊(cè)(有關(guān)該操作的詳細(xì)信息,請(qǐng)參閱 microsoft office xp primary interop assemblies (pia) [英文] 的自述文件)。
可通過在命令行鍵入 c# 編譯器的可執(zhí)行文件名稱 (csc.exe) 來調(diào)用此編譯器。安裝并注冊(cè) pia 后,便可使用 /r 選項(xiàng),象引用其他任何程序集一樣在 csc 命令行上對(duì)其進(jìn)行引用。如果 pia 的位置無法訪問,程序?qū)⒃谶\(yùn)行時(shí)失敗,并生成一個(gè) system.io.filenotfoundexception 或 system.typeinitializationexception 類型的異常,告知哪個(gè)程序集無法加載。
接下來在“如何編譯和運(yùn)行 example1.cs”一節(jié)中,將會(huì)介紹如何使用命令行生成 c# 程序和引用 pia。
本文包含的示例使用三個(gè) office xp pia: - microsoft.office.interop.word.dll
- office.dll
- microsoft.office.interop.excel.dll
代碼演練
演示代碼示例之前,首先應(yīng)下載 odc_offcs.exe 文件并將示例程序解壓縮到 c:/csofficesamples 或您選擇的目錄中。為便于引用,在下面的所有示例中,都假定示例程序位于 c:/csofficesamples 目錄中。
下載文檔包含五個(gè) word 2002 示例程序(example1.cs、example2.cs、example3.cs、example4.cs 和 example5.cs)和一個(gè) excel 2002 示例程序 (excel1.cs)。示例源文件的相應(yīng)示例生成文件(example1.exe、example2.exe 等)也一并包含在其中,供讀者使用。
所有代碼示例都作了詳細(xì)注釋。示例 1:?jiǎn)?dòng) word application 對(duì)象
第一個(gè)示例非常簡(jiǎn)單,只顯示如何啟動(dòng) word 2002,并使其在幾秒內(nèi)保持打開狀態(tài),然后再將其關(guān)閉。首先看一看 example1.cs 源文件中的主要代碼行。下面的代碼片段分配 application 對(duì)象和它的基類對(duì)象,但實(shí)際上是進(jìn)行 cocreateinstance 調(diào)用。application app = new application();
application 類的 quit 方法接受三個(gè)參數(shù):savechanges、originalformat 和 routedocument。這些可選參數(shù)可在 visual basic 代碼中省略,而 c# 中則沒有可選參數(shù);所有這三個(gè)參數(shù)都必須在調(diào)用時(shí)傳遞給 quit。在 c# 中可通過將值 missing.value 賦給每個(gè)可選變量(用于通知 quit 方法使用默認(rèn)行為)可獲得同樣效果。在本示例中,即表示“不保存文檔,保留文檔的初始格式,并且不進(jìn)行路由選擇”。object savechanges = missing.value;object originalformat = missing.value;object routedocument = missing.value;app.quit(ref savechanges, ref originalformat, ref routedocument);
請(qǐng)注意,所有這三個(gè)參數(shù)都標(biāo)有 ref 關(guān)鍵字。由于這些方法最初是用 visual basic 編寫的,而默認(rèn)情況下 visual basic 按引用來傳遞參數(shù)。因此,此處也必須按引用來傳遞參數(shù)。如何生成和運(yùn)行 example1.cs
要運(yùn)行該示例,首先要生成 examle1.cs 示例。要在 visual studio .net command prompt(visual studio .net 命令提示)窗口中生成該示例: - 轉(zhuǎn)到 c:/csofficesamples 目錄或保存該示例的任何目錄。如圖 2 所示,在命令提示后鍵入 cd c:/csofficesamples 即可。
- 然后,在圖 2 所示的命令提示后鍵入 csc /r:"c:/office xp pias/microsoft.office.interop.word.dll" example1.cs 生成 example1.cs。
(如果 office xp pia 保存在其他位置,則需要使用相應(yīng)值替換下面的“驅(qū)動(dòng)器”和“安裝路徑”:csc /r:驅(qū)動(dòng)器:/<安裝路徑>/microsoft.office.interop.word.dll example1.cs。) 注意:命令行 csc 對(duì) example1.c s 源文件進(jìn)行編譯,生成 example1.exe 可執(zhí)行文件。在本示例中,所創(chuàng)建的可執(zhí)行文件將自動(dòng)保存在 example1.cs 所在的同一文件夾中。
命令行選項(xiàng) /r 將引用 microsoft.office.interop.word.dll。如果 microsoft.office.interop.word.dll pia(或引用的任何 pia)所在位置的路徑出現(xiàn)錯(cuò)誤,程序?qū)⒃谶\(yùn)行時(shí)失敗,并生成一個(gè) system.io.filenotfoundexception 或 system.typeinitializationexception 類型的異常,告知哪個(gè)組件無法加載。
圖 2:使用命令行生成源文件 - 要運(yùn)行 example1.exe(與 example1.cs 源文件位于同一文件夾中),雙擊該程序即可。
該示例是一個(gè)非常簡(jiǎn)單的程序,并不具備任何讓人感興趣的功能,現(xiàn)在讓我們看一看示例 2。示例 2:創(chuàng)建新 word 文檔
example2.cs 與示例 1 一樣,也是使用 application 對(duì)象啟動(dòng) word 2002,然后在打開文檔的集合(該集合封裝在 application.documents 屬性中)中添加一個(gè)新文檔。第一個(gè)有意義的代碼片斷在創(chuàng)建新文檔時(shí)出現(xiàn)的:object template=missing.value;object newtemplate=missing.value;object documenttype=missing.value;object visible=true; _document doc = app.documents.add( ref template, ref newtemplate, ref documenttype, ref visible);
add 方法的所有參數(shù)都是可選的,因此必須給這些參數(shù)指定一個(gè)有意義的值或是指定 missing.value。在該示例中,由于我們不需要使用或創(chuàng)建模板,并且這只是一個(gè)純文本文檔,因此將前三個(gè)參數(shù)(template、newtemplate 和 documenttype)設(shè)置為 missing.value。由于希望此文檔在本示例中可見,因此將參數(shù) visible 設(shè)置為“true”。
您可能會(huì)對(duì)如何確定是否應(yīng)將 boolean 值賦給 visible 對(duì)象感到不解。這就是為什么訪問 word 2002 編程文檔很重要的原因所在了。如果看一看 word 2002 對(duì)象模型文檔中有關(guān) documents.add 方法的說明,您會(huì)看到以下內(nèi)容:
visible 可選的 variant。設(shè)置為 true 將在可見窗口中打開文檔。如果該值為 false,microsoft word 將打開文檔,但將文檔窗口的 visible 屬性設(shè)置為 false。默認(rèn)值為 true。注意:要查看 word 2002 visual basic 文檔中的 documents.add 方法,可以在 word 2002 的“工具”菜單中,選擇“宏”,然后單擊“visual basic 編輯器”。處于“visual basic 編輯器”的鍵盤狀態(tài)下時(shí),按 f2 鍵激活“對(duì)象瀏覽器”或按 f1 鍵查看“幫助”。然后搜索“documents”或“documents.add”。在 msdn 上也可以找到類似文檔。
這樣做回避了一個(gè)問題:為什么 pia 期望 add 方法的參數(shù)類型為 object,而 documents.add 方法文檔卻顯示類型 variant?這是因?yàn)?variant 類型被自動(dòng)封送處理為 .net object 對(duì)象類型,后者映射為 c# 的 object 類型。在本示例中,參數(shù) visible 將 boolean 值 true 封裝成 object,并將其傳遞給 documents.add() 函數(shù)。
下一行重要代碼是:doc.words.first.insertbefore
使用從 app.documents.add() 函數(shù)調(diào)用返回的文檔接口,在文檔開始處添加了一些文本。此處沒有特別之處。
下面再來看下一段比較讓人感興趣的代碼片斷,其作用是保存文檔:object filename = environment.currentdirectory+"//example2_new";#if officexpdoc.saveas2000( ref filename,#elsedoc.saveas ( ref filename,#endif ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional, ref optional);
首先要注意的一件事就是,保存文件名稱的字符串被封裝到 filename 對(duì)象中。其次,此代碼將在定義了 officexp 的情況下調(diào)用 saveas2000 方法,而在未定義 officexp 的情況下調(diào)用 saveas 方法。或許您已經(jīng)猜到,saveas 方法簽名在 office 2000 和 office xp 之間存在差別。如何生成和運(yùn)行 example2.cs
要生成 xample2.cs,可以在 visual studio .net command prompt(visual studio .net 命令提示)窗口中執(zhí)行以下操作: - 在 c:/csofficesamples 目錄或任何保存 example2.cs 的目錄中,在如圖 3 所示的命令提示后鍵入 csc /r:"c:/office xp pias/microsoft.office.interop.word.dll" /d:officexp example2.cs。
(如果 office xp pia 保存在其他位置,則需要使用相應(yīng)值替換下面的“驅(qū)動(dòng)器”和“安裝路徑”:csc /r:驅(qū)動(dòng)器:/<安裝路徑>/microsoft.office.interop.word.dll /d:officexp example2.cs。)

圖 3:使用命令行編譯 example2.cs(單擊圖片查看大圖像) - 要運(yùn)行 example2.exe(與 example2.cs 源文件位于同一文件夾中),雙擊該程序即可。
示例 3:打開現(xiàn)有的 word 文檔