做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的定制化解决方案。

Excel 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进行交互,比如绘制专题图,进行缓冲区分析,叠加,图示邮递员问题等等。

geodix showrouteonmap

Travelling Salesman problem

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版本的支持。

VSTO VERSION

 

    以上图表在 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大神有详尽的比较,异同点有:

相同点:

  1. 他们都会在操作系统的注册表中进行注册,比如对于Excel应用程序来说,会在HKCU\Software\Microsoft\Office\Excel\Addins这个下面创建注册表项,当应用程序比如Excel加载时,会逐一加载这个下面注册的插件.这些插件在COM加载项中可以进行集中管理。
  2. 他们都在Office Com接口上面通过Office对象模型进行构建,他们都可以将建一些可扩展的UI,比如用户自定义任务面板(Custom task panel),Ribbon菜单等。

不同点:他们也有很多不同点,主要不同点如下:

  1. 从名字可以看出Shared Add-In可以在多个不同的Office应用程序之间,比如Excel,Word中共享。因此在Shared Add-in中需要一些判断和处理不同宿主程序的代码。但是VSTO Add-Ins则是应用程序明确的。VSTO Add-Ins只能用在一种宿主应用程序中如Excel或者Word中运行,因此不需要在代码中处理对不同的宿主应用程序的类型做特殊的处理,比如将通用的对象转换为特定的对象,通过反射等调用不同应用程序的方法等。
  2. 要在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应用程序一样简单。
  3. 还有一个重要的区别是安全模型。对于SharedAddin的IDTExtensibility2接口来说,从来不需要代码的安全访问机制(CAS),因此,在Office加载SharedAddin的时候,不需要调用caspol.exe方法来为Addin的程序集授予完全信任的权限。在VSTO中,2008版本中使用了.NET的安全策略,但是VSTO 2008使用了ClickOne部署以及真实代码模型(Authenticode)
  4. VSTO为每一个VSTO Add-Ins创建了一个AppDomain,因此各个Addin之间互不影响,开发者不需要担心一些诸如“Outlook关闭不了”的问题。当写在VSTO Addin的时候,AppDomian也会被卸载,CLR会卸载与其相关的所有资源。
  5. VSTO默认安装在HKCU(Current User)下面,而SharedAddin则默认部署到HKLM(Local Machine)下面。如果想让我们开发的VSTO Addin能让所有人使用,则需要在部署的时候对注册表进行一些额外的手动读写操作

SharedAddin以及VSTO开发方式在企业级应用中使用的比较广泛,下面是一些例子:

SQL Server Data Mining for Excel Addin

Excel DataMining

SQL Server PowerPivot for Excel Addin

PowerPivort

Visual Studio Team Foundation for Excel Addin

TFS Addin

Oracle BI for Excel Addin

Oracle BI Add-In for Excel

Acrobat Reader for Excel Addin

Acrobat

还有一些国内的财经软件Excel插件,比如万得资讯的Excel插件

WindExcelAddin

 

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 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。

XLL Add-Ins

finansu

    上图动画简要概述了该插件功能。里面使用到了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文件来创建更多的定制化功能。

四 Excel开发的资源


本文及后面的文章主要介绍ShardAddin和VSTO开发,所以下面列出我所看过的觉得有用的一些资源:

1.MSDN 论坛相应的模块:

2.博客

3.书籍

五 结语


    本文主要介绍了Excel开发的各种方式及其特点,并在此基础上介绍了开发Excel插件技术选择时所需要考虑的因素,最后给出了一些相关的开发资源。后面的文章将会重点介绍SharedAddin和VSTO开发方式,这种目前企业级的开发方式能够开发出功能强大的Excel插件。后面会逐一讲解Excel中的菜单系统,Excel CTP用户自定义面板,Excel对象模型,同步和异步自定义函数,RTD自动刷新函数,Excel安装与部署,Excel插件开发性能调优,Excel各版本兼容的Hack等内容,希望对大家认识和了解Excel开发有所帮助。