我的VSTO之路_第1頁(yè)
我的VSTO之路_第2頁(yè)
我的VSTO之路_第3頁(yè)
我的VSTO之路_第4頁(yè)
我的VSTO之路_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、初識(shí)VSTO Addin開發(fā)這篇博客將簡(jiǎn)單介紹一些VSTO Addin開發(fā)的知識(shí)。1. VSTO是什么?我們可以用VSTO做什么?VSTO全稱Visual Studio Tool for Office,是可以讓我們針對(duì)現(xiàn)有的Office程序進(jìn)行功能擴(kuò)展。在工作或生活中其實(shí)我們或多或少用到過(guò)VSTO插件,例如安裝有道詞典/Adobe Pro會(huì)在Office程序中嵌入插件程序。2. VSTO開發(fā)環(huán)境的準(zhǔn)備:(1). 我們的PC上需要安裝有Office(Office 2007及以上版本);(2). 以Visual Studio 2015為例,在安裝時(shí)需要勾選Office Developme

2、nt模塊。如果初始安裝沒有安裝也沒關(guān)系,可以在控制面板中通過(guò)更改Visual Studio的方式進(jìn)行安裝。成功安裝后,打開Visual Studio 2015->新建工程->選擇Office Development模塊:3. Office 開發(fā)的模板,我們主要看(Application-Level/Template-Level)的模板,這兩者的加載方式請(qǐng)看下面的圖示:打開Office解決方案的文檔后,Microsoft Office 應(yīng)用程序檢查自定義文檔屬性,以確定是否有與文檔關(guān)聯(lián)的托管代碼擴(kuò)展。PS: 這兩者在開發(fā)上的區(qū)別就是模板不一樣,別的基本沒有。另外一個(gè)Applicati

3、on-Level是針對(duì)整個(gè)Office Word/Excel/.的定制,而Template-Level是正對(duì)Word/Excel/.模板的定制。4. 我們以VSTO Word Addin為例,講一下VSTO Word Addin Development中的核心對(duì)象。Application: 代表了Word程序 Document: 代表了一個(gè)Word文檔,一個(gè)Word Application可以有1個(gè)或者多個(gè)Document Bookmark: 代表了在Word文檔中一個(gè)連續(xù)的區(qū)域,它有一個(gè)起始位置和結(jié)束位置,可以用一個(gè)標(biāo)識(shí)來(lái)標(biāo)記這段連續(xù)的區(qū)域,這個(gè)就是Bookma

