1. 程式人生 > >VSTO之旅系列(四):建立Word解決方案

VSTO之旅系列(四):建立Word解決方案

本專題概要

  • 引言
  • Word物件模型
  • 建立Word外接程式
  • 小結

一、引言

在上一個專題中主要為大家介紹如何自定義我們的Excel 介面的,然而在這個專題中,我將為大家介紹如何用VSTO來建立Word專案,對於Word的VSTO開發和Excel的開發很類似,你同樣也可以為Word自定義介面的,他們的區別主要在於物件模型的不同,只要熟悉了Word的物件模型,操作Word也就很簡單了。下面首先就開始介紹Word的物件模型的。

二、Word物件模型

 建立Word解決方案和建立Excel解決方案之前都需要對他們的物件模型進行了解,因為只有瞭解了他們中各物件的關係,才能更好處理Word和Excel的文件,下面先給出一張Word物件模型層次結構圖:

看上面朋友們肯定對個物件的關係是有所瞭解了,但是對於每個物件到底代表什麼意思還是不怎麼明白,下面就具體為大家介紹下每個物件所代表的意思.

Application物件代表Word應用程式,我們開啟Word文件就是開啟了一個Word應用程式,這裡需要注意的是——無論你開啟幾個Word文件,都是在一個Word程序裡進行管理的。它是所有物件的父級(從圖中也可以看出,每個物件都是它的子節點)。

在應用程式外接程式專案中(這個在Excel解決方案裡都有介紹,對於Word也存在應用程式外接程式專案和文件級專案),我們可以通過下面的方式來獲得Application物件: Globals.ThisAddIn.Application

在文件級別專案中,我們可以通過ThisDocument類的Application屬性來獲得Application物件,即程式碼為: Word.Application app = Globals.ThisDocument.Application;

Document物件代表著一個Word文件,即使你開啟的是一個空文件,也是有一個Document物件,在我們對Word文件的內內容進行編輯,修改,刪除,新增操作之前,我們都需要提前獲得該物件,獲得焦點的文件我們稱為活動文件,我們可以通過Application物件的ActiveDocument屬性來獲得當前活動的文件,程式碼為:

using
Word = Microsoft.Office.Interop.Word; // 應用程式級專案中獲得文件物件 Word.Document doc= Globals.ThisAddIn.Application.ActiveDocument; // 文件級專案中獲得文件物件 Word.Application app = Globals.ThisDocument.Application; Word.Document doc = app.ActiveDocument;

Selection物件代表當前選擇的區域。我們在對Word中內容進行某些操作的時候,例如,改變文字字型大小,此時我們就需要選中該文字,然後設定選中文字的字型大小,這樣選擇的文字就代表一個Selection物件,這裡需要注意的是——Selection物件是一直存在於文件中的,因為有些朋友會問,如果我們沒有選中任何文字時,是否還有Selection物件呢?答案是肯定的,當我們沒有選擇任何文字時,插入點(即操作文字時都會有一個這個符號“|”,該符號就是代表一個插入點)即是一個Selection物件,並且所選的內容可以包含多個不連續的文字塊

Range物件代表一個連續的區域,由一個開始字元位置和一個結束字元位置來確定。我們在文件中定義多個Range物件,看到Range物件,朋友們就會聯想到Selection物件,他們都是代表區域,到底他們有什麼區別呢?對於他們的區別——Range物件在文件中是不可見的,並且是連續的,而Selection物件是在文件中可見的,且可以包含多個不連續的文字塊。通俗的說就是,例如,我們想對某些文字改變字型大小的操作,此時我們可以有兩種方式來實現:第一種,就是使用Selection物件來選中該文字再改變其樣式(此時選中的文字我們可以在Word文件中可以看見,我們可以清楚的明白那些文字需要改變字型),第二種就是使用Range物件來指定一個開始字元(就是一個文字)位置和一個結束字元的位置,這樣在開始字元和結束字元之間就是一個Range物件,然後對該Range物件來設定它的字型樣式,但是這整個過程中我們是看不到那些文字被選中了,所以在應用樣式之前,我們是不知道那些文字會改變字型的,而是用Selection物件卻不同,即使在應用字型樣式之前,我們可以肉眼看出那些文字將會改變字型的。

Bookmark物件即書籤,在現實生活中,我們使用書籤是用來做標記的。同樣Word文件中也有書籤這個功能,我們可以對Word做一個標記,讓你可以知道上次閱讀到哪裡了,Bookmark就是這樣的一個物件。書籤可以隱藏也可以變得可見,我們可以通過 View物件的ShowBookmarks屬性設定為truefalse

