做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识。目前Office相关的开发资料是比较少的,最最开始的时候,我看的是一本英文资料,然后再就是MSDN上面去提问了。所以我想写一点东西,让大家也少走一些弯路。
这篇文章就简要介绍一下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大神有详尽的比较,异同点有:
相同点:
不同点:他们也有很多不同点,主要不同点如下:
SharedAddin以及VSTO开发方式在企业级应用中使用的比较广泛,下面是一些例子:
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组件生成文档要快的多。
如前所述,要开发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进行定制化而推出的解决方案。在可见的未来,微软会对以上的开发方式提供长久的支持,只要满足当前应用程序的需求,目前来看对各种技术的投资仍旧是值得的。其次,最新引入的Apps for Office基于Web技术的开发方式在发布共享,安装部署,在线协作,定制化云服务,网络聚合,本地和网络应用程序兼容方面都具有一定的优势,如果想扩展您的程序让更多的人使用,可以尝试一下Apps for Office;最后在Cindy Meister大神认为随着微软推出的新的Office Open XML 文件格式,使用OpenXML SDK可以直接操作Excel文件来创建更多的定制化功能。
本文及后面的文章主要介绍ShardAddin和VSTO开发,所以下面列出我所看过的觉得有用的一些资源:
1.MSDN 论坛相应的模块:
2.博客
3.书籍
本文主要介绍了Excel开发的各种方式及其特点,并在此基础上介绍了开发Excel插件技术选择时所需要考虑的因素,最后给出了一些相关的开发资源。后面的文章将会重点介绍SharedAddin和VSTO开发方式,这种目前企业级的开发方式能够开发出功能强大的Excel插件。后面会逐一讲解Excel中的菜单系统,Excel CTP用户自定义面板,Excel对象模型,同步和异步自定义函数,RTD自动刷新函数,Excel安装与部署,Excel插件开发性能调优,Excel各版本兼容的Hack等内容,希望对大家认识和了解Excel开发有所帮助。