4、rk Range: 代表了在Word文檔中一個(gè)連續(xù)的區(qū)域,它有一個(gè)起始位置和結(jié)束位置 Selection: 代表了當(dāng)前選中的區(qū)域; 更多內(nèi)容,請(qǐng)參考: 我們通過(guò)新建一個(gè)Word Addin的工程來(lái)初步認(rèn)識(shí)下這幾個(gè)對(duì)象。Code: private void ThisAddIn_Startup(object sender, System.EventArgs e) Application.WindowSelectionChange += Application_WindowSelectionChange; Word.Document doc = .Open(&

5、quot;D:demo.docx", AddToRecentFiles: false); / <summary> / WindowsSelectionChange事件 / </summary> / <param name="Sel">選中文本</param> private void Application_WindowSelectionChange(Word.Selection Sel) if ( - Sel.Range.Start > 10) Word.Range range = Sel.Range; (&

6、quot;Range Start Position: 0 Range End Position: 1", range.Start, range.End); ("MyBookmark"); 運(yùn)行效果: 向Word的Bookmark中插入一個(gè)Bookmark:當(dāng)我們編譯Word Addin工程時(shí),會(huì)向注冊(cè)表中寫入插件的一些信息,例如Description, FriendlyName, LoadBehavior, Mantifest等,此時(shí)當(dāng)我們單獨(dú)打開Word時(shí),插件還是會(huì)運(yùn)行的。清理一下Visual Studio Word Addin工程即可。5. 如何部署VSTO

7、插件(以Word為例),從Visual Studio編譯Word插件時(shí),向注冊(cè)表中寫入的信息,我們可以利用這些注冊(cè)表信息來(lái)部署Word插件,需要注意的兩個(gè)值:LoadBehavior:3 代表了啟動(dòng)時(shí)自動(dòng)加載。具體請(qǐng)參考: 中Load BehaviorManifest:指定VSTO插件的具體位置:PS: 也可以將插件的信息寫入到注冊(cè)表Machine節(jié)點(diǎn)下:HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Office->Word->Addins. 這樣登錄這臺(tái)PC的所有用戶都可以使用到這個(gè)插件。 在部署時(shí),我們只

8、需要將這些注冊(cè)表信息寫入正確的位置即可。當(dāng)然最簡(jiǎn)單的部署方式可以通過(guò)ClickOnce來(lái)進(jìn)行部署。另外也可以選擇其他部署方式,例如Windows Installer: 可以參考: VSTO的學(xué)習(xí)資源 感謝您的閱讀!我的VSTO之路:序VSTO是微軟提供給.Net開發(fā)人員的一個(gè)接口,通過(guò)他我們可以對(duì)Office程序做一些處理。但是這個(gè)接口并不盡善盡美,相比微軟的很多其他產(chǎn)品,VSTO的穩(wěn)定性并不好,相關(guān)的文檔也很少。這種情況下,很多問(wèn)題需要我們程序員自己去克服。我自己從08年進(jìn)了現(xiàn)在這家公司,斷斷續(xù)續(xù)做VSTO開發(fā)已經(jīng)快2年半了,不敢說(shuō)對(duì)VSTO精通,但至少已經(jīng)有了深入的解,

9、尤其對(duì)開發(fā)中的一些Trick和一些Bug。準(zhǔn)備寫點(diǎn)東西記錄一下這兩年來(lái)的心路歷程。同時(shí)也感慨于國(guó)內(nèi)的VSTO文檔資料實(shí)在匱乏,我自己在開發(fā)過(guò)程中走了不少?gòu)澛?,希望我寫的這些文檔能對(duì)后來(lái)的開發(fā)者們有所幫助。我喜歡在寫文檔之前先準(zhǔn)備一個(gè)提綱,然后再往里面填充,所以在序里面,我先列一下我準(zhǔn)備寫的主要內(nèi)容1. VSTO基本知識(shí)1. 創(chuàng)建項(xiàng)目2. 添加Ribbon3. 添加Task Panel2. Word基本知識(shí)1. Word Object Model 介紹 (Application、Document、Range、Selection和Bookmark)1. Application對(duì)象2. Docume

10、nt對(duì)象3. Range對(duì)象4. Selection對(duì)象5. Bookmark對(duì)象2. 插件:自定義Search面板3. Word深入開發(fā)1. 修改右鍵菜單2. 往文檔中插入內(nèi)容3. 添加超鏈接、書簽4. 基于選中內(nèi)容,顯示懸浮框5. 遺留問(wèn)題4. Outlook相關(guān)知識(shí)1. Outlook的基本結(jié)構(gòu)2. 獲得Outlook的目錄樹3. 捕獲新郵件和郵件移動(dòng)4. 修改Outlook右鍵菜單5. 通過(guò)VSTO新建郵件或聯(lián)系人6. Outlook Form Region的使用,以及擴(kuò)展Outlook聯(lián)系人的內(nèi)容7. 遺留問(wèn)題5. Excel相關(guān)知識(shí)1. 修改Excel中,Cell的內(nèi)容和樣式2.

11、獲得Excel中所有內(nèi)容,即有輸入的Cell3. 修改Excel右鍵菜單4. 遺留問(wèn)題6. Smart Tag1. VSTO Smart Tag的開發(fā)2. COM Smart Tag的開發(fā)7. 發(fā)布VSTO程序1. Click once方式2. 安裝包方式8. VSTO之外1. 對(duì)于C#中對(duì)于Excel數(shù)據(jù)的導(dǎo)入與導(dǎo)出 *這些文檔除了Smar Tag是針對(duì)Office 2007的之外,其他的內(nèi)容基本適用于Office 2007Office 2010。另外,抗議一下微軟,居然在Office 2010中廢除了Smart Tag大部分的功能。我的VSTO之路(二):VSTO程序基本知識(shí)開始