為了幫助更進一步理解這些物件,下面通過一張圖來表示各個物件在一個Word文件中的對應關係:

三、建立Word外接程式

上面已經介紹了Word物件中主要幾個物件,在我們對Word文件進行操作的時候都是使用這些主要的物件來進行操作的,對於如何更好的掌握這些物件的使用?方法就是多寫程式來練習了。下面就實現一個常見的需求的——把Word文件轉換為PDf或xps檔案。這裡對於如何建立外接專案的過程就不介紹,具體的操作步驟和建立Excel解決方案是一樣,只是選擇的模板不一樣,Excel中選擇的是Excel 2010 外接程式模板,Word就自然選擇的是Word 2010外接程式模板了。下面具體介紹實現該需求的過程:

  1. 建立完Word 2010外接程式之後,右鍵專案——>新增——>新建項,選擇功能區(視覺化設計器),在名稱部分輸入:“ExportPDFRibbon.cs“;
  2.  點選工具箱,在”Office功能區控制元件"中拖入Menu控制元件,然後在Menu控制元件中插入兩個Button按鈕,分別命名為"PDF"和”XPS“
  3. 設計RibbonTab,因為上一專題中設計的Ribbon是一個獨立的選項卡,所以在本專案中,我不想建立獨立的Ribbon,想把Ribbon下的控制元件放在Home選項卡下,為了實現這個目的,必須把下圖中的幾個屬性設定下,具體屬性見下圖: 

4. 在ExportPDFRibbon.cs檔案的後臺程式碼(可以按F7來檢視後天程式碼)中插入下面的實現程式碼:

public partial class ExportPDFRibbon
    {
        private void ExportPDFRibbon_Load(object sender, RibbonUIEventArgs e)
        {
            // 為PDf和XPS按鈕註冊點選時間
            btnRibbonPDF.Click += new RibbonControlEventHandler(ExportDocument);
            btnRibbonXPS.Click += new RibbonControlEventHandler(ExportDocument);
        }

        // 匯出檔案方法
        private void ExportDocument(object sender, RibbonControlEventArgs e)
        {
          
            switch (e.Control.Id)
            {
                    // 判斷點選的按鈕ID
                case "btnRibbonPDF":
                    // 開啟儲存檔案視窗
                    using (SaveFileDialog saveFileDialog = new SaveFileDialog())
                    {
                        // 設定儲存檔案視窗的相關屬性
                        saveFileDialog.Filter = "All File(*.*)|*.*";
                        saveFileDialog.DefaultExt = ".pdf";
                        saveFileDialog.RestoreDirectory = true;
                        // 在儲存檔案視窗中點選儲存按鈕
                        if (saveFileDialog.ShowDialog() == DialogResult.OK)
                        {
                            // 匯出為PDF格式
                            Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat(
                                saveFileDialog.FileName,
                                Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);
                        }
                    }
                    break;
                case "btnRibbonXPS":
                    using (SaveFileDialog saveFileDialog2 = new SaveFileDialog())
                    {
                        saveFileDialog2.Filter = "All File(*.*)|*.*";
                        saveFileDialog2.DefaultExt = ".xps";
                        saveFileDialog2.RestoreDirectory = true;
                        if (saveFileDialog2.ShowDialog() == DialogResult.OK)
                        {
                            // 匯出為XPS格式
                            Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat(
                                saveFileDialog2.FileName,
                                Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatXPS);
                        }
                    }
                    break;
                default:
                    return;
            }
        }
    }

通過上面的步驟就可以完成開始提出的需求:把Word文件儲存為PDF或XPS檔案,具體執行結果為:

點選PDF按鈕之後,會彈出另存為視窗,在彈出的視窗中輸入你想儲存的名稱,點選儲存按鈕之後,此時你可以在儲存的位置中看到儲存的檔名。

四、小結

到這裡,本專題的內容就介紹完成了,本專題主要介紹了Word物件模型,通過對物件模型中各物件的使用來對Word文件進行操作,關於對Word文件更多的操作內容我會放在實現Office自動化專題中向大家介紹,最後實現了一個簡單的需求——把Word檔案轉換為PDF或xps檔案。希望通過本專題大家可以用VSTO技術來進行Word操作,然後在下一個專題中將為大家介紹下OutLook相關的內容。