接觸vsto,開發word外掛程式的利器

2021-09-02 22:15:35 字數 1951 閱讀 4564

研究word外掛程式有一段時間了,現在該是總結的時候了。

首先咱們來了解下什麼是vsto?所謂vsto,就是vs面向office提供的乙個開發平台。乙個開發平台至少包含兩個要素:開發工具(sdk)和執行環境(runtime)。那麼我們先搭建開發環境,我用的是vs2010,選擇的.netframework是 4.0,由於這個外掛程式不是單獨的乙個解決方案,它和我們的winform客戶端強耦合在一起,否則,我肯定選擇至少vs2013,或者vs2015了。

開啟vs後,選擇office開發模板。office外掛程式開發分為兩種,一種是文件級別的開發,就是你的應用程式只是針對特定的文件進行擴充套件,其它的文件不受影響。另一種是外接應用程式,就是針對所有的文件起作用。我是針對所有的word文件進行外掛程式開發。外掛程式開發過程其實還是相當輕鬆的,因為微軟搭建了好了框架,我們只需要專注自己的業務。

說到此處,貌似山窮水盡,沒得說了。可是背後隱藏的東西實在太多,只是一言難盡,那只好娓娓道來。

正所謂,知己知彼,方能百戰不殆。我們來了解下word。雖然叫相同的名字,可是各個版本差異比較大。word 2003,以簡潔的介面出現在window xp上面。我自己也用了很長時間。其實隨著window版本的不斷發展,word也隨之發展。

office 2003:office 11 :xp

office 2007:office 12 :xp

office 2010:office 14:win7

office 2013:office 15:win7,win8,win10

office 2016:  office 16(雲端):  win10

這些組合,我覺得是很常規的組合,值得一提的是office 2013和office 2010使用者數量肯定是最多的(根據統計學原理)。office 2016的各個元件,沒法單獨安裝(其實有很複雜的解決辦法,一般使用者可能真沒辦法),只能照單全收。這些是word版本與內部代號以及作業系統的對應關係。

站在開發的角度,word開發用的是com元件技術。而我們用.net去開發word外掛程式,其實是開發word的乙個載入項,要開發com載入項,必須實現idtextensibility2介面。這個介面包括5個方法。其中最重要的兩個方法是onconnection和onstartupcomplete。vsto底層封裝了這些東西,暴露出來這兩個事件,我們在建立外掛程式的時候,可以去實現自己的邏輯。

visual studio tools for office runtime 包含一些非託管 dll,office 應用程式使用這些 dll 載入執行時和 office 解決方案。

當使用者啟動 vsto 外接程式時,office 應用程式將調入 vstoee.dll 以執行載入 visual studio tools for office runtime 所需的任務。

vstoee.dll 將確保為解決方案和安裝的 office 版本載入 visual studio tools for office runtime 的正確版本。 雖然可以在同一臺計算機上安裝多個版本的 visual studio tools for office runtime,但是每次僅安裝 vstoee.dll 的乙個例項。 這是安裝在計算機上的執行時最新版本所附帶的 vstoee.dll。

vstoee.dll 載入相應版本的 visual studio tools for office runtime 之後,vstoloader.dll 執行載入解決方案程式集所需進行的大部分工作。vstoloader.dll 執行以下操作:

vstoloader.dll 還執行以下特定於 vsto 外接程式的操作:

word外掛程式與office的互動如下圖所示:

注意,上圖中有個主互操作程式集,也就是pia,這個程式集隨著office一起安裝,也可以單獨安裝。它公布了com元件的內部物件,也就是word模型,供外掛程式呼叫。

我的VSTO之路 三 Word基本知識

自定義ribbon 自定義task pane vsto外掛程式中獲取word內容全文 修改word內容和樣式 其中關於如何建立ribbon和task pane的內容,我已經在前一篇文章中介紹了,如果你還不熟悉,可以看這裡。word object model 介紹 我來依次介紹這幾個物件 docume...

VSTO中開發Excle 常用的操作

6.設定單元格格式 顯示格式 setrange.numberformatlocal 0 紅色 0 背景色 setrange.interior.colorindex 3 邊框 setrange.cells.borders.colorindex 1 設定單元格中不同字元為不同顏色,這個功能只有到07後才...

我所接觸的敏捷開發

自從進入這個專案以來,我們採用的是敏捷開發,本部有八個專案組成員,客戶那邊有乙個on site,剛開始專案leader進行資料庫設計,以及任務模組分配,每個人都分到乙個或者幾個模組,然後進行開發,從頁面做到資料庫,這樣子下來每個人都對整個專案結構有個大概了解,隨著專案的進行,隔著一段時間,發布乙個版...