12、之前,首先我介紹一下我的開發(fā)環(huán)境:VS2010 + Office 2010,是基于.Net framework 4.0和VSTO 4.0。以下的范例代碼都基于這個(gè),如果你使用的是VS2008,那么問(wèn)題也不大,基本可以移植過(guò)去。需要注意的是.Net framework 4.0中增加了dynamic類型和可選參數(shù),而這兩點(diǎn)新的特性在VSTO 4.0中被廣泛使用,新特性的詳細(xì)內(nèi)容我就不介紹了,(其實(shí)介紹的地方很多,Google一下就可以了),移植的時(shí)候需要稍微調(diào)整一下代碼。創(chuàng)建VSTO項(xiàng)目環(huán)境搭建要開發(fā)VSTO項(xiàng)目,環(huán)境搭建比較簡(jiǎn)單,微軟這方面做得都做不錯(cuò)。只要安裝了VS2010(需要勾選VSTO

13、4.0)和Office2010即可。VS2008配合Office2007也可以輕松搭建開發(fā)環(huán)境。創(chuàng)建項(xiàng)目選擇創(chuàng)建新項(xiàng)目->C#->Office,然后選擇Word 2010 Add-in,如下圖:可以看到圖中除了Word 2010 Add-in,還有Word 2010 Document和Word 2010 Template這兩種項(xiàng)目類型。它們的區(qū)別在于,Add-in屬于Application level,即是一個(gè)插件,每次Word啟動(dòng)的時(shí)候都會(huì)加載這個(gè)插件。而Document和Template屬于Document Level,這種項(xiàng)目會(huì)生成一個(gè)Word文件(Document項(xiàng)目會(huì)生成

14、.docx文件,而Template會(huì)生成.dotx),你寫的代碼只有在運(yùn)行這個(gè)特定的Word文件的時(shí)候才會(huì)起作用。添加自定義的Ribbon右擊項(xiàng)目->添加新的Item->Office->Ribbon (Visual Designer),如下圖: 往Ribbon上,添加一個(gè)按鈕,并取名為Hello 雙擊Hello按鈕,在OnClick中,添加如下代碼: 1: private void btHello_Click(object sender, RibbonControlEventArgs e) 2: 3: .Show("Hello World!&qu

15、ot;); 4: 按F5運(yùn)行當(dāng)前程序,VS會(huì)幫你自動(dòng)開始一個(gè)新的Word實(shí)例,然后在Word中選擇Add-ins標(biāo)簽頁(yè),點(diǎn)擊Hello按鈕。如果你順利看到Hello Word!對(duì)話框,就說(shuō)明你的第一個(gè)VSTO程序,順利完成了。對(duì)于我們的一個(gè)VSTO程序,我們做一些小的優(yōu)化。從前一張圖我們可以看到,我們的Ribbon和其他插件的Ribbon都擠在了Add-ins,這個(gè)Tabs中。我們現(xiàn)在要把我們的Ribbon獨(dú)立出來(lái)。在VS中,打開Ribbon的設(shè)計(jì)界面,并選擇Ribbon Tab,如下圖,把ControlIdType改為Custom,然后把ControlID改為MyFirstAddin,這樣我

16、們的Ribbon會(huì)獨(dú)占一個(gè)Ribbon Tab。 * 這里有個(gè)小Trick,如果你的客戶希望你把自己建的Ribbon插入到Office自己的Ribbon里面去,我們也可以實(shí)現(xiàn)。把ControlIdType設(shè)定為Office,并把OfficeID設(shè)定為TabHome,如下圖: 運(yùn)行界面其他的OfficeID可以到這里查看:Office 2010 IDs,Office 2007 IDs 添加Task Pane創(chuàng)建Task PaneTask Pane是一個(gè)很有用的控件,它可以駐留在Office程序的窗口上,讓開發(fā)者更具自己的需求創(chuàng)建界面。首先我們先創(chuàng)建一個(gè)User Co

17、ntrol,之后這個(gè)User Control將嵌入在Task Pane中。而我們所添加的代碼,主要也加在這個(gè)User Control中。 在UserControl上放一個(gè)Label,我們暫時(shí)不在這里寫進(jìn)一步的代碼: 在ThisAddIn.cs文件中,進(jìn)行如下修改,這樣在這樣Addin被加載時(shí),就會(huì)顯示Task Pane: 1: public partial class ThisAddIn 2: 3: public CustomTaskPane _MyCustomTaskPane = null; 4:   5: private void ThisAddIn_Star

