程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 淺談Excel開發(1) Excel開發概述

淺談Excel開發(1) Excel開發概述

編輯:關於.NET

做Office相關的開發工作快一年多了,在這一年多裡,在插件的開發中遇到了各種各樣的問題和困難,還好同事們都很厲害,在和他們的交流討論中學到了很多的知識。目前Office相關的開發資料是比較少的,最最開始的時候,我看的是一本英文資料,然後再就是MSDN上面去提問了。所以我想寫一點東西,讓大家也少走一些彎路。

這篇文章就簡要介紹一下Office開發的一些相關的知識,使大家對這個有一個大體的了解。

首先來看一看Office 的開發方式。

一 Office開發方式

1 VBA (Visual Basic Application)

VBA是一種Visual Basic的宏語言,它應該是最早的Office提供定制化的一種解決方案,在1994年發行的Excel 5.0版本中,就具備了VBA的宏功能。從名字上似乎可以看出他是VB的一個子集,和Visual Basic不同,VBA是一種宿主型語言。由於那個時候Visual Basic非常火, VBA取得了很大的成功,無論是專業的開發人員,還是剛入門的非開發人員,都可以利用VBA完成簡單或復雜的需求。現在在一些辦公環境中,VBA用的非常多,比如國內比較著名的ExcelHome論壇,上面就有很多關於Excel VBA的討論,而且VBA還能夠調研Com組件裡面的一些方法,在其他的Office開放方式中,如VSTO或者SharedAddin中,VBA有時候可以輔助完成某些功能,如RTD函數,UDF函數的調用,專用模板的開發,動畫效果的演示等等。不光是Office,有很多其他的軟件業比如比較有名的ArcGIS,CorelDraw等軟件,都提供了VBA的定制化解決方案。

但是他也有很多缺點。VBA本身擁有很多的局限性,比如缺少一些常用的類型,調試起來不方便,VB語言雖然簡單,但是現在又很多的開發者都使用的是.NET,VB的一些語法可能很多人不適應。再就是VBA是一種腳本類型的解釋型的語言,在安全性比如源代碼容易被破解,就像Javascript保密性不好一樣,在執行效率方面沒有一些編譯型解決方案來的快。舉個例子,比如說,我們可以把我們的自定義函數使用VBA來編寫,然後存儲為.xla文件,這樣在Excel中就可以調用我們的這些函數了。但是由於VBA是解釋型的語言,就像JavaScript那樣,每次運行都要邊解釋邊運行,而不是像其他一些語言,在編譯成二進制後,就能直接加載運行。所以可以將我們的自定義函數寫到類庫然後注冊,或者直接使用C++,將函數寫到xll中,這樣效率和安全性方面要比VBA方式要好,這裡只是稍微提一下,後面的文章會詳細介紹。

2 Shared Addin

SharedAddin,就像Visual Studio可以外接插件一樣,也可以使用一些技術為Office開發一些插件。對VBA的一些問題,一些專業的開發人員,可以使用VisualBasic或者VisualC++等工具來引用Office的一些dll,來針對Office進行開發。開發的時候將dll注冊為com組件,並在注冊表裡面進行注冊,這樣就可以在Office裡面直接調用這些插件了。

Com Addin方式基本上解決了VBA存在的安全性及效率低的問題,但是他要求的門檻比較高,即使是專業的開發人員也不一定能夠很好的掌握。Com Addin還有一個優點是,使用這個開發能夠彌補VSTO在某些版本尚不支持的尴尬,比如VSTO的Ribbon菜單在07以下版本中就不能支持,並且在1.0版本下不支持Application Level級別的開發。使用Com Addin開發,能夠使得插件可以具有較好的兼容性。

GeodesiX是一個地理信息Excel插件,他能夠將在Excel中與GoogleMap進行交互,比如繪制專題圖,進行緩沖區分析,疊加,圖示郵遞員問題等等。

3 VSTO (Visual Studio Tools for Office)

2000年微軟發布了.NET平台戰略之後,推出了一系列運行在.NET上新語言如C#和VB.NET。在這種情況下,開發者能夠使用.NET 平台上的語言來開發Office。 從Office 2003開始,微軟推出了VSTO 1.0。VSTO主要是對Office的一些dll進行了.NET封裝,使得我們可以使用.NET上的語言來方便的對Office的一些方法進行調用。所以,Office開發跨入了一個新的時代,開發人員可以使用更加高級的語言和熟悉的技術來更容易的進行Office開發。VSTO 1.0是伴隨著.NET 1.0平台推出的,支持Office 03以上的所有版本。

