原文於2017年3月13日首發於LinkedIn,請參考這個鏈接
離上一篇文章,很快又過去了兩星期的時間。今天抓緊晚上的時間,開始了Office 365開發系列文章的第一篇,我會幫助大家回顧一下過去Office開發的一些場景,目前提供的一些能力,最后展望一下生態環境建設和未來的發展。
關於Office 365開發,這里的定義並不是指開發Office 365平台,或者接口(這兩部分由微軟數以萬計的研發工程師們在負責),而是基於Office 365平台及其提供的接口,獨立開發商(ISV)或者有一定能力的開發人員、高級用戶針對Office 365的定制、擴展、集成等方面的開發。
回顧過去Office開發的基本情況
對於Office開發,我應該算起來是接觸比較早的一批中國用戶之一,所以如果大家願意聽,我很樂意分享一些Office開發的基本情況以供參考。
從Office 97開始,我使用過后面幾乎所有的Office 版本,但是印象最深刻的有幾個版本
1.Office XP
這個版本沒有用年份來編號(實際上應該是Office 2002),原因估計是為了配合Windows XP的整體市場宣傳定位。它的特殊之處在於有一個所謂的開發版(2000也有開發版,但在2002這個版本更加完善),有懷舊情結的同學,請移步這里進行圍觀。值得一提的是,雖然同樣帶有XP的光環,但Office XP遠沒有Windows XP那么風光(服役超過13年,甚至直到現在都還有用戶對其念念不舍),因為它很快就被Office 2003取代了。
2. Office 2003
這是一個非常重要的版本,它代表中Office產品技術的一個巔峰時代——這個版本的Office功能非常強大,可以說是無所不包。我敢大膽地推測,正在看這篇文章的讀者中絕大部分的朋友都用過這個版本吧。如果說Office XP是我用得比較全的一個版本(除了Outlook沒有怎么用,其他組件基本都對照幫助文檔摸了一遍,還用FrontPage做出了人生第一個奇丑無比的網站,但其實對那些所謂的開發完全是一知半解,半生不熟),那么Office 2003是我真正意義上開始較為深入使用的版本,尤其以Excel和Access這兩個組件,結合當時的實際工作需要,我使用VBA開發了從簡單到復雜的各種小應用。
學習Excel的VBA,我是完全認真的,一個佐證就是我在那個年月願意花五十美金托人從國外輾轉買來下面這樣一本足有1000多頁的書過來啃,而師從Mr.Spreadsheet——John Walkenbach,也算系出名門了。這本書以及John本人對我影響之大,很難用一兩句講清楚——在那個相對單純的年代,我一頭扎進Excel VBA的世界里,收獲的可不僅僅是寫代碼帶來的樂趣,還有在微軟技術社區(那會兒叫新聞組)中認識的一大批朋友。事到如今,如果說我有什么遺憾的話,一是還沒有見過John的真人,另外一個就是我雖然有心想把這本書傳承給一位有緣人,但一直沒有找到——它太厚了。
3.Office 2007
前面提到Office 2003是一個巔峰之作,那么Office 2007毫無疑問就是一個轉型精品。表面上看,2007帶來了全新的UI風格——Ribbon,這是一次大膽地嘗試,因為誰都知道2003的菜單已經非常多了,以至於對於不少新手來說,經常發生找不到功能所在的位置。這種界面的創新帶有一定的冒險(顛覆自己成熟的產品確實需要勇氣),但事實證明是非常成功的。
除了界面上看到的變化,其實Office 2007的另外一個重要創新,是重新定義Office文檔的格式——除了繼續支持Office 2003及早期版本的二進制文件格式之外,還有一種全新的基於XML的文件格式(通常在默認的文件擴展名后面添加一個x以示區分,如Word 2003的格式是doc,而Word 2007雖然依然支持doc,但更推薦用戶使用docx文件格式)。這個后來被正式命名為OpenXML的技術,微軟在經過實踐后將其貢獻給ECMA,並被ISO和IEC等組織認定為開發文檔格式的國際標准。如果對OpenXML的標准感興趣,請參考https://en.wikipedia.org/wiki/Office_Open_XML 。
在開發的層面,Office 2007也有新的變化。首先,它當然繼續支持VBA,但卻規定所有包含代碼的文件,與不包含代碼的文件,從文件格式上就明確有所區分。例如,Excel 2007的標准文件格式為xlsx,而包含VBA代碼的文件則必須重命名為xlsm(這里的m是指macro的意思,我后續會介紹這個概念)。其次,它開始支持使用Visual Studio 2005以及.NET Framework對其進行開發定制,這就引出了一個全新的開發工具VSTO——Visual Studio Tools for Office,這個傳統也一直沿用至今。
針對.NET開發人員,微軟還專門提供了OpenXML SDK,支持從自定義程序中通過OpenXML的標准操作Office文檔(不要求本地安裝有Office)。
4.Office 2013
Office 2010相較2007來說,我感覺主要是一些界面細節的優化。但Office 2013是一個向雲而生的版本,它有很多重要的創新,例如增強了與雲端服務整合的能力、跨平台和設備的能力、協同編輯的能力等,還有一條對開發人員來說至關重要——它帶來了一個所謂的App開發模式,而且這個模式是涵蓋到了客戶端和服務器端以及雲端完整的產品線的。首先,這從根本上解決了開發人員部署應用程序的困擾,其次,它將通過Office Store建立一個全新的生態環境。
毫無疑問,我接下來要談的將是Office 365。這樣說,其實並不是說Office 2016不重要,雖然未來還將有Office 20xx這樣按照年份編號的版本(我們稱為本地版本),但Office 365將代表着微軟對於廣大Office用戶的最終承諾,它已經有並且還將不斷有各種創新,用技術的變革來推動生產力的進步。但在展開Office 365之前,請讓我對此前的兩種開發技術/模式——VBA和VSTO——進行一個歸納,向經典致敬。
1.VBA
VBA的全稱是Microsoft Visual Basic for Applications。在多個Office客戶端應用程序中都一直保留對這個編程方式的支持。Visual Basic,這個由微軟公司於1991年推出的開發語言,直到現在都仍然保持着強大的活力(在編程語言排行榜單中名列前茅),除了它本身的易用性之外,我覺得它在Office產品家族中的嵌入式編程支持是非常關鍵的一個原因。由於VBA的巨大成功,甚至一些非微軟產品(例如AutoCAD)中也支持VBA。
雖然理論上說VBA可以做很多事情,但它主要擅長的是對應用程序內部操作的自動化。例如,我需要根據Excel一個表格的數據,每一行生成一個表單,然后發送到打印機去打印出來。
你現在能找到的任何一個Office版本,你打開某個應用(例如Excel)后,按下ALT+F11鍵即可進入VBA的編輯器界面。
絕大部分應用程序的VBA編輯器都支持三類模塊:首先是該應用本身的對象模塊(通常跟該應用程序的行為——主要體現為事件——密切相關),然后是Forms(這是Visual Basic這個名稱中Visual的意思,即可視化的編程),然后就是類模塊。由於之前提到VBA主要是對Office的自動化,所以相當一部分VBA程序代碼都集中在應用本身的對象模塊中,而某些標准化較高的通用組件(例如我的偶像John的不朽傑作——Power Pack),則有大量代碼在類模塊或者Forms中。
我是工作之后才真正學習計算機編程的,所以實際上可以說,是VB/VBA帶我進入了面向對象編程的大門。多少個抽着劣質香煙熬着的夜晚,我都是在跟下面這樣的錯誤提示消息作戰,直到多年以后的技術有了一定的提高,我也終於真正意義上找到了對象。
學習VBA的首要工作就是要比較清楚地了解應用程序的對象模型,嚴格來說,這個並不難,微軟提供了相當豐富詳細的幫助文檔(例如Excel的不完全對象模型如下),但是熟才能生巧,只有大量的實踐才可能真正地得心應手。
但是,一個好消息是,在Office應用程序中,都提供了錄制宏的功能,也就是說,你可以先按照想法進行操作,然后錄制工具會把相應的代碼記錄下來,通常這些代碼直接就可以運行,但是理想情況下應該是略加修改才真正有實用價值。毫不避諱地說,這是我早年學習VBA的一個重要法寶。編程工具能做到這個層面,不光是業界良心,而且從技術上面說也是相當先進的。
宏——macro——是VBA中的一個重要概念,通常可以簡單理解為一組代碼。
VBA代碼的部署一般分為兩種,它可以作為Office文檔的一部分存在(例如只是某個文件的特定功能的話),也可以單獨存在(假定是一個通用的功能,尤其是希望在應用程序啟動的時候就自動加載的話)。前者不消多說,現在一般就是通過帶有m后綴的文件名保存即可(例如xlsm, docm等),后者有一個更加專用的格式(例如xlam)和叫法(加載宏)。
2.VSTO
VSTO的全稱是Visual Studio Tools for Office,最早的版本出現在Visual Studio .NET 2003里面,但真正引起開發人員興趣是在Visual Studio 2005,對應的Office版本是2007。
為什么會推出VSTO這套工具呢?我個人覺得一方面是因為Visual Studio 及.NET自身發展的需要,另一方面是Office及開發人員的需要。VBA很好,但它的局限性也比較明顯——它主要適合做應用程序內部的自動化,很難便捷地跟外界系統或網絡資源打交道,同時對於新版本Office的一些特殊功能(例如Ribbon或者Task Pane等)也缺乏支持。
最新版本的Visual Studio 2017中,采用了模塊化的安裝體驗,如果選擇了Office 開發這個模塊,那么就可以在項目模板中看到一大堆VSTO的模板(針對不同的應用程序,還會有不同的模板),如下圖所示
我選擇了Excel Add-in這個模板,點擊“Ok”后,會自動生成如下的代碼
這里就是我們熟悉的.NET編程的體驗,可以用到幾乎所有.NET Framework的功能,目前VSTO支持的開發語言除了VB.NET,還有C#。
需要注意的是,VSTO相比VBA來說,在部署方面會更加復雜。首先,它要求目標運行的環境,不光是Office版本要一致(通常高版本可以向下兼容),而且必須有對應的.NET運行環境。
這種版本和運行環境的依賴性在某種程度上對VSTO的應用起到了一定的制約,尤其在雲優先以及移動為先的時代,它與VBA在這方面的局限性進一步放大,考慮到需要進一步簡化部署,更重要的是希望在不同的平台以及移動設備上面都能得到一致性的體驗,從Office 2013開始,及至現在的Office 365家族,以Web技術為基礎、以App為模型,微軟為廣大的開發人員提供了全新的開發支持,打開了一個新的視野。此為后話,且按住不表。
必須提出的是,微軟對於VBA和VSTO的支持將繼續保留,它們有自己的優勢,尤其是對於Office 應用程序自有功能的自動化、快速開發、在本地使用的場景。如果大家有興趣對VBA或者VSTO進行學習和交流,我推薦大家關注ExcelHome,相信我,這是一個神奇的網站——“Excel教程下載和軟件下載中心,Microsoft技術社區聯盟成員,全球領先的Excel門戶,Office技術培訓的最佳社區”。
本文將同時在 微軟中國Office 365官方微信號連載,歡迎關注“ mschinaoffice365",每周都會收到各種新功能介紹和實用技巧。
本文未完待續,請感興趣的朋友們繼續關注如下兩個話題
- 談談現在的Office 365開發能力
- 展望Office 365的生態環境和未來發展