18、tup(object sender, System.EventArgs e) 6: 7: UCForTaskPane taskPane = new UCForTaskPane(); 8: _MyCustomTaskPane = this.CustomTaskPanes.Add(taskPane, "My Task Pane"); 9: _MyCustomTaskPane.Width = 200; 10: _MyCustomTaskPane.Visible = true; 11: 12:   13: private void ThisAddIn_Shutdown(o

19、bject sender, System.EventArgs e) 14: 15: 16:   17: #region VSTO generated code 18: / 內(nèi)容被省略 19: #endregion 20:  運(yùn)行結(jié)果: 將Task Pane與Ribbon關(guān)聯(lián)我們已經(jīng)完成了一個(gè)Task Pane,接下去要用之前創(chuàng)建的Ribbon控制Task Pane的顯示。先對(duì)之前的Ribbon做一些修改,增加兩個(gè)按鈕,同時(shí)我們對(duì)界面做一些美化,具體步驟我這里不詳述了,界面如下圖:為"Open Task Pane"和"Close Tas

20、k Pane"添加Onclick事件,代碼如下: 1: private void btnOpen_Click(object sender, RibbonControlEventArgs e) 2: 3: if (MyCustomTaskPane != null) 4: 5: MyCustomTaskPane.Visible = true; 6: 7: 8:   9: private void btnClose_Click(object sender, RibbonControlEventArgs e) 10: 11: if (MyCustomTaskPane != null

21、) 12: 13: MyCustomTaskPane.Visible = false; 14: 15:  運(yùn)行你的程序,便可以看到結(jié)果了。本文總結(jié)到這里,我介紹了VSTO的開發(fā)方法,以及Ribbon和Task Pane的基本知識(shí),本文中的范例程序可以在這里下載:MyFirstAddin.zip。 在之后的文章中,我會(huì)深入介紹Word、Excel和Outlook的具體開發(fā)實(shí)例以及開發(fā)的細(xì)節(jié)。詳細(xì)請(qǐng)看,我之前寫的序,。本文歡迎轉(zhuǎn)載,但請(qǐng)保留出處,大家如果有問(wèn)題,可以聯(lián)系我 我的VSTO之路(三):Word基本知識(shí)在前一篇文章中,我初步介紹了如何如何開發(fā)一個(gè)VSTO程序

22、,在本文中,我將進(jìn)一步深入介紹Word的插件開發(fā)。Word是一個(gè)大家在日常工作中一直接觸的文檔工具,也是微軟最賺錢的產(chǎn)品之一。從最初的Word 1.0到現(xiàn)在的Word 2010歷經(jīng)了13代的演化,已經(jīng)成為了一個(gè)比較復(fù)雜的系統(tǒng)。(這里稍微跑題一下,Office 2010的版本代號(hào)是version 14,但是我為什么說(shuō)Word一共演化了13代呢?因?yàn)镺ffice并沒有Version 13,上一代的Office 2007是Version 12,微軟覺得13這個(gè)死數(shù)字不吉利,所以直接跳過(guò)了Oh my god)。言歸正傳,我錄制了一段視頻來(lái)演示本文所要介紹的內(nèi)容。這段視頻,描述了一個(gè)簡(jiǎn)單的Word搜索插

23、件,包含了以下幾個(gè)功能點(diǎn)1. 自定義Ribbon 2. 自定義Task Pane 3. VSTO插件中獲取Word內(nèi)容全文 4. 修改Word內(nèi)容和樣式 其中關(guān)于如何創(chuàng)建Ribbon和Task Pane的內(nèi)容,我已經(jīng)在前一篇文章中介紹了,如果你還不熟悉,可以看這里。 Word Object Model 介紹 首先,要開發(fā)出良好的程序,我們需要了解我們的開發(fā)平臺(tái),而Word本身是一個(gè)很復(fù)查的平臺(tái),我在這里先從Word的對(duì)象模型開始介紹。Word Object Model中一共包含有數(shù)百個(gè)不同類型的對(duì)象,其中最關(guān)鍵的也是最常用的是Application、Document、Range、Se

