扩展MS Office的主要方式

可以通过扩展MS Office来获得一些自定义的功能。扩展MS Office的方法有很多种:

  • 通过内置VBA脚本来实现自定义功能
    • 这种方法可以延伸开来。对于支持模板功能的Office应用可以把VBA脚本放置在模板中,然后这个模板作为VBA脚本的宿主,可以被加载为一个扩展。一个例子是PlantUML Word Template
  • 通过Visual Studio提供的工具VSTO(Visual Studio Tools for Office)来创建扩展。这种扩展可以对Office做最深度的自定义。但是要求比较高, 需要使用专有的Visual Studio不说,还需要一定的C#编程技术,需要把插件生成的assembly通过动态链接库的方式部署(参考)。VSTO插件有两个子类(参考Office solutions development overview (VSTO)):
    • 相应于文档的Document-Level Customizations,目前只适用于Word和Excel
    • 相应于应用的VSTO Add-ins
  • 第三种,也就是最新的一种,官方叫做Office Add-in(参考Office Add-ins documentation)。这种方式采用HTML/CSS/Javascript等Web技术来创建扩展。每个Office Add-in需要通过Web方式提供,既可以作用于Web版的Office,也可以作用于桌面版的Office。微软还提供了AppSource这个应用市场,让不同开发商提供的应用可以被集中浏览。但是弊端也是有的,Office Add-in的定制性不如VSTO插件,对Office在UI上基本上只能提供三种定制方式:Ribbon命令、Task Pane侧边栏、以及在文档中插入类似Webview的控件,而且Office的每个应用提供的定制性都不一样,支持不同的UI定制性,以及支持不同强度的API。只有一小撮Common API是所有Office应用共享的。

通过XML扩展Office的功能

当前Office文档的存储格式采用的是Open XML,也就是压缩以后的XML文件。Office应用的一个重要工作就是在文档内容和XML元素之间转化。这里有一篇文章Create better add-ins for Word with Office Open XML教授如何在Word的Office Add-in中直接插入OpenXML字符串标记。了解OpenXML的结构有助于理解Office文档的功能以及其局限性。

既然是XML格式,那么就就有很强的可扩展性,可以在OpenXML中加入一些自定义的XML片段,叫做Custom XML Parts。这些自定义的片段不会直接显示在文档中,但是可以与ContentControl这种特殊的控件进行映射后显示。Microsoft Office - Exploring the JavaScript API for Office: Data Binding and Custom XML Parts中对此有较详细的介绍。自定义XML片段给Office文档带来一种新的可能性,文档本身可以作为模板,只包含ContentControl,而具体的内容从自定义XML片段获取。由于XML易于解析,第三方程序很容易从文档文件中写入或者提取自定义XML片段。从而实现一定的自动化。Open-XML-SDK可以用来对OpenXML文档进行读写。对于老式的非XML的二进制文档格式,可以采用DSOFile,参考Read (and write) Office document custom properties without automation

对Office Add-in进行sideload

因为涉及信息安全,管理员可以控制是否允许从外部安装Office Add-in。但是在开发过程中,有需要需要在本地加载Office Add-in,这时候就需要sideload。以Sideload Office Add-ins for testing from a network share为例,首先要做的是把插件的manifest放在某个目录下,然后把这个目录共享(可以把共享权限限制到当前用户)。然后有两种办法把manifest所在目录添加称为office的受信目录,一种是在Office应用的TrustCenter中添加共享的目录;另外一种是在注册表中添加,下面是注册表的一个例子:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\WEF\TrustedCatalogs\{01234567-89ab-cedf-0123-456789abcedf}]
"Id"="{01234567-89ab-cedf-0123-456789abcedf}"
"Url"="\\\\TestServer\\OfficeAddinManifests"
"Flags"=dword:00000001

如果不需要之前sideload的插件,只需清空Office缓存即可,参考Clear the Office cache

sideload的时候需要注意的是Office Add-in必须以https的方式来提供服务,所以往往需要自签名的CA证书。以Word-Add-in-JS-Redact为例,需要把用于自签名的CA证书导入到Windows的证书管理工具的Trusted Root Certification Authorities类别才行。

其他参考

(本篇完)