天天看點

我的VSTO之路(三):Word基本知識

我的VSTO之路(三):Word基本知識

)。言歸正傳,我錄制了一段視訊來示範本文所要介紹的内容。

這段視訊,描述了一個簡單的Word搜尋插件,包含了以下幾個功能點

自定義Ribbon 自定義Task Pane VSTO插件中擷取Word内容全文 修改Word内容和樣式

首先,要開發出良好的程式,我們需要了解我們的開發平台,而Word本身是一個很複查的平台,我在這裡先從Word的對象模型開始介紹。Word Object Model中一共包含有數百個不同類型的對象,其中最關鍵的也是最常用的是Application、Document、Range、Selection和Bookmark,他們的關系如下圖:

我的VSTO之路(三):Word基本知識

我來依次介紹這幾個對象:

Application代表Word程式,而一個Word程式内可以包含多個Word文檔。用通俗的話來說,無論你開幾個Word文檔,都是在一個Word程序裡面管理。這我們以後會講到的Excel不一樣。同時Application又是所有Word對象根,你可以通過Application對象,獲得其他對象。在Addin開發過程中,我們可以通過以下方式來獲得Application對象:

Document對象代表着一個Word文檔,即便你剛打開你的Word,是一個空的新文檔,也會有一個Document。在開發過程中,以下這個屬性從Application中獲得目前的Document對象:

此外Application對象也維護着一個集合,即Application.Documents,裡面包含着現在所有打開的Word文檔。

Range是一個比較特殊的對象(我其實都不知道如何用中文翻譯貼切地翻譯這個單詞),在你日常使用Word的過程中,你甚至可能不會知道有這樣一個對象存在,但如果你想通過程式方式修改Word正文的内容,Range是一個很關鍵的對象。用微軟官方的表述,Range代表着文檔中一片連續的區域,微軟為它列出了一下幾個特性:

Range的組成成分可以是單獨的插入點,也可以是一個文本範圍或整個文檔。

Range包含非列印字元,例如空格、制表符和段落标記。

Range可以是目前所選内容所表示的區域,也可以表示目前所選内容之外的區域。

Range與始終可見的所選内容不同,它在文檔中是不可見的。

Range不随文檔儲存,僅存在于代碼運作期間。

我再為它加2條

Range有明确的開始和結束,但不同的Range之間是可以有交集的

Range的長度是在變化的,如果你往一個Range裡面插入的一個單詞,它的長度會自動變長。

獲得Range對象的方式很多,我們可以通過Document對象的Range(ref object Start = Type.Missing, ref object End = Type.Missing)方法,建立一個自定義的Range。通過Word中文檔相關的對象都有一個Range屬性,比如Paragraph.Range、Selection.Range。

Selection代表着目前光标所選中的對象,我們在開發過程中這個對象會和Application.WindowSelectionChange一起使用。

Delegate接口

Bookmark即書簽,在Word文檔中做一個标記,友善查閱。開發過程中,我們可以基于Range來建立Bookmark。如:

至此我們已經介紹完畢了Word中的主要5個對象,現在我們運用我們學到的東西,來實開頭視訊中的那個插件

插件:自定義Search面闆

我先定義一下我們要實作的功能點,獲得Word文檔的内容,取得與檢索關鍵字相關的上下文并顯示在ListView中,當使用者點中ListView中的項目時,高亮顯示Word文檔中對應的内容。以下是如何實作這幾個功能的介紹。

獲得Word的全文

要取得目前Word的全文,我們主要要解決兩個問題。

如何獲得目前的Document對象?

如何通過Document對象獲得文檔内容?

對于第一個問題,因為搜尋功能主要是寫在Task Pane中的UserControl中(這一點在上一篇文章中已經有過介紹),是以取得Document對象的主要方法,是通過Application對象獲得ActiveDocument的對象,即目前編輯的文檔:

對于第二個問題,我們有兩個方法:首先,Document對象有Paragraphs集合,這個集合裡面包含了每個段落的對象,而每個段落對象,都有Range屬性,我們可以通過Paragraph.Range.Text,來獲得每個段落的正文。其次Document對象有一個Range方法,通過它我們可以把整個Document作為一個Range。

Search按鈕代碼

介紹一下這段代碼的幾個功能點:

在Search功能開始時,先清除文檔中的高亮顯示(ClearMark方法稍後會介紹)。

分段落,依次查找關鍵字。

獲得關鍵字的上下文,并放入ListView中顯示。需要注意的時候,我在ListViewItem的tag對象裡面,存入了Keyword在文檔中的Range,為了ListView點選事件。

ListView點選事件

總體來說這段代碼很簡單,我稍微介紹一下Range對象的使用,這裡我修改了HighlightColorIndex屬性,來修改文字的背景色,如果你修改字型相關的樣式,可以通過Range.Font屬性。(此外,我會在下一篇文中,介紹如何通過Range加超連結、書簽或者Content Control)。

其他方法

我在Search事件和ListView點選方法中都會先調用這個方法,它會使用在lvSearchResult_ItemSelectionChanged中儲存的Range和Color,來恢複之前的樣式。

總結

本文中,我介紹了Word對象模型的基本内容和我寫的一個Word插件,包含對Application、Document和Range對象的操作。Word程式包含的内容是很多的,本來想把自己了解的Word知識一次寫完,但寫到這裡發現已經寫了很多了,怕大家會看得累

我的VSTO之路(三):Word基本知識

,是以先發出來,再下一篇文章,我會進一步深入介紹Word插件開發。下次内容預告:

修改右鍵菜單

往文檔中插入内容

添加超連結、書簽

基于選中内容,顯示懸浮框