24、lection和Bookmark,他們的關(guān)系如下圖:我來(lái)依次介紹這幾個(gè)對(duì)象:Application 對(duì)象Application代表Word程序,而一個(gè)Word程序內(nèi)可以包含多個(gè)Word文檔。用通俗的話來(lái)說(shuō),無(wú)論你開幾個(gè)Word文檔,都是在一個(gè)Word進(jìn)程里面管理。這我們以后會(huì)講到的Excel不一樣。同時(shí)Application又是所有Word對(duì)象根,你可以通過(guò)Application對(duì)象,獲得其他對(duì)象。在Addin開發(fā)過(guò)程中,我們可以通過(guò)以下方式來(lái)獲得Application對(duì)象:    Document 對(duì)象Document對(duì)象代表著一個(gè)Word文檔,即便你剛打開你的

25、Word,是一個(gè)空的新文檔,也會(huì)有一個(gè)Document。在開發(fā)過(guò)程中,以下這個(gè)屬性從Application中獲得當(dāng)前的Document對(duì)象: 此外Application對(duì)象也維護(hù)著一個(gè)集合,即Application.Documents,里面包含著現(xiàn)在所有打開的Word文檔。 Range 對(duì)象Range是一個(gè)比較特殊的對(duì)象(我其實(shí)都不知道如何用中文翻譯貼切地翻譯這個(gè)單詞),在你日常使用Word的過(guò)程中,你甚至可能不會(huì)知道有這樣一個(gè)對(duì)象存在,但如果你想通過(guò)程序方式修改Word正文的內(nèi)容,Range是一個(gè)很關(guān)鍵的對(duì)象。用微軟官方的表述,Range代表著文檔中一片連續(xù)的區(qū)域,微軟為它列出了一

26、下幾個(gè)特性:1. Range的組成成分可以是單獨(dú)的插入點(diǎn),也可以是一個(gè)文本范圍或整個(gè)文檔。 2. Range包含非打印字符,例如空格、制表符和段落標(biāo)記。 3. Range可以是當(dāng)前所選內(nèi)容所表示的區(qū)域,也可以表示當(dāng)前所選內(nèi)容之外的區(qū)域。 4. Range與始終可見的所選內(nèi)容不同,它在文檔中是不可見的。 5. Range不隨文檔保存,僅存在于代碼運(yùn)行期間。 我再為它加2條1. Range有明確的開始和結(jié)束,但不同的Range之間是可以有交集的 2. Range的長(zhǎng)度是在變化的,如果你往一個(gè)Range里面插入的一個(gè)單詞,它的長(zhǎng)度會(huì)自動(dòng)變長(zhǎng)。 獲得Range對(duì)象的方式很多,我們可以通過(guò)Documen

27、t對(duì)象的Range(ref object Start = Type.Missing, ref object End = Type.Missing)方法,創(chuàng)建一個(gè)自定義的Range。通過(guò)Word中文檔相關(guān)的對(duì)象都有一個(gè)Range屬性,比如Paragraph.Range、Selection.Range。 Selection 對(duì)象Selection代表著當(dāng)前光標(biāo)所選中的對(duì)象,我們?cè)陂_發(fā)過(guò)程中這個(gè)對(duì)象會(huì)和Application.WindowSelectionChange一起使用。 1: / 2: / Summary: 3: / Occurs when the selection change

28、s in the active document window. 4: event ApplicationEvents4_WindowSelectionChangeEventHandler WindowSelectionChange;Delegate接口 1: TypeLibType(16) 2: ComVisible(false) 3: public delegate void ApplicationEvents4_WindowSelectionChangeEventHandler(Selection Sel); Bookmark 與 Content ControlBookmark

29、即書簽,在Word文檔中做一個(gè)標(biāo)記,方便查閱。開發(fā)過(guò)程中,我們可以基于Range來(lái)創(chuàng)建Bookmark。如: 1: / 將第一段文檔標(biāo)記為一個(gè)BookMark 2: Word.Range range = .Paragraphs0.Range; 3: ("JustinTest"); 至此我們已經(jīng)介紹完畢了Word中的主要5個(gè)對(duì)象,現(xiàn)在我們運(yùn)用我們學(xué)到的東西,來(lái)實(shí)開頭視頻中的那個(gè)插件 插件:自定義Search面板我先定義一下我們要實(shí)現(xiàn)的功能點(diǎn),獲得Word文檔的內(nèi)容,取得與檢索關(guān)鍵字相關(guān)的上下文并顯示在ListView中,當(dāng)用戶點(diǎn)中ListView中的項(xiàng)目時(shí)

