接觸VSTO純屬偶然,前段時間因為忙于一個項目,在客戶端Excel中制作一個插件,從遠程服務器端(SharePoint Excel Services)上下載Excel到本地打開,用戶編輯后再上傳回服務器端。當時工期緊迫,臨時查了些資料,用VSTO + Excel COM API完成。正因為這個項目,我發(fā)現(xiàn)了VSTO的強大功能與潛力,決定抽出一些時間來好好研究下。
本系列所有示例代碼均在 Visual Studio 2010 Beta 2 + Office 2010 Beta 下測試通過
一、什么是VSTO?
VSTO = Visual Studo Tools for Office,是.net平臺下的Office開發(fā)技術(shù)。相對于傳統(tǒng)的VBA(Visual Basic Application)開發(fā),VSTO為中高級開發(fā)人員提供了更加強大的開發(fā)平臺和語言,并部分解決了傳統(tǒng)Office開發(fā)中的諸多問題(難于更新、可擴展性差、難以維護、安全性低等),開發(fā)人員可以使用熟悉的技術(shù)來構(gòu)建更加靈活的、強大的、跨平臺的企業(yè)級解決方案。
二、為什么要進行Office開發(fā)?
Office擁有強大的數(shù)據(jù)分析、顯示和計算能力,尤其在桌面領(lǐng)域,已經(jīng)成為了辦公自動化的行業(yè)標準。雖然Office功能強大,但是也不可能滿足各行各業(yè)的特定需求,如果能夠借助于Office構(gòu)建企業(yè)的個性需求,那將十分具有吸引力。這樣,在不需要其他專業(yè)軟件的情況下,就可能完成既定的目標。
三、Office開發(fā)簡史
1、VBA(Visual Basic Application)
微軟提出的第一種Office開發(fā)解決方案就是VBA,在20世紀九十年代VBA紅極一時,借助于當時如日中天的Visual Basic,VBA取得了巨大的成功,無論是專業(yè)的開發(fā)人員,還是剛?cè)腴T的非開發(fā)人員,都可以利用VBA完成簡單或復雜的需求。但是VBA本身擁有很多的局限性,VB語言雖然簡單,但是其語法令中高級開發(fā)人員不太適應,尤其是VBA的開發(fā)環(huán)境過于簡單,缺少與時俱進的高級功能,使得VBA開發(fā)陷入了瓶頸。
2、VSTO 1.0(VSTO 2003)
時光跨入21世紀,微軟發(fā)布了.net平臺,并推出了新千年的新語言:C#,VBA一統(tǒng)Office開發(fā)天下的情況終于有所轉(zhuǎn)變。從Office 2003開始,Office正式由一個桌面辦公平臺轉(zhuǎn)化為了桌面開發(fā)平臺,微軟也適時推出了VSTO 2003,即VSTO 1.0。正是由此開始,Office開發(fā)跨入了一個新的時代,開發(fā)人員可以使用更加高級的語言和熟悉的技術(shù)來更容易的進行Office開發(fā)。VSTO 1.0完全編程支持Office 2000和Office XP,提供了以文檔為中心的開發(fā)平臺,開發(fā)人員使用.net framework 1.1開發(fā)Office中的一些自動化程序等。
3、VSTO 2.0(VSTO 2005 SE)
VSTO 2.0隨同Visual Studio 2005推出,提供了大量新特性:
4、VSTO 3.0(VSTO 2008)
VSTO 3.0隨同Visual Studio 2008發(fā)布:
對于Office解決方案開發(fā)來說,VSTO是簡單但強大的框架。這個框架為每個Office開發(fā)者帶來了許多令人驚嘆的好處:窗體控件、類、安全性、服務器可測量性、面向?qū)ο筇卣鳌⑼暾?、易發(fā)布,等等。
1)、更安全的托管代碼擴展
VSTO允許托管和非托管代碼無縫地放在一起到相同的.NET程序集里,這允許開發(fā)者保留非托管代碼而無須完全重寫。帶有鏈接或引用托管代碼程序集的文檔或工作簿被作為托管代碼擴展。通過使用VSTO在Word或Excel中創(chuàng)建托管代碼擴展,與宏相似但更安全。使用VSTO,能夠創(chuàng)建僅需要裝載數(shù)據(jù)的模板。
2)、數(shù)據(jù)緩存
數(shù)據(jù)緩存,簡單地說,就是在內(nèi)存中存儲數(shù)據(jù)以便于快速訪問。Microsoft Office Word文檔或Excel工作簿有一個隱藏的控件,稱之為運行時存儲控件(Runtime Storage Control),存儲緩存的數(shù)據(jù)。VSTO提供數(shù)據(jù)緩存功能,使用C#中的ServerDocument類,通過應用程序外部到Office來操控數(shù)據(jù)緩存,無須訪問Word或Excel對象模型。
3)、自定義功能
使用可重復使用的類,VSTO 3.0提供極好的控制來自定義Office應用程序。不像VBA開發(fā)者,VSTO開發(fā)者不局限于VBA函數(shù)庫。VSTO提供了相當廣泛的類、對象和事件來創(chuàng)建Office商業(yè)解決方案。使用VSTO,開發(fā)者能夠為Office應用程序自定義功能。這能夠簡單到在應用程序命令欄中添加按鈕或自定義任務窗格,或者復雜到用于訪問不同數(shù)據(jù)源的數(shù)據(jù)報表模板。
4)、自定義用戶界面
VSTO提供Windows窗體控件,幫助你為Office解決方案開發(fā)富用戶界面(UI)。通過使用大量各種各樣的控件集,VSTO開發(fā)者能夠為用戶創(chuàng)建豐富的數(shù)據(jù)視圖。每種和每類Windows窗體控件都有自已的屬性、方法和事件設置,適合不同的需要。
通過在文檔和任務窗格里使用控件,VSTO使創(chuàng)建豐富的用戶界面更容易。例如,可以創(chuàng)建一個活潑的按鈕命令產(chǎn)生套用信函。又如,假設公司在其服務器上存儲了數(shù)據(jù)內(nèi)容,用戶在處理文檔時想從服務器中引用一些內(nèi)容并且不想離開當前編輯的文檔,使用VSTO可以使服務器內(nèi)容在文檔的任務窗格中可用而無須干擾用戶當前的工作。
5)、智能標記
智能標記是Office應用程序能夠在文檔里識別的字符串。啟用智能標記,Word試圖識別文檔中某類數(shù)據(jù),通過紫色的點劃線來顯示。單擊智能標記,出現(xiàn)特定數(shù)據(jù)類型的可能操作的列表。VSTO給Office開發(fā)者提供了對象模型,可用于為文檔和工作簿創(chuàng)建智能標記。
6)、WPF支持
WPF能用于創(chuàng)建豐富的、具有吸引力的外觀。在VSTO環(huán)境中可使用WPF。VSTO的可視設計器支持Windows窗體和WPF控件的使用。WPF為創(chuàng)建基于客戶和基于網(wǎng)絡的應用程序提供了可靠的編程模型,并且在商務邏輯和UI之間呈現(xiàn)清楚的分離。
7)、可視化的設計器
VSTO為Office應用程序提供了可視化的設計器,例如Word 2007、Excel 2007,顯示在Visual Studio IDE里。在Visual Studio IDE里創(chuàng)建窗體只需拖動并放置窗體到Office文檔中。開發(fā)者能夠訪問Visual Studio IDE中的許多工具和功能,例如智能感知、拖放控件和數(shù)據(jù)源。VSTO也提供了Ribbon可視化設計器,用于通過使用簡單的.NET應用程序編程模型自定義Office功能區(qū)和編程。
8)、安全改進
VSTO安全模型包含從Office信任中心和Visual Studio Tools for Office運行時的廣泛支持,幫助解決VBA代碼通常涉及的安全問題。VBA安全模型有許多缺點,容易使用VBA開發(fā)許多病毒。為了安全地運行VBA宏,用戶機器中必須設置安全性為高,并且使用數(shù)字簽名。更重要的是,這些操作都需要用戶手工執(zhí)行。在VSTO 3.0中,已經(jīng)修改了安全模型。VSTO創(chuàng)建了安全策略,每次創(chuàng)建工程時必需在計算機中運行和調(diào)試解決方案,在發(fā)布前簽署程序集。
9)、可維護性
為Office系統(tǒng)開發(fā)的VSTO解決方案更容易維護。更新已發(fā)布的解決方案,修改代碼,以及更新單個的程序集將幫助更多的資源在相同文檔的多個副本里做相同的事情。所有代碼將駐留在程序集里。在使用宏時,腳本駐留在Office文檔里,無論何時想更新代碼,必須修改每一個包含代碼的文檔。使用VSTO 3.0,能夠通過簡單地修改代碼和更新單個的程序集來管理應用程序級加載項,無須在相同文檔的多個副本中做同樣的事情。
VSTO 3.0的新功能
VSTO 3.0具有大量的新功能,也增強了現(xiàn)有的關(guān)鍵功能。下面列出在VSTO 3.0中可用的改進Office解決方案開發(fā)工作的一些關(guān)鍵的新功能:
?
?
?
VSTO架構(gòu)
VSTO應用程序由Office應用程序和.NET程序集組成。
?
?
VSTO架構(gòu)的核心組件是文檔級定制、應用程序級加載項和文檔級的數(shù)據(jù)模型。VSTO的新架構(gòu)允許編寫和運行帶有宏的Office應用程序。
上圖表明Office 2007解決方案邏輯架構(gòu)。VSTO能夠使Office開發(fā)者為InfoPath、Word和Excel文檔創(chuàng)建文檔級定制,而對于Outlook、PowerPoint和Visio,VSTO不支持文檔級定制。
VSTO提供了非常好的面向?qū)ο缶幊讨С帧?/span>VSTO提供了對C#編程語言的完全支持,允許在Office解決方案中執(zhí)行面向?qū)ο缶幊?。面向?qū)ο缶幊淌且环N軟件編程方式,程序結(jié)構(gòu)基于對象之間的交互,以執(zhí)行任務。
VSTO的架構(gòu)設計幫助Office開發(fā)者實現(xiàn)了應用程序和數(shù)據(jù)的分離,提供開發(fā)應用程序級解決方案的增強支持,并且公布了多種對象使Office開發(fā)者更容易編寫Office應用程序。開發(fā)應用程序級和文檔級的解決方案是VSTO中另一項架構(gòu)改進。
開發(fā)方式
使用VSTO 3.0創(chuàng)建的解決方案類型分成兩類:文檔級解決方案和應用程序級解決方案。
1)、面向文檔的方式
面向文檔的方式被專門設計為接觸Word或Excel文檔的核心并包含原先設計的文檔不支持的信息。VSTO 3.0支持面向文檔的方式創(chuàng)建Word、Excel和InfoPath。實際上,面向文檔的方式提供指向非常特定任務的文檔,不會影響到文檔駐留的應用程序。
2)、面向應用程序的方式
VSTO 3.0具有為Office 2007套件中所有的應用程序創(chuàng)建面向應用程序的方式的能力??梢詣?chuàng)建和執(zhí)行向Office應用程序中添加了各種功能和特征的加載項。
VSTO開發(fā)和部署
VSTO系統(tǒng)3.0運行時,運行Office 2007解決方案的首要需求,被內(nèi)置到VSTO中。而VSTO 3.0被內(nèi)置到Visual Studio 2008安裝中。
使用VSTO創(chuàng)建Office應用程序
在Visual Studio 2008中包括VSTO,也就是說,Microsoft首次將Visual Studio 2008和VSTO 3.0綁在了一塊。在VSTO 3.0中,Microsoft Office工具變得更加強大,因為Microsoft使Office開發(fā)環(huán)境對開發(fā)者更加友好,通過創(chuàng)建新的開發(fā)環(huán)境幫助開發(fā)者創(chuàng)建Office應用程序里的功能的解決方案。因此,Office開發(fā)者能夠容易地創(chuàng)建解決方案,為他們的商務做更多工作,另一方面,重復使用Office應用程序中現(xiàn)有的可用功能,從而減少成本開支。
VSTO甚至可以整合現(xiàn)有的ERP系統(tǒng),增進企業(yè)的成長??梢允褂?/span>VSTO擴展Office客戶端應用程序,將VSTO與SharePoint Portal整合來提供企業(yè)解決方案,例如Office商務應用程序,包括客戶關(guān)系管理、供應鏈管理,等等。
1、VSTO開發(fā)環(huán)境
VSTO 3.0不是單獨的安裝包,當安裝Visual Studio 2008時,VSTO 3.0將與其它的框架和所需的組件一起安裝。
2、包(Package)
當安裝Microsoft VSTO 3.0分發(fā)包時安裝VSTO運行時。VSTO 3.0分發(fā)包是將Visual Studio 2008和.NET框架的功能和生產(chǎn)力帶給建立在Office 2007應用程序中的商務解決方案的框架。
上圖說明了VSTO的版本歷史,以及各版本之間的一些主要的不同。當前版本的VSTO僅支持編程語言VB.NET和C#。我們期望VSTO的下一個版本能支持其它的編程語言。
3、Visual Studio整合
為了容易創(chuàng)建定制的用戶界面,VSTO 3.0在Visual Studio里提供了Office應用程序的可視化表現(xiàn)。VSTO 3.0很好地與Visual Studio 2008整合在一起,為Office開發(fā)者提供了完整的開發(fā)和部署Office解決方案的工具。Visual Studio 2008能夠使開發(fā)者創(chuàng)建可升級的Office商務應用程序、改變主要的Office UI特征、支持工作流、以及創(chuàng)建更容易的部署。
下面,看看Visual Studio 2008中Office 2007應用程序的典型的VSTO項目模板。
Visual Studio 2008已經(jīng)打包了使用VSTO創(chuàng)建Office解決方案所需要的全部VSTO 3.0組件。當安裝Visual Studio 2008時,所有相關(guān)的安裝,包括VSTO 3.0的項目模板、Office開發(fā)引用和其它組件,都被安裝并完全整合到新的Visual Studio 2008開發(fā)環(huán)境中。
4、創(chuàng)建VSTO解決方案
在開發(fā)和傳遞創(chuàng)新的Microsoft技術(shù)方面,Visual Studio 2008是非??焖佟f(xié)同性好和靈活的,包括增強的語言和數(shù)據(jù)功能。Office 2007中支持的C#和VB.NET是增強的語言特性之一,并且容易與其它數(shù)據(jù)源交互數(shù)據(jù),例如Microsoft SQL服務器,是數(shù)據(jù)特性之一。這些特性確保開發(fā)者能夠快速地創(chuàng)建連接的應用程序,傳遞下一代軟件實踐,以及克服應用程序軟件開發(fā)挑戰(zhàn)。
上圖表現(xiàn)了Office解決方案的開發(fā)環(huán)境。在圖中,客戶端代表開發(fā)環(huán)境機器,在Visual Studio 2008里面的VSTO 3.0代表VSTO整合在Visual Studio中,Office 2007客戶端工具是Office應用程序,包括Word、Excel、InfoPath等,應該被安裝在客戶端機器上。
使用Visual Studio 2008開發(fā)環(huán)境能夠創(chuàng)建應用程序級、數(shù)據(jù)中心解決方案。數(shù)據(jù)中心解決方案是集中于數(shù)據(jù)操作和數(shù)據(jù)存儲的功能。
Visual Studio 2008開發(fā)環(huán)境使得開發(fā)帶有主要的Office 2007系統(tǒng)特征設計時和運行時支持的解決方案成為可能,例如功能區(qū)、自定義任務窗格、文檔級解決方案、Outlook窗體區(qū)域,等等。
功能區(qū)是Office應用程序中表現(xiàn)菜單項的新方式。在新開發(fā)環(huán)境中,有可視化設計器,能夠拖拉功能區(qū)里的控件,容易設計自定義的功能區(qū)菜單。甚至數(shù)據(jù)相關(guān)的操作,例如創(chuàng)建數(shù)據(jù)連接,有數(shù)據(jù)連接向?qū)菀讋?chuàng)建數(shù)據(jù)連接。
在創(chuàng)建的Office項目解決方案中,可以看到列出的引用,例如System.AddIn、System.Core等等,它們被自動裝載作為項目模塊的一部分。這使得開發(fā)者更容易開始編程,不需要像以前一樣手工添加引用和驗證解決方案。
通過使用基于XML的數(shù)據(jù)/視圖分離和編程性,Office開發(fā)者能夠?qū)⑸虅諗?shù)據(jù)整合到文檔里。
5、查看IDE窗口
Visual Studio是一款極其優(yōu)秀的產(chǎn)品,專門為開發(fā)者設計,是開發(fā)者最常使用的開發(fā)工具之一,內(nèi)置有IDE,能夠使開發(fā)者使用Microsoft技術(shù)創(chuàng)建不同類型的應用程序。通常,IDE由源代碼編輯器、編譯器和調(diào)試器組成。默認情況下,Microsoft Visual Studio IDE提供智能感知、調(diào)試、編譯、訪問控件、以及創(chuàng)建解決方案的能力。最新增強了功能區(qū)設計器、拖放控件、并為Office應用程序增強了調(diào)試功能,縮減了開發(fā)時間,提高了開發(fā)者的效率。
內(nèi)置的VSTO對象模型被設計來支持.NET,許多常用的功能被打包且很好地整合了。在新版本中,諸如Word、Excel和InfoPath的目標窗口工具被直接整合到IDE界面里,幫助Office開發(fā)者無須對象模型的高級知識就能創(chuàng)建解決方案。對于Word 2007和Excel 2007,VSTO在Visual Studio IDE中也有可視化設計器。
上圖中,可以看到Visual Studio 2008中如何顯示Excel 2007可視化設計器。同樣,Visual Studio 2008 IDE也提供了可視化功能區(qū)設計器,允許Office開發(fā)者使用拖放界面來設計功能區(qū),使用標準的.NET代碼與功能區(qū)交互。
上圖顯示Office解決方案開發(fā)里功能區(qū)的可視化設計器,通過提供拖放控件和容易訪問資源,簡化了功能區(qū)開發(fā)過程。同樣,Visual Studio 2008簡化并加速了操作窗格、指定文檔的任務窗格、創(chuàng)建指定應用程序的自定義任務窗格以及Outlook窗體區(qū)域設計器的開發(fā)過程。
6、調(diào)試
調(diào)試是軟件開發(fā)中最重要的任務之一,并且是所有開發(fā)者在他們的開發(fā)過程中會遇到無數(shù)次的一項任務。在Visual Studio IDE中,開發(fā)者為調(diào)試.NET應用程序有幾種可用的調(diào)試選擇。
Visual Studio 2008為使用VSTO 3.0的Office解決方案開發(fā)提供了一組強大的創(chuàng)建和調(diào)試工具,與VSTO 2.0相比是一項大的改進。在創(chuàng)建配置時,開發(fā)者能夠選擇他們想創(chuàng)建的組件,排除他們當前想避免創(chuàng)建的組件。開發(fā)者可以像項目一樣,靈活地為解決方案創(chuàng)建配置。
我們期望下一版本能帶來什么?
基于筆者的分析和作為一名VSTO開發(fā)者的經(jīng)驗,我們期望下一版本的VSTO:
5、VSTO 4.0(VSTO 2010)
雖然現(xiàn)在VSTO 4.0還沒有正式發(fā)布,但是從測試版已經(jīng)可以看出些端倪:
四、Office開發(fā)存在的問題
由于歷史遺留問題,Office本來是設計與COM協(xié)同工作的,這就使得從一開始VSTO就有點"水土不服"。.net代碼通過封裝COM與Office通信,但是有時這種配合卻并不協(xié)調(diào),Office對象模型并不總是遵循.net設計所采用的命名規(guī)則和設計模式。
五、Visual Basic的"優(yōu)勢"
在C# 4.0發(fā)布之前(雖然現(xiàn)在也沒有發(fā)布),用VB開發(fā)Office比用C#方便的多,這是因為VB簡化了對Office對象模型的調(diào)用方法。但是隨著C# 4.0的即將發(fā)布,VB的這種"優(yōu)勢"將會變得愈來愈小。園子里有很多人已經(jīng)寫過C# 4.0的新特性,這里僅提取出針對于COM操作的改進:
Improved COM Interoperability
在C#中在調(diào)用COM對象如office對象時,經(jīng)常需要寫一堆不必要的參數(shù):
object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
4.0中就可以直接寫成:
doc.SaveAs("Test.docx");
C#4.0對COM交互做了下面幾方面的改進:
Automatic object -> dynamic mapping (自動類型轉(zhuǎn)換)
Optional and named parameters (可選命名參數(shù))
Indexed properties (索引屬性?)
Optional "ref" modifier (可選 ref 修飾)
Interop type embedding ("No PIA") (主調(diào)程序集嵌入)
對第1點和第5點的簡單解釋如下:
在COM調(diào)用中,很多輸入輸出類型都是object,這樣就必須知道返回對象的確切類型,強制轉(zhuǎn)換后才可以調(diào)用相應的方法。在4.0中有了dynamic的支持,就可以在導入這些COM接口時將變量定義為dynamic而不是object,省掉了強制類型轉(zhuǎn)換。
PIA(Primary Interop Assemblies)是根據(jù)COM API生成的.Net Assembly,一般體積比較大。在4.0中運行時不需要PIA的存在,編譯器會判斷你的程序具體使用了哪一部分COM API,只把這部分用PIA包裝,直接加入到你自己程序的Assembly里面。
六、開發(fā)工具
1、Office 2007 Enterprise Edition With SP2或更新版本
2、Visual Studio 2008 Team System With SP1 或更新版本
3、OpenXML SDK 2.0
七、推薦資源
1、書籍:《VSTO 開發(fā)指南》,VSTO的權(quán)威著作,強烈推薦。
2、網(wǎng)站:
1)MSDN VSTO版塊
2)兩位VSTO大師的博客,也是《VSTO 開發(fā)指南》的共同作者:
八、VSTO 4.0 Hello World
最后,讓我們用一個實例來結(jié)束本次研究:)
1、新建一個Office 2010的Excel Workbook項目:
2、在工作簿中添加一個按鈕,添加一個Click事件:
3、彈出歡迎信息"
4、全部保存,F(xiàn)5運行:
一個最簡單的VSTO 4.0項目就完成了。
九、小結(jié):
本次研究花費了大量篇幅敘述了VSTO的歷史變遷及其歷代版本中的增強功能,后續(xù)篇章會注意研究各功能的具體實現(xiàn)。本次的示例非?;?,基本可以忽略,但是卻包括了創(chuàng)建一個完整的VSTO項目的全部步驟,后續(xù)練習將會在此基礎上進行擴充,實現(xiàn)一些高級功能。
聯(lián)系客服