前言: “Visual Studio Tools for Office”是微軟針對Office開發而推出的工具集,可以使用VB或C#擴充Office應用程式。最大的變化是使用VS開發環境來建構你的程式,而不再像以前一樣使用VBA。本章的主要内容是分析微軟推出VSTO的真正目的與使用方法,以及對VSTO優勢與不足的梳理。 PS:VSTO到目前五個版本的發展,不是本講解的重點,相關資訊可以問度娘。 目錄:
- 了解VSTO從Hello Ribbon開始
- Ribbon的酒杯——IRibbonExtensibility
- 我眼中VSTO的發展
第一節、了解VSTO從Hello Ribbon開始 在《笑傲江湖》中華山派有氣宗和劍宗之分,雙方鬥争了幾十年。簡而言之,氣宗注重内在的修為,劍宗申明技法的高義。然地無分南北,俠無分氣劍。最終令狐大俠以獨孤九劍橫掃武林,你說他是氣宗還是劍宗? 天地之道,剛柔互用,不可偏廢。技術也是一樣,有時需要懂理法,有時需要知技法,技與術本來就是互補。這系列講義,是從基礎知識入手還是先講實作方法?我也很猶豫。不過我明白,看這篇文章的人,重點不是尋求VSTO的實作邏輯,而是項目中用到MSAddin時如何下手、如何實作,如何更新舊的技術,用最新的VS建構某些功能。 按照這一指導思想,我以VS2010開始,一步步地教大家如何實作一個MSAddin插件。而開發時如果遇到不明确的或遺漏的,歡迎給我留言,我會繼續修訂! 1、使用C#VSTO建立Word Addin工程。 如下圖所示,在VC10的"Create Office Project"中與Word相關的内容有三項,可分為兩類:
- Application level :Word Addin ,應用于整個MSWord應用程式,常用作簽章、簽名等全文檔操作。
- Document level :Document、Template,應用于單個文檔,如特定報表、數學模型等專業性和針對性較強的操作。
2、添加Ribbon可視化設計器(Ribbon Designer) 右鍵"Solutioin"中目前項目,Add-〉New Item,添加如圖所示的“Ribbon Designer”。
自此,魂牽夢繞的可視化Ribbon設計器已經展現在你的面前了。我們拽入兩個Button,将其中一個的ControlSize設為“RibbonControlSizeLarge”。
在“Ribbon Designer”中輕按兩下Button,引入“button_Click”,加入MessageBox.Show() 3、F5編譯運作吧!
如果你的人品不是特别低的話,響應Button的Messagebox已經彈出來了。 如果真是沒彈出來,别着急,總共就三步重新來一次,祝你好運! 第二節、Ribbon的酒杯——IRibbonExtensibility 我們用了非常簡單的方法,就建立了具有Ribbon風格的Word_Addin插件,但我們還不知道Ribbon風格界面是如何描述、如何運作的? 在工程中,右鍵Ribbon設計器中的Ribbon1界面,可通過"Export Ribbon to xml"菜單得到RibbonXml與Ribbon.cs檔案:
- RibbonXml為定義菜單的描述檔案。
- Ribbon.cs包含了處理代碼。
Ribbon.Xml檔案描述如下。可以清晰地展現出"Ribbon->Tabs->Group->Command"之間的層級關系。
<?xml version=" 1.0" encoding=" UTF-8"?>
<customUI onLoad=" Ribbon_Load" xmlns=" http://schemas.microsoft.com/office/2006/01/customui ">
< ribbon>
< tabs>
< tab idMso ="TabAddIns " label ="RTab ">
< group id ="group1 " label ="New Group ">
< button id ="button1 " label ="button1 " size ="large " />
< button id ="button2 " label ="button2 " showImage ="false " />
</ group>
</ tab>
</ tabs>
</ ribbon>
</customUI>
備注:第三方Ribbon.xml編寫工具我用過幾個,其中印象最深的當屬" Office Ribbon Editor "。在以後的工作中,各位也許會用得到。 我附上下載下傳位址:Office Ribbon Edit 4.5
Ribbon.cs檔案中給我們最大的啟發有兩條:
- 對基類IRibbonExtensibility的引入。
- GetCustomUI()方法的支援。
namespace Microsoft.Office.Core
{
// Summary:
// The interface through which the Ribbon user interface (UI) communicates with
// a COM add-in to customize the UI.
[ TypeLibType(4160)]
[ Guid("000C0396-0000-0000-C000-000000000046" )]
public interface IRibbonExtensibility
{
// Summary:
// Loads the XML markup, either from an XML customization file or from XML markup
// embedded in the procedure, that customizes the Ribbon user interface.
//
// Parameters:
// RibbonID:
//
// Returns:
// String
[ DispId(1)]
string GetCustomUI(string RibbonID);
}
}
自此,我們對“Hello Ribbon”示例的了解已經上升了一個層次。我們不僅會使用IDE建立Ribbon工程,我們還知道Ribbon菜單的定義規則,更重要的我們已經知道Ribbon菜單的載入原理。為我們已後使用 非托管方式 ,如ATL建立MSOfficeAddin插件奠定了理論基礎。 吃程式員這口飯,我們時常一會兒缺酒,一會兒缺酒杯。現在葡萄美酒夜光杯拿在我手,還差的隻有天空明月,對席良朋! 第三節、我眼中VSTO的發展 到上一小節為止,我認為"Hello Ribbon"的工作已經完成了。當然,這個樣例隻能将您帶到Ribbon的門口,能走多遠,要看際遇。不過,我願與您同行! 對Office擴充開發的手段,大體有三種途徑,我對其适用範圍概括如下: 第一、用VB建立Office解決方案多用于:
- 非托管插件編寫方式,禁止.Net環境在使用者電腦上安裝的情況下。
- 為Office2003以及更低的版本開發。
- 為MS Access建立應用。
第二、用VSTO建立的Office解決方案多用于:
- 非常直覺且高效地設計Ribbon功能區和更豐富的控件集。
- 建立具有穩定安裝和解除安裝的Addin插件。
- 提供多種程式設計(Template、Document、Application)模型擴充Office對象。
第三、使用ATL建立的Office解決方案多于用:
- 非BASIC解釋性語言,隐藏代碼實作邏輯。
- 更高的性能,非托管附加元件可以獲得更好的性能、更快的加載速度。
- 對消息處理的支援。
- 在OA、MIS中可以使用<object>标簽中codebase實作統一部署和自動更新。
Office解決方案的實作手段,沒有孰優孰劣,隻有哪個更合适、更高效、更簡潔。 總結與後記: 本章的内容是通過C#中的VSTO,簡要介紹Office插件開發。有興趣的朋友也可以通過VB中的VSTO實作上述樣例,沒有太大差别,同樣的Ribbon Designer,同樣的IRibbonExtensibility,不同的隻有文法的表述。 源碼下載下傳(不需積分): C#工程下載下傳:WordAddIn1 VBA工程下載下傳:WordAddin2
大家有沒有想過,微軟推出VSTO,在C#與VB工程中都支援,但Visual C++工程卻沒有。就實作手段來說,Office辦公套件中的Word、Excel元件,都是非托管代碼編寫的。而托管代碼C#建立的解決方案卻能與Office進行互動!
- 此番舍簡就繁到底是為了什麼?
- 托管VSTO如何與Office進行互動?
- VSTO發展到今天,為什麼還存在相當多VC工程建立的解決方案?
我始終堅信,解決問題的方法與思路,比熟練掌握一些工具更重要!這些認識需要正确的引導與個人的領悟。 這些年,我也是斷斷續續做一些圍繞Office的開發工作,涉及的範圍很廣,但領悟都不算深刻。人之患,在好為人師!編寫這系列教程,一是梳理下相關知識點,加深印象;二是為了初行Office開發的朋友,願能給您帶來一點兒啟迪,别無他求。
本章完! 北塔版權所有,轉載請注明出處。