30、,高亮顯示W(wǎng)ord文檔中對(duì)應(yīng)的內(nèi)容。以下是如何實(shí)現(xiàn)這幾個(gè)功能的介紹。 獲得Word的全文 要取得當(dāng)前Word的全文,我們主要要解決兩個(gè)問(wèn)題。1. 如何獲得當(dāng)前的Document對(duì)象? 2. 如何通過(guò)Document對(duì)象獲得文檔內(nèi)容? 對(duì)于第一個(gè)問(wèn)題,因?yàn)樗阉鞴δ苤饕菍懺赥ask Pane中的UserControl中(這一點(diǎn)在上一篇文章中已經(jīng)有過(guò)介紹),所以取得Document對(duì)象的主要方法,是通過(guò)Application對(duì)象獲得ActiveDocument的對(duì)象,即當(dāng)前編輯的文檔: 對(duì)于第二個(gè)問(wèn)題,我們有兩個(gè)方法:首先,Document對(duì)象有Paragraphs集合,這個(gè)集合里面包含

31、了每個(gè)段落的對(duì)象,而每個(gè)段落對(duì)象,都有Range屬性,我們可以通過(guò),來(lái)獲得每個(gè)段落的正文。其次Document對(duì)象有一個(gè)Range方法,通過(guò)它我們可以把整個(gè)Document作為一個(gè)Range。 Search按鈕代碼 1: private void btnSearch_Click(object sender, EventArgs e) 2: 3: / 清楚文檔中的高亮顯示 4: ClearMark(); 5:   6: (); 7: if (string.IsNullOrWhiteSpace(tbSearchText.Text) 8: 9: return; 10: 11: &

32、#160; 12: / 按段落檢索 13: Word.Document currentDocument = ; 14: if (currentDocument.Paragraphs != null && 15: != 0) 16: 17: foreach (Word.Paragraph paragraph in currentDocument.Paragraphs) 18: 19: MatchCollection mc = Regex.Matches(, tbSearchText.Text.Trim(), RegexOptions.IgnoreCase); 20: if (mc

33、.Count > 0) 21: 22: foreach (Match m in mc) 23: 24: try 25: 26: int startIndex = + m.Index; 27: int endIndex = + m.Index + m.Length; 28:   29: Word.Range keywordRange = currentDocument.Range(startIndex, endIndex); 30: 31: / 獲取上下文信息 32: / 獲取前兩個(gè)單詞的位置(如果有) 33: startIndex = GetStartPositionForVi

34、ew(paragraph, m, startIndex); 34:   35: / 獲取后兩個(gè)單詞的位置(如果有) 36: endIndex = GetEndPositionForView(paragraph, m, endIndex); 37:   38: / 在ListView中展示檢索的關(guān)鍵字以及其上下文 39: Word.Range range = currentDocument.Range(startIndex, endIndex); 40: ListViewItem item = new ListViewItem(range.Text); 41: item.Ta

35、g = keywordRange; 42: (item); 43: 44: catch (Exception ex) 45: 46: MessageBox.Show(ex.Message); 47: 48: 49: 50: 51: 52: 介紹一下這段代碼的幾個(gè)功能點(diǎn):1. 在Search功能開始時(shí),先清除文檔中的高亮顯示(ClearMark方法稍后會(huì)介紹)。 2. 分段落,依次查找關(guān)鍵字。 3. 獲得關(guān)鍵字的上下文,并放入ListView中顯示。需要注意的時(shí)候,我在ListViewItem的tag對(duì)象里面,存入了Keyword在文檔中的Range,為了ListView點(diǎn)擊事件。  

36、ListView點(diǎn)擊事件 1: private void lvSearchResult_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 2: 3: ClearMark(); 4: if ( > 0) 5: 6: Word.Range range = lvSearchResult.SelectedItems0.Tag as Word.Range; 7:   8: / 為了可以恢復(fù)被修改的Range,我先將該Range和原本的Color放入Class的成員 9: _LastRa

37、nge = range; 10: _LastRangeBackColor = range.HighlightColorIndex; 11: range.HighlightColorIndex = Word.WdColorIndex.wdYellow; 12: 13: 總體來(lái)說(shuō)這段代碼很簡(jiǎn)單,我稍微介紹一下Range對(duì)象的使用,這里我修改了HighlightColorIndex屬性,來(lái)修改文字的背景色,如果你修改字體相關(guān)的樣式,可以通過(guò)Range.Font屬性。(此外,我會(huì)在下一篇文中,介紹如何通過(guò)Range加超鏈接、書簽或者Content Control)。 其他方法 1: priv

