係統粉 > IT資訊 > 微軟資訊

IT之家學院:用微軟VS2017為Word開發加載項——入門教程

發布時間:2017-07-27    瀏覽數:

Word是一個大家平時辦公中最常用的文字處理軟件之一,其功能包羅萬象,十分強大。但不排除某些用戶有獨特而專有的需求,Word自帶的功能並沒有考慮到,要由用戶手動操作若幹步方能完成。這些操作有時存在複用的價值,那麼不妨把它們抽象並固定下來,變成Word裏的一項功能吧。

對於簡單的操作複用,我們可以通過內置的宏或VBA來實現。Word中甚至還提供了“錄製宏”的功能,來降低編寫代碼的門檻。不過宏和VBA有個缺點,即不能利用Ribbon欄。(有同學說過可以使用XML映射來實現,但我沒試過。)而開發一個加載項,或者說VSTO外接程序,就可以克服這個缺點。

今天,我們就來編寫一個簡單的VSTO外接程序,作為入門。

一、安裝Visual Studio 2017,並在安裝時確保選中Office/SharePoint這一選項。

IT之家學院:用微軟VS2017為Word開發加載項——入門教程(1)

二、打開VS2017,新建項目。分別選中Visual Basic→Office\SharePoint→Word 2013和2016 VSTO外接程序。(選擇VB是因為其語法與VBA的語法類似,學過VBA的同學可以馬上上手,當然選擇C#也是可以的。嚴格來說,此處的VB指的是VB.net,而VBA則基本繼承VB6.0,兩者的語法在某些地方還是有很大區別的。)為這個項目起個名字,比如WordAddInTest。

IT之家學院:用微軟VS2017為Word開發加載項——入門教程(2)

三、新建項目後,呈現在麵前的是ThisAddIn.vb裏的內容,我們稍後再來關注它。現在先來創造一個Ribbon界麵。通過解決方案資源管理器添加一個新項,類型則選擇“功能區(可視化編輯器)”,這樣我們就得到了一個新的帶有空組的Ribbon欄。

四、接下來,就是“搭積木”時間了。我們可以看到,在工具欄中出現了一些Ribbon控件,它們分別是Box、Button、ButtonGroup、CheckBox、DropDown、EditBox、Gallery、Group、Label、Menu、Separator、Tab、ToggleButton。

IT之家學院:用微軟VS2017為Word開發加載項——入門教程(3)

現在就對這些控件做一些簡單的介紹。

1.容器控件:Tab、Group、Box和ButtonGroup。

a.Tab是選項卡,如果你希望使用不止一個選項卡,你可以拖放一個新的Tab。

b.Group是選項組,通常一個選項卡由若幹個選項組組成。有時選項組右下角會標有一個灰色箭頭,單擊它能啟動一個窗體。這種窗體的啟動可以通過Group的DialogLauncher來實現。

c.Box(不可見)是用來排列具體的控件的,可以使控件橫向或者縱向排列,目的是使界麵井然有序。

d.ButtonGroup(不可見)則是專為排列按鈕而存在的,而且隻能是橫向排列。

2.不可操作控件:Label和Separator。

a.Label即標簽,是用來顯示提示性文本的。

b.Separator即分割線,它可以用來位於同一個選項組中而功能又有所區別的控件或控件組。

3.單一控件:Button、CheckBox、CombolBox、DropDown、EditBox和ToggleButton。

a.Button是最普通的按鈕,可以通過單擊它執行一些操作。

b.CheckBox是複選框,可以用它來打鉤。

c.CombolBox是組合框,可以用它來輸入文本或從下拉列表中選擇。

d.DropDown是下拉框,無法向它輸入文本,隻能從列表中選擇。

e.EditBox是編輯框,可以用它來輸入文本。

f.ToggleButton是類似開關的按鈕,按鈕在按下(呈現深色)時,是一種狀態;鬆開時(恢複淺色)又是一種狀態。

4.複合控件:Gallery、Menu和SplitButton。

這三個控件的作用比較相似,都是能生成下拉選項供用戶選擇。Gallery的特點是可以在下拉選項的一行中橫向排列項目,且本身不能被用作按鈕響應單擊事件;Menu本身也不能用作按鈕;而SplitButton則可以相應單擊事件。

我們來看一張這些控件的示意圖,就容易明白了。

IT之家學院:用微軟VS2017為Word開發加載項——入門教程(4)

五、做完界麵以後,就可以著手編寫代碼了,但在開發具體的功能前,我們要先寫一點必需的代碼,為後續的工作鋪路。

1.新建一個標準模塊,用來存放公共的數據。我們把這個模塊命名為mdlPublic。

定位到Module mdlPublic的下一行,聲明Application接口,為了簡便,就叫App吧。

Module mdlPublic

Public App As Word.Application

End Module

2.回到第三步中提及的ThisAddIn.vb文件中,定位到Private Sub ThisAddIn_Startup Handles Me.Startup的下一行,對接口App進行實例化。

Private Sub ThisAddIn_Startup Handles Me.Startup

App = Globals.ThisAddIn.Application

End Sub

這段代碼的意思是,在加載項啟動時(Word顯示啟動畫麵時,正是加載項啟動的時候),獲取當前運行的Word實例,並賦值給尚未實例化的接口App。這跟開發具體的功能有很大的關係,因為我們要通過這個接口來對Word文檔進行操作。

好了,路已經鋪好了,熟悉VBA的同學馬上就可以自己玩兒去了,隻要把VBA中的Application全部改成這裏的App就可以了。不過還是來看簡單的一個例子。

當我們從網頁等地方複製文本時,有時會伴隨著大量討厭的空行,下麵我們就通過代碼來去除這些空行。

1.在Ribbon欄上放置一個按鈕,更改名字為btnDeleteEmptyLine,標題為“刪除空行”。然後在設計界麵時雙擊它,進入代碼編輯模式。

2.為了編寫代碼的便利,在首行先引入一個命名空間。

Imports Microsoft.Office.Interop.Word

3.然後編寫如下代碼,以實現具體的功能:

Private Sub btnDeleteEmptyLine_Click(sender As Object, e As RibbonControlEventArgs) Handles btnDeleteEmptyLine.Click

If App.Selection.Start = App.Selection.End Then App.ActiveDocument.Select

With App.Selection.Find

.ClearFormatting

.Text = "^p^p"

.MatchWildcards = False

.Forward = True

.Replacement.ClearFormatting

.Replacement.Text = "^p"

.Execute(Replace:=WdReplace.wdReplaceAll)

End With

End Sub

3.單擊VS工具欄上的啟動按鈕,片刻後Word就啟動了,開始了調試過程。我們可以測試代碼是否按預期工作。

這個例子其實是調用了Word的查找替換功能來實現刪除空行的目的,用VBA也能完成。

那麼VSTO相較於VBA,其優越性體現在哪裏呢?我認為有以下幾個方麵:

1.VSTO可以用最新的VS以VB.net和C#等語言進行開發,而VBA基於老舊的VB6.0,不光是語法,連開發環境都幾乎照搬,代碼會寫得很不舒服。

2.VBA是存儲在文檔中的,沒有做到功能與文檔的分離;而VSTO可以做到。而Office移動版會拒絕打開帶有宏和VBA的文檔,給人帶來不便。

3.VSTO可以使用.net Framework提供的豐富的類庫,輕鬆地實現五花八門的功能,相對來說,用VBA實現就比較麻煩。

4.與VB6.0一樣,VBA對Unicode的支持不良,無法讀取以UTF-8、UTF-16等編碼的文本,隻支持以係統默認代碼頁(ANSI)編碼的文本;而VSTO根本沒有這種問題。

當然VBA相較於VSTO唯一的優點是輕便,由Office程序內置,而開發VSTO外接程序要安裝VS。而綜合來看,肯定是VSTO的潛力要優於VBA的。

好了,入門就到這裏了,大家自己玩去吧!

想看到更多這類內容?去APP商店搜,天天都有小歡喜。

上一篇:《Forza 7》與Xbox One X中國首秀: 微軟攜多款遊戲亮相ChinaJoy 2017 下一篇:36年前的今天,微軟比爾蓋茨重金買下“MS-DOS”

相關資訊

最新熱門應用

電腦問答