對於企業及的應用和開發,VSTO或許是首要選擇,他極大地擴展了Office應用程序的能力,使用.NET平台支持的編程語言,能夠直接訪問.NET上面眾多的類庫。具有較好的安全機制。簡化了Office插件的開發和部署。

VSTO也有一些缺點,比較明顯的是他依賴於.NET 平台,在部署的時候,可能需要在目標機器上安裝.NET Framework框架,再者就是版本的兼容性,沒有哪一個VSTO版本能夠兼容所有的Office版本。

下面是VSTO的各個版本及對應的支持的.NET平台以及對各Office版本的支持。

以上圖表在 http://en.wikipedia.org/wiki/Visual_Studio_Tools_for_Office 的基礎上進行了修改

提到VSTO,有一個比較重要的問題就是Document Level 還是Application Level程序,在創建VSTO應用程序的時候,就必須進行選擇。就像名稱所說的那樣,Document level就是指對單個Word或者Excel文檔進行自定義開發,該文件打開時,就加載,關閉時就卸載。如果是Application Level級別的,就是對應用程序中所有打開的文檔實例都能夠起作用,應用程序加載時插件加載,應用程序關閉時插件卸載。

SharedAdd和VSTO兩者很多人都弄不清楚,他倆既有相同的地方也有不同點,關於這一點Cindy Meister大神有詳盡的比較,異同點有:

相同點:

他們都會在操作系統的注冊表中進行注冊,比如對於Excel應用程序來說,會在HKCU\Software\Microsoft\Office\Excel\Addins這個下面創建注冊表項,當應用程序比如Excel加載時,會逐一加載這個下面注冊的插件.這些插件在COM加載項中可以進行集中管理。

他們都在Office Com接口上面通過Office對象模型進行構建,他們都可以將建一些可擴展的UI,比如用戶自定義任務面板(Custom task panel),Ribbon菜單等。

不同點:他們也有很多不同點,主要不同點如下:

從名字可以看出Shared Add-In可以在多個不同的Office應用程序之間,比如Excel,Word中共享。因此在Shared Add-in中需要一些判斷和處理不同宿主程序的代碼。但是VSTO Add-Ins則是應用程序明確的。VSTO Add-Ins只能用在一種宿主應用程序中如Excel或者Word中運行,因此不需要在代碼中處理對不同的宿主應用程序的類型做特殊的處理,比如將通用的對象轉換為特定的對象,通過反射等調用不同應用程序的方法等。

要在Shared Add-In中創建特殊的UI界面,如Ribbon菜單,Custom Task Panel以及Form窗體等,需要實現office.dll中的三個接口:Office.IRibbonExtensibility,Office.ICustomTaskPanelConsumer及Outlook.FormRegionStartup接口。不論是創建的是以上哪種類型的UI界面,我們都需要在接口方法中編寫很多處理代碼。但是,如果使用Visual Studio Tools for Office,這些東西VSTO都幫我們包裝好了,我們只需要從工具箱中往界面上拖動添加新的Ribbon菜單,UserControl,及FormRegion即可。這些界面在Visual Studio中都提供了設計時支持,我們只需要拖動,設置熟悉,雙擊然後處理綁定的事件即可,就象設計Windows Form應用程序一樣簡單。

還有一個重要的區別是安全模型。對於SharedAddin的IDTExtensibility2接口來說,從來不需要代碼的安全訪問機制(CAS),因此,在Office加載SharedAddin的時候,不需要調用caspol.exe方法來為Addin的程序集授予完全信任的權限。在VSTO中,2008版本中使用了.NET的安全策略,但是VSTO 2008使用了ClickOne部署以及真實代碼模型(Authenticode)

VSTO為每一個VSTO Add-Ins創建了一個AppDomain,因此各個Addin之間互不影響,開發者不需要擔心一些諸如“Outlook關閉不了”的問題。當寫在VSTO Addin的時候,AppDomian也會被卸載,CLR會卸載與其相關的所有資源。

VSTO默認安裝在HKCU(Current User)下面,而SharedAddin則默認部署到HKLM(Local Machine)下面。如果想讓我們開發的VSTO Addin能讓所有人使用,則需要在部署的時候對注冊表進行一些額外的手動讀寫操作

SharedAddin以及VSTO開發方式在企業級應用中使用的比較廣泛,下面是一些例子:

SQL Server Data Mining for Excel Addin

SQL Server PowerPivot for Excel Addin