38、ate void ClearMark() 2: 3: if (_LastRange != null) 4: 5: _LastRange.HighlightColorIndex = _LastRangeBackColor; 6: 7: 我在Search事件和ListView點(diǎn)擊方法中都會(huì)先調(diào)用這個(gè)方法,它會(huì)使用在lvSearchResult_ItemSelectionChanged中保存的Range和Color,來(lái)恢復(fù)之前的樣式。 總結(jié)本文中,我介紹了Word對(duì)象模型的基本內(nèi)容和我寫的一個(gè)Word插件,包含對(duì)Application、Document和Range對(duì)象的操作。Word程序包

39、含的內(nèi)容是很多的,本來(lái)想把自己了解的Word知識(shí)一次寫完,但寫到這里發(fā)現(xiàn)已經(jīng)寫了很多了,怕大家會(huì)看得累,所以先發(fā)出來(lái),再下一篇文章,我會(huì)進(jìn)一步深入介紹Word插件開發(fā)。下次內(nèi)容預(yù)告:1. 修改右鍵菜單 2. 往文檔中插入內(nèi)容 3. 添加超鏈接、書簽 4. 基于選中內(nèi)容,顯示懸浮框  最后,本文范例的代碼可以在這里下載。此外,本文歡迎轉(zhuǎn)載,但請(qǐng)保留出處,大家如果有問(wèn)題,可以聯(lián)系我 。我的VSTO之路(四):深入介紹Word開發(fā)在上一篇文章中,我介紹了Word的對(duì)象模型和一些基本開發(fā)技巧。為了更好的介紹Word插件開發(fā),我為本文制作了一個(gè)Word書簽的增強(qiáng)版,具體功能是讓用戶在Word中

40、選擇一段文本,為它添加書簽并其標(biāo)志為高亮,同時(shí)用戶可以為這段書簽寫注釋,以后當(dāng)用戶點(diǎn)擊這個(gè)書簽時(shí),我就會(huì)顯示注釋。以下是我錄制的視頻介紹: 這個(gè)插件將包括以下幾個(gè)技術(shù)點(diǎn):1. 添加右鍵菜單 · 添加右鍵菜單、控制右鍵菜單顯示 · WindowBeforeRightClick 事件 · 刪除右鍵菜單 2. 修改正文內(nèi)容、樣式 1. 修改選定的內(nèi)容 2. 修改選定的樣式 3. 添加控件 1. 添加書簽 2. 添加超鏈接 3. 添加內(nèi)容控件(Content Control) 4. 基于用戶選中內(nèi)容,執(zhí)行程序 1. WindowSelectionChange 事

41、件 2. 根據(jù)當(dāng)前光標(biāo)的位置,顯示懸浮框 以下是我對(duì)這些功能點(diǎn)的具體介紹 右鍵菜單添加右鍵菜單右鍵菜單是Word中相當(dāng)常用的一個(gè)功能,我們?cè)诖蟛糠值腣STO開發(fā)中也會(huì)通過(guò)修改這個(gè)菜單來(lái)擴(kuò)展Word的功能。最通常地添加右鍵菜單的方法如下: 1: / 添加右鍵按鈕 2: Office.CommandBarButton addBtn = (Office.CommandBarButton)Application.CommandBars"Text".Controls.Add(Office.MsoControlType.msoControlButton, missing, m

42、issing, missing, false); 3: 4: / 開始一個(gè)新Group,即在我們添加的Menu前加一條分割線 5: addBtn.BeginGroup = true; 6: 7: / 為按鈕設(shè)置Tag 8: addBtn.Tag = "BookMarkAddin" 9: 10: / 添加按鈕上的文字 11: addBtn.Caption = "Add Bookmark" 12: 13: / 將按鈕初始設(shè)為不激活狀態(tài) 14: addBtn.Enabled = false;顯示的效果為 控制右鍵菜單顯示在很多情況下,我們希望根據(jù)用戶

