做Office相關(guān)的開發(fā)工作快一年多了,在這一年多里,在插件的開發(fā)中遇到了各種各樣的問題和困難,還好同事們都很厲害,在和他們的交流討論中學(xué)到了很多的知識(shí)。目前Office相關(guān)的開發(fā)資料是比較少的,最最開始的時(shí)候,我看的是一本英文資料,然后再就是MSDN上面去提問了。所以我想寫一點(diǎn)東西,讓大家也少走一些彎路。 這篇文章就簡要介紹一下Office開發(fā)的一些相關(guān)的知識(shí),使大家對(duì)這個(gè)有一個(gè)大體的了解。 首先來看一看Office 的開發(fā)方式。 一 Office開發(fā)方式1 VBA (Visual Basic Application) VBA是一種Visual Basic的宏語言,它應(yīng)該是最早的Office提供定制化的一種解決方案,在1994年發(fā)行的Excel 5.0版本中,就具備了VBA的宏功能。從名字上似乎可以看出他是VB的一個(gè)子集,和Visual Basic不同,VBA是一種宿主型語言。由于那個(gè)時(shí)候Visual Basic非?;?, VBA取得了很大的成功,無論是專業(yè)的開發(fā)人員,還是剛?cè)腴T的非開發(fā)人員,都可以利用VBA完成簡單或復(fù)雜的需求?,F(xiàn)在在一些辦公環(huán)境中,VBA用的非常多,比如國內(nèi)比較著名的ExcelHome論壇,上面就有很多關(guān)于Excel VBA的討論,而且VBA還能夠調(diào)研Com組件里面的一些方法,在其他的Office開放方式中,如VSTO或者SharedAddin中,VBA有時(shí)候可以輔助完成某些功能,如RTD函數(shù),UDF函數(shù)的調(diào)用,專用模板的開發(fā),動(dòng)畫效果的演示等等。不光是Office,有很多其他的軟件業(yè)比如比較有名的ArcGIS,CorelDraw等軟件,都提供了VBA的定制化解決方案。 但是他也有很多缺點(diǎn)。VBA本身擁有很多的局限性,比如缺少一些常用的類型,調(diào)試起來不方便,VB語言雖然簡單,但是現(xiàn)在又很多的開發(fā)者都使用的是.NET,VB的一些語法可能很多人不適應(yīng)。再就是VBA是一種腳本類型的解釋型的語言,在安全性比如源代碼容易被破解,就像Javascript保密性不好一樣,在執(zhí)行效率方面沒有一些編譯型解決方案來的快。舉個(gè)例子,比如說,我們可以把我們的自定義函數(shù)使用VBA來編寫,然后存儲(chǔ)為.xla文件,這樣在Excel中就可以調(diào)用我們的這些函數(shù)了。但是由于VBA是解釋型的語言,就像JavaScript那樣,每次運(yùn)行都要邊解釋邊運(yùn)行,而不是像其他一些語言,在編譯成二進(jìn)制后,就能直接加載運(yùn)行。所以可以將我們的自定義函數(shù)寫到類庫然后注冊(cè),或者直接使用C++,將函數(shù)寫到xll中,這樣效率和安全性方面要比VBA方式要好,這里只是稍微提一下,后面的文章會(huì)詳細(xì)介紹。 2 Shared Addin SharedAddin,就像Visual Studio可以外接插件一樣,也可以使用一些技術(shù)為Office開發(fā)一些插件。對(duì)VBA的一些問題,一些專業(yè)的開發(fā)人員,可以使用VisualBasic或者VisualC++等工具來引用Office的一些dll,來針對(duì)Office進(jìn)行開發(fā)。開發(fā)的時(shí)候?qū)ll注冊(cè)為com組件,并在注冊(cè)表里面進(jìn)行注冊(cè),這樣就可以在Office里面直接調(diào)用這些插件了。 Com Addin方式基本上解決了VBA存在的安全性及效率低的問題,但是他要求的門檻比較高,即使是專業(yè)的開發(fā)人員也不一定能夠很好的掌握。Com Addin還有一個(gè)優(yōu)點(diǎn)是,使用這個(gè)開發(fā)能夠彌補(bǔ)VSTO在某些版本尚不支持的尷尬,比如VSTO的Ribbon菜單在07以下版本中就不能支持,并且在1.0版本下不支持Application Level級(jí)別的開發(fā)。使用Com Addin開發(fā),能夠使得插件可以具有較好的兼容性。 GeodesiX是一個(gè)地理信息Excel插件,他能夠?qū)⒃贓xcel中與GoogleMap進(jìn)行交互,比如繪制專題圖,進(jìn)行緩沖區(qū)分析,疊加,圖示郵遞員問題等等。 3 VSTO (Visual Studio Tools for Office) 2000年微軟發(fā)布了.NET平臺(tái)戰(zhàn)略之后,推出了一系列運(yùn)行在.NET上新語言如C#和VB.NET。在這種情況下,開發(fā)者能夠使用.NET 平臺(tái)上的語言來開發(fā)Office。 從Office 2003開始,微軟推出了VSTO 1.0。VSTO主要是對(duì)Office的一些dll進(jìn)行了.NET封裝,使得我們可以使用.NET上的語言來方便的對(duì)Office的一些方法進(jìn)行調(diào)用。所以,Office開發(fā)跨入了一個(gè)新的時(shí)代,開發(fā)人員可以使用更加高級(jí)的語言和熟悉的技術(shù)來更容易的進(jìn)行Office開發(fā)。VSTO 1.0是伴隨著.NET 1.0平臺(tái)推出的,支持Office 03以上的所有版本。 對(duì)于企業(yè)及的應(yīng)用和開發(fā),VSTO或許是首要選擇,他極大地?cái)U(kuò)展了Office應(yīng)用程序的能力,使用.NET平臺(tái)支持的編程語言,能夠直接訪問.NET上面眾多的類庫。具有較好的安全機(jī)制。簡化了Office插件的開發(fā)和部署。 VSTO也有一些缺點(diǎn),比較明顯的是他依賴于.NET 平臺(tái),在部署的時(shí)候,可能需要在目標(biāo)機(jī)器上安裝.NET Framework框架,再者就是版本的兼容性,沒有哪一個(gè)VSTO版本能夠兼容所有的Office版本。 下面是VSTO的各個(gè)版本及對(duì)應(yīng)的支持的.NET平臺(tái)以及對(duì)各Office版本的支持。
以上圖表在 http://en./wiki/Visual_Studio_Tools_for_Office 的基礎(chǔ)上進(jìn)行了修改 提到VSTO,有一個(gè)比較重要的問題就是Document Level 還是Application Level程序,在創(chuàng)建VSTO應(yīng)用程序的時(shí)候,就必須進(jìn)行選擇。就像名稱所說的那樣,Document level就是指對(duì)單個(gè)Word或者Excel文檔進(jìn)行自定義開發(fā),該文件打開時(shí),就加載,關(guān)閉時(shí)就卸載。如果是Application Level級(jí)別的,就是對(duì)應(yīng)用程序中所有打開的文檔實(shí)例都能夠起作用,應(yīng)用程序加載時(shí)插件加載,應(yīng)用程序關(guān)閉時(shí)插件卸載。 SharedAdd和VSTO兩者很多人都弄不清楚,他倆既有相同的地方也有不同點(diǎn),關(guān)于這一點(diǎn)Cindy Meister大神有詳盡的比較,異同點(diǎn)有: 相同點(diǎn):
不同點(diǎn):他們也有很多不同點(diǎn),主要不同點(diǎn)如下:
SharedAddin以及VSTO開發(fā)方式在企業(yè)級(jí)應(yīng)用中使用的比較廣泛,下面是一些例子:
4 Office App 隨著Office 2013 和Office 365 的推出,Office更加注重網(wǎng)絡(luò)化功能,因此引入了新的編程方式,那就是Apps for Office。在VS2012 中,您可以使用內(nèi)置提供的Apps for Office模板創(chuàng)建基于Web的Office應(yīng)用程序。和傳統(tǒng)的安裝插件(VSTO)及 運(yùn)行宏(VBA)不同,在新版的Office中,用戶可以到微軟的Office App Store中去下載,安裝應(yīng)用程序,這些應(yīng)用程序在獨(dú)自安全的沙箱環(huán)境中運(yùn)行。Office Apps使用熟悉的Web技術(shù)開發(fā)如JavaScript,使得非常容易使用Mashup技術(shù)來聚合各種各樣的資源。 下圖展示的是使用在Excel中使用在線字典App來檢索信息和Bing App來繪制和渲染專題圖的效果。 還有一個(gè)優(yōu)點(diǎn)是,Office App能夠同時(shí)在本地的Office應(yīng)用程序和Office在線應(yīng)用程序中使用,比如本地的Excel 2013 和Excel Web App能夠使用同一套JavaScript API來調(diào)用。更重要的是,因?yàn)槭腔赪eb的,所以開發(fā)者可以使用自己熟悉的Web開發(fā)技術(shù)如JavaScript,CSS,WebService等來開發(fā)Office App。Office App能夠更方便將應(yīng)用程序發(fā)布到Office App Store共享和下載,還可以通過付費(fèi)賺取收益。另外對(duì)于企業(yè)及應(yīng)用,可以使用企業(yè)App類別來限制只有企業(yè)內(nèi)部員工才能訪問下載,這些便利對(duì)于以前的Office開發(fā)方式都是不具備的。 5 XLL XLL是Excel的一種外接應(yīng)用程序,他使用C和C++開發(fā),程序通過調(diào)用Excel暴漏的C接口來實(shí)現(xiàn)擴(kuò)展功能。這種方式開發(fā)的應(yīng)用程序效率高,但是難度大,對(duì)開發(fā)者自身的要求較高。著名的開源項(xiàng)目Excel-DNA就是使用XLL技術(shù)開發(fā)的,Excel-DNA能夠幫助.NET 開發(fā)人員來極大地簡化RTD函數(shù),同步、異步UDF函數(shù)的編寫和開發(fā)。 開源軟件finansu 是一款可以從Bloomberg.com, Google Finance and Yahoo! Finance財(cái)經(jīng)中獲取股票行情數(shù)據(jù)的軟件,其中大量使用了Excel-NDA。 上圖動(dòng)畫簡要概述了該插件功能。里面使用到了Excel-NDA中的RTD函數(shù),異步UDF函數(shù)等功能。 XLL式的插件開發(fā),使得系統(tǒng)插件不需要依賴注冊(cè)表項(xiàng),只需要像VBA或者VAB宏文件XLA應(yīng)用那樣直接在啟動(dòng)時(shí)加載即可使用。后面我會(huì)專門講解Excel-DNA函數(shù)的使用。 6 OpenXML SDK 及其它 另外在有些情況下,如果再用戶沒有安裝Excel應(yīng)用程序,或者在服務(wù)器端需要?jiǎng)討B(tài)生成Excel文件的時(shí)候。我們可能需要直接讀取或者生成Excel文件,這種情況下,即使在機(jī)器上裝了Excel開發(fā)環(huán)境,調(diào)研Com組件生成Excel文件可能會(huì)導(dǎo)致效率十分低下。由于在Office 2007版本推出了新的.xlsx這種標(biāo)準(zhǔn)的格式,在這種情況下,我們可以直接使用一些能夠操作和生成Excel文件的SDK來直接進(jìn)行操作。OpenXML SDK是微軟官方推薦的操作Excel 07及以上文件格式的SDK,目前版本是2.0版本。如果要對(duì)Excel文件進(jìn)行各種定制化開發(fā)的話,建議使用OpenXML。另外從Java開源項(xiàng)目POI上移植過來的NPOI項(xiàng)目也可以直接讀寫Excel文件,這些效率都比直接調(diào)用Office的Com組件生成文檔要快的多。 二 Office開發(fā)技術(shù)方案的選擇如前所述,要開發(fā)Excel應(yīng)用程序,有很多方案可以選擇。在作出選擇之前,根據(jù)個(gè)人經(jīng)驗(yàn),有以下幾方面需要考慮: 1 應(yīng)用程序的類型及功能 根據(jù)Excel插件開發(fā)的功能需求,對(duì)于以些較簡單的應(yīng)用,比如一些Excel模板等,可以直接采用VBA宏進(jìn)行定制,如果具有.NET 基礎(chǔ),可以采用VSTO Document-Level的方式來開發(fā)模板;對(duì)于一些較大型的或者比較復(fù)雜的一些應(yīng)用,或者考慮到效率,編寫VAB可能難以實(shí)現(xiàn)某些功能這時(shí)可以考慮采用SharedAddin或者VSTO Addin的方式來進(jìn)行開發(fā),他能夠直接利用.NET平臺(tái)上的各種語言及類庫,并且可以使用Visual Studio這種強(qiáng)大的工具來開發(fā)和進(jìn)行調(diào)試;如果對(duì)應(yīng)用程序的跨平臺(tái),或者移動(dòng)性要求較高,或者是需要在已有的Web應(yīng)用程序上建立Office應(yīng)用程序,則可以考慮使用Office App的方式來進(jìn)行開發(fā);如果應(yīng)用程序?qū)π屎鸵筝^高,并且具有扎實(shí)的C或者C++基礎(chǔ),可以采取XLL的方式對(duì)Excel進(jìn)行擴(kuò)展;對(duì)于一些需要批量生產(chǎn)Excel文件的應(yīng)用環(huán)境,比如在服務(wù)器上生產(chǎn)Excel文件,導(dǎo)出數(shù)據(jù)到Excel,對(duì)Excel文件進(jìn)行合并分割等操作,采用OpenXML SDK、NOPI等第三方具有直接讀寫Excel文件的SDK來進(jìn)行開發(fā)能夠獲取更高的效率,另外采用第三方SDK可以使得部署的目標(biāo)機(jī)器不需要安裝Office的可編程環(huán)境。 2 程序兼容Office的版本問題 第二個(gè)比較重要的考慮因素是應(yīng)用程序的兼容版本問題。這個(gè)問題就像是開發(fā)BS應(yīng)用程序需要考慮應(yīng)用程序的類型比如是IE還是Chrome以及版本,比如需要處理IE6 下各種頭疼的問題等等。開發(fā)Excel應(yīng)用程序也需要注意這一點(diǎn),雖然最新的Excel2013已經(jīng)推出,但是仍有大部分的客戶機(jī)器可能使用的是2003 的系統(tǒng)。這種情況下,如果使用VSTO Application Addin的方式可能不能兼容2003的系統(tǒng),并且一些特殊的UI界面如Ribbon菜單,Customer Task Panel在03版本上不兼容。這種情況下,有時(shí)候可能需要采用一些比較通用的技術(shù)如VBA,XLL,SharedAddin技術(shù)來進(jìn)行處理,另外對(duì)于一些07及以上版本中特有的UI界面和功能,使用SharedAddin開發(fā),并且如果想利用這些功能,可能需要進(jìn)行一些手動(dòng)的編碼和判斷。另外,如果采用VSTO編程,還有一個(gè)重要的考慮因素是.NET的版本問題,Excel插件通常是和其他產(chǎn)品綁定在一起發(fā)布或者銷售的,有時(shí)候可能限定平臺(tái)在.NET 2.0 上,那么選擇VSTO的版本,及開發(fā)工具的時(shí)候可能就需要注意了。如果確定目標(biāo)用戶使用的Office版本為比較新的版本,如2007或者以上,建議還是使用VSTO較高的版本進(jìn)行開發(fā),這樣可以極大地簡化開發(fā)的難度,提高應(yīng)用程序的性能。如果客戶使用的是最新版的Office,采用Office App的開發(fā)方式也是一種比較好的選擇。 三 Excel開發(fā)的未來微軟推出的這么多種Excel開發(fā)方式是為了滿足不同層次用戶對(duì)Excel進(jìn)行定制化而推出的解決方案。在可見的未來,微軟會(huì)對(duì)以上的開發(fā)方式提供長久的支持,只要滿足當(dāng)前應(yīng)用程序的需求,目前來看對(duì)各種技術(shù)的投資仍舊是值得的。其次,最新引入的Apps for Office基于Web技術(shù)的開發(fā)方式在發(fā)布共享,安裝部署,在線協(xié)作,定制化云服務(wù),網(wǎng)絡(luò)聚合,本地和網(wǎng)絡(luò)應(yīng)用程序兼容方面都具有一定的優(yōu)勢(shì),如果想擴(kuò)展您的程序讓更多的人使用,可以嘗試一下Apps for Office;最后在Cindy Meister大神認(rèn)為隨著微軟推出的新的Office Open XML 文件格式,使用OpenXML SDK可以直接操作Excel文件來創(chuàng)建更多的定制化功能。 四 Excel開發(fā)的資源本文及后面的文章主要介紹ShardAddin和VSTO開發(fā),所以下面列出我所看過的覺得有用的一些資源: 1.MSDN 論壇相應(yīng)的模塊:
2.博客
3.書籍
五 結(jié)語本文主要介紹了Excel開發(fā)的各種方式及其特點(diǎn),并在此基礎(chǔ)上介紹了開發(fā)Excel插件技術(shù)選擇時(shí)所需要考慮的因素,最后給出了一些相關(guān)的開發(fā)資源。后面的文章將會(huì)重點(diǎn)介紹SharedAddin和VSTO開發(fā)方式,這種目前企業(yè)級(jí)的開發(fā)方式能夠開發(fā)出功能強(qiáng)大的Excel插件。后面會(huì)逐一講解Excel中的菜單系統(tǒng),Excel CTP用戶自定義面板,Excel對(duì)象模型,同步和異步自定義函數(shù),RTD自動(dòng)刷新函數(shù),Excel安裝與部署,Excel插件開發(fā)性能調(diào)優(yōu),Excel各版本兼容的Hack等內(nèi)容,希望對(duì)大家認(rèn)識(shí)和了解Excel開發(fā)有所幫助。 |
|