Visual Studio Team Foundation for Excel Addin

Oracle BI for Excel Addin

Acrobat Reader for Excel Addin

還有一些國內的財經軟件Excel插件,比如萬得資訊的Excel插件

4 Office App

隨著Office 2013 和Office 365 的推出,Office更加注重網絡化功能,因此引入了新的編程方式,那就是Apps for Office。在VS2012 中,您可以使用內置提供的Apps for Office模板創建基於Web的Office應用程序。和傳統的安裝插件(VSTO)及 運行宏(VBA)不同,在新版的Office中,用戶可以到微軟的Office App Store中去下載,安裝應用程序,這些應用程序在獨自安全的沙箱環境中運行。Office Apps使用熟悉的Web技術開發如JavaScript,使得非常容易使用Mashup技術來聚合各種各樣的資源。

下圖展示的是使用在Excel中使用在線字典App來檢索信息和Bing App來繪制和渲染專題圖的效果。

還有一個優點是,Office App能夠同時在本地的Office應用程序和Office在線應用程序中使用,比如本地的Excel 2013 和Excel Web App能夠使用同一套JavaScript API來調用。更重要的是,因為是基於Web的,所以開發者可以使用自己熟悉的Web開發技術如JavaScript,CSS,WebService等來開發Office App。Office App能夠更方便將應用程序發布到Office App Store共享和下載,還可以通過付費賺取收益。另外對於企業及應用,可以使用企業App類別來限制只有企業內部員工才能訪問下載,這些便利對於以前的Office開發方式都是不具備的。

5 XLL

XLL是Excel的一種外接應用程序,他使用C和C++開發,程序通過調用Excel暴漏的C接口來實現擴展功能。這種方式開發的應用程序效率高,但是難度大,對開發者自身的要求較高。著名的開源項目Excel-DNA就是使用XLL技術開發的,Excel-DNA能夠幫助.NET 開發人員來極大地簡化RTD函數,同步、異步UDF函數的編寫和開發。 開源軟件finansu 是一款可以從Bloomberg.com, Google Finance and Yahoo! Finance財經中獲取股票行情數據的軟件,其中大量使用了Excel-NDA。

上圖動畫簡要概述了該插件功能。裡面使用到了Excel-NDA中的RTD函數,異步UDF函數等功能。

XLL式的插件開發,使得系統插件不需要依賴注冊表項,只需要像VBA或者VAB宏文件XLA應用那樣直接在啟動時加載即可使用。後面我會專門講解Excel-DNA函數的使用。

6 OpenXML SDK 及其它

另外在有些情況下,如果再用戶沒有安裝Excel應用程序,或者在服務器端需要動態生成Excel文件的時候。我們可能需要直接讀取或者生成Excel文件,這種情況下,即使在機器上裝了Excel開發環境,調研Com組件生成Excel文件可能會導致效率十分低下。由於在Office 2007版本推出了新的.xlsx這種標准的格式,在這種情況下,我們可以直接使用一些能夠操作和生成Excel文件的SDK來直接進行操作。OpenXML SDK是微軟官方推薦的操作Excel 07及以上文件格式的SDK,目前版本是2.0版本。如果要對Excel文件進行各種定制化開發的話,建議使用OpenXML。另外從Java開源項目POI上移植過來的NPOI項目也可以直接讀寫Excel文件,這些效率都比直接調用Office的Com組件生成文檔要快的多。

二 Office開發技術方案的選擇

如前所述,要開發Excel應用程序,有很多方案可以選擇。在作出選擇之前,根據個人經驗,有以下幾方面需要考慮:

1 應用程序的類型及功能

根據Excel插件開發的功能需求,對於以些較簡單的應用,比如一些Excel模板等,可以直接采用VBA宏進行定制,如果具有.NET 基礎,可以采用VSTO Document-Level的方式來開發模板;對於一些較大型的或者比較復雜的一些應用,或者考慮到效率,編寫VAB可能難以實現某些功能這時可以考慮采用SharedAddin或者VSTO Addin的方式來進行開發,他能夠直接利用.NET平台上的各種語言及類庫,並且可以使用Visual Studio這種強大的工具來開發和進行調試;如果對應用程序的跨平台,或者移動性要求較高,或者是需要在已有的Web應用程序上建立Office應用程序,則可以考慮使用Office App的方式來進行開發;如果應用程序對效率和要求較高,並且具有扎實的C或者C++基礎,可以采取XLL的方式對Excel進行擴展;對於一些需要批量生產Excel文件的應用環境,比如在服務器上生產Excel文件,導出數據到Excel,對Excel文件進行合並分割等操作,采用OpenXML SDK、NOPI等第三方具有直接讀寫Excel文件的SDK來進行開發能夠獲取更高的效率,另外采用第三方SDK可以使得部署的目標機器不需要安裝Office的可編程環境。