43、選擇內(nèi)容來(lái)控制右鍵菜單的顯示,那么我們就需要用到WindowBeforeRightClick事件。以下是我在范例中寫的代碼,只有當(dāng)用戶選擇兩個(gè)以上字符的時(shí)候,我才會(huì)把我剛才添加的右鍵菜單激活。請(qǐng)注意代碼里面的一些注釋,VSTO與Office的COM交互時(shí),并不是很穩(wěn)定,有很多需要注意的地方。 1: void Application_WindowBeforeRightClick(Word.Selection Sel, ref bool Cancel) 2: 3: / 根據(jù)之前添加的Tag來(lái)找到我們添加的右鍵菜單 4: / 注意:我這里沒有通過(guò)全局變量來(lái)控制右鍵菜單,而是通過(guò)findcontrol

44、來(lái)取得按鈕,因?yàn)檫@里的VSTO和COM對(duì)象處理有問(wèn)題,使用全局變量來(lái)控制右鍵按鈕不穩(wěn)定 5: Office.CommandBarButton addBtn = (Office.CommandBarButton)Application.CommandBars.FindControl(Office.MsoControlType.msoControlButton, missing, "BookMarkAddin", false); 6: addBtn.Enabled = false; 7: addBtn.Click -= new Office._CommandBarButtonE

45、vents_ClickEventHandler(_RightBtn_Click); 8: 9: if (!string.IsNullOrWhiteSpace(Sel.Range.Text) && Sel.Range.Text.Length > 2) 10: 11: addBtn.Enabled = true; 12: 13: / 這里是另外一個(gè)注意點(diǎn),每次Click事件都需要重新綁定,你需要在之前先取消綁定。 14: addBtn.Click += new Office._CommandBarButtonEvents_ClickEventHandler(_RightBtn

46、_Click); 15: 16:  刪除右鍵菜單我建議在Addin啟動(dòng)和關(guān)閉時(shí)候(ThisAddIn_Startup與ThisAddIn_Shutdown中),每次都清除由我們添加的右鍵菜單,雖然按照微軟的提示,如果在創(chuàng)建的時(shí)候把Temporary屬性設(shè)為true,系統(tǒng)會(huì)在程序退出時(shí)自動(dòng)幫你刪除,但是根據(jù)我的經(jīng)驗(yàn),微軟這個(gè)許諾沒有兌現(xiàn)。 1: private void RemoveRightBtns() 2: 3: Office.CommandBarControls siteBtns = (Office.MsoControlType.msoControlButton, missing

47、, "BookMarkAddin", false); 4: / 這里我寫了一個(gè)循環(huán),目標(biāo)是清理所有由我創(chuàng)建的右鍵按鈕,尤其是由于Addin Crash時(shí)所遺留的按鈕 5: if (siteBtns != null) 6: 7: foreach (Office.CommandBarControl btn in siteBtns) 8: 9: btn.Delete(true); 10: 11: 12:  修改正文內(nèi)容、樣式 修改選定的內(nèi)容 Word文檔內(nèi)容的修改,主要是通過(guò)Range對(duì)象來(lái)實(shí)現(xiàn)的,比較容易。例如,你可以先通過(guò) Application.ActiveDoc

48、ument.Range(object start ,object end)方法來(lái)獲得一個(gè)你需要的Range,然后通過(guò)Range.Text來(lái)修改正文的內(nèi)容,例如: 1: Word.Range range = (0, 10); 2: if (range != null) 3: 4: range.Text = "Justin" 5: 這里需要指出的是,獲得Range的方式很多,你也可以通過(guò)用戶選擇的Selection對(duì)象來(lái)獲得Range,詳細(xì)內(nèi)容可以參考我在上一篇隨筆中的Word對(duì)象模型部分。 修改選定的樣式 修改樣式也是通過(guò)Range對(duì)象來(lái)實(shí)現(xiàn)的,這里我就寫兩個(gè)范例,一個(gè)是修改字體,一個(gè)是修改背景色(VSTO中稱為高亮色),大家可以在這里進(jìn)一步擴(kuò)展出去很多東西。 1: / 設(shè)置字體 2: range.Font.Name = "宋體" 3: 4: / 添加下劃線(點(diǎn)) 5: = Word.WdUnderline.wdUnderlineDotted; 6: 7: / 將背景色設(shè)為黃 8: range.HighlightColorIndex = Word.WdColorIndex.wdYellow; 添加控件Word在正文中提供了非常豐富的控件,例如書簽、超鏈接、注釋等,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論