2 程序兼容Office的版本問題

第二個比較重要的考慮因素是應用程序的兼容版本問題。這個問題就像是開發BS應用程序需要考慮應用程序的類型比如是IE還是Chrome以及版本,比如需要處理IE6 下各種頭疼的問題等等。開發Excel應用程序也需要注意這一點,雖然最新的Excel2013已經推出,但是仍有大部分的客戶機器可能使用的是2003 的系統。這種情況下,如果使用VSTO Application Addin的方式可能不能兼容2003的系統,並且一些特殊的UI界面如Ribbon菜單,Customer Task Panel在03版本上不兼容。這種情況下,有時候可能需要采用一些比較通用的技術如VBA,XLL,SharedAddin技術來進行處理,另外對於一些07及以上版本中特有的UI界面和功能,使用SharedAddin開發,並且如果想利用這些功能,可能需要進行一些手動的編碼和判斷。另外,如果采用VSTO編程,還有一個重要的考慮因素是.NET的版本問題,Excel插件通常是和其他產品綁定在一起發布或者銷售的,有時候可能限定平台在.NET 2.0 上,那麼選擇VSTO的版本,及開發工具的時候可能就需要注意了。如果確定目標用戶使用的Office版本為比較新的版本,如2007或者以上,建議還是使用VSTO較高的版本進行開發,這樣可以極大地簡化開發的難度,提高應用程序的性能。如果客戶使用的是最新版的Office,采用Office App的開發方式也是一種比較好的選擇。

三 Excel開發的未來

微軟推出的這麼多種Excel開發方式是為了滿足不同層次用戶對Excel進行定制化而推出的解決方案。在可見的未來,微軟會對以上的開發方式提供長久的支持,只要滿足當前應用程序的需求,目前來看對各種技術的投資仍舊是值得的。其次,最新引入的Apps for Office基於Web技術的開發方式在發布共享,安裝部署,在線協作,定制化雲服務,網絡聚合,本地和網絡應用程序兼容方面都具有一定的優勢,如果想擴展您的程序讓更多的人使用,可以嘗試一下Apps for Office;最後在Cindy Meister大神認為隨著微軟推出的新的Office Open XML 文件格式,使用OpenXML SDK可以直接操作Excel文件來創建更多的定制化功能。

MY URL:http://www.bianceng.cn/Programming/net/201312/39219_7.htm

四 Excel開發的資源

本文及後面的文章主要介紹ShardAddin和VSTO開發,所以下面列出我所看過的覺得有用的一些資源:

1.MSDN 論壇相應的模塊:

MSDN VSTO 論壇 http://social.msdn.microsoft.com/Forums/vstudio/en-US/home?forum=vsto

MSDN Excel Programming http://social.msdn.microsoft.com/Forums/en-US/exceldev/threads

MSDN Apps for Office http://social.msdn.microsoft.com/Forums/office/en-us/home?forum=appsforoffice

2.博客

Cindy Meister 大神博客 http://blogs.msmvps.com/wordmeister

Calvin Gao 小神博客 http://social.msdn.microsoft.com/Profile/calvin_gao/activity

MYM]Brooks同學博客 http://www.cnblogs.com/brooks-dotnet/category/233027.html

3.書籍

VSTO開發相關書籍推薦 Visual Studio Tools for Office 2007: VSTO for Excel, Word, and Outlook

XLL開發書籍 Financial Applications using Excel Add-in Development in C / C++

五 結語

本文主要介紹了Excel開發的各種方式及其特點,並在此基礎上介紹了開發Excel插件技術選擇時所需要考慮的因素,最後給出了一些相關的開發資源。後面的文章將會重點介紹SharedAddin和VSTO開發方式,這種目前企業級的開發方式能夠開發出功能強大的Excel插件。後面會逐一講解Excel中的菜單系統,Excel CTP用戶自定義面板,Excel對象模型,同步和異步自定義函數,RTD自動刷新函數,Excel安裝與部署,Excel插件開發性能調優,Excel各版本兼容的Hack等內容,希望對大家認識和了解Excel開發有所幫助。

作者:   yangecnu(yangecnu's Blog on 博客園)
出處:http://www.cnblogs.com/yangecnu/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved