前言

此处的“插件”,官方的翻译是“加载项”。一个是Addin, 一个是Plugin。

项目上需要实现一个Office/WPS都通用的插件,来实现业务系统与Office/WPS的联动。

那么实现Office/WPS的插件都有哪些方式呢?

Office插件的实现方式

COM

COM (Component Object Model, 组件对象模型)是微软的一套软件组件的二进制接口标准。

Office插件就是一个实现了IDTExtensibility2和IRibbonExtensibility两个接口的COM组件。IDTExtensibility2提供了Office插件接口,IRibbonExtensibility提供了Ribbon界面接口。

VSTO

VSTO (Visual Studio Tools for Office) 是指Visual Studio 为 Office开发人员提供的一系统工具。

通过VSTO, 可以方便的创建Office插件。从本质上讲, VTSO也是使用的COM。它使用 COM 包装器 (RCW) 通过托管 API 与 Office 进行通信。

Web

基于较新版本的Office, 提供了基于Web技术的Office加载项

COM 或 VSTO 加载项是旧 Office 集成解决方案,仅在 Windows 版 Office 上运行。与 COM 加载项不同,Office 加载项不涉及在用户设备或 Office 客户端中运行的代码。对于 Office 加载项,该应用程序(例如 Excel)会读取加载项清单,并挂钩 UI 中的加载项自定义功能区按钮和菜单命令。如果需要,它加载加载项的 JavaScript 和 HTML 代码,此代码在沙盒中的浏览器上下文范围内执行。

意思是Office内嵌了一个浏览器,自定义功能区中的按钮对应一个Web页面。页面与页面之间共享上下文,且提供了Office JavaScript API用来与Office进行通信。

WPS 插件的实现方式

复用 Office的COM插件

通过注册表的配置,WPS可以直接使用Office中COM实现的插件。

包括基于COM实现的插件以及VSTO实现的插件。

Web

Office加载项 类似, WPS也使用Web技术玩了一套插件机制。官方称为WPS加载项

不能说大概一致,只能说一模一样。

WPS内嵌了一个Chromium 开源浏览器,自定义功能区中的按钮对应一个Web页面。页面与页面之间共享上下文,且提供了wpsjs用来与WPS进行通信。

为什么使用VSTO

  • 兼容使用Office和WPS的用户
  • 不直接使用COM,是因为VSTO提供了非常便捷的插件编写方式。比如提供了Ribbon的Designer工具等等。

需要注意的是,VSTO只支持C#/VB。

为什么不用VSTO

(这是后话,后面采用了C++/COM的方式编写插件。)

  • VSTO依赖.NET Framework,这可能需要在目标环境上安装.NET Framework。这比较烦。
  • 如果目标环境只安装了WPS,目前部署上没搞通 (可能是有办法的)

环境搭建

  1. 安装Visiual Studio 2017+ (本文均以VS2017为例)

  2. 安装时勾选 Office/SharePoint开发

  3. 为了测试需要,再安装Office/WPS

第一个插件程序

  1. 打开Visiual Studio 2017

  2. 文件 -> 新建 -> 项目,搜索“外接程序”

  3. 选择你需要的类型

  4. 确定后,会生成解决方案的初始代码。

  5. 第一个插件程序在功能区新增一个选项卡。右键工程,添加 -> 新建项。选择 “功能区(可视化设计器)”。

  6. ThisAddIn.cs中添加如下代码

    1
    2
    3
    4
    5
    protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
    return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
    new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new RibbonMain() });
    }
  7. 在设计器,加上我们需要的按钮或其他控件

  8. 双击设计器上的按钮,会自动生成按钮点击事件的代码,加上业务上需要的逻辑

    1
    2
    3
    4
    5
    private void button_login_Click(object sender, RibbonControlEventArgs e)
    {
    Form1 dialog = new Form1();
    dialog.ShowDialog();
    }
  9. 如果你本机有安装Microsoft PowerPoint, 直接在Visiual Studio 2017启动便可看到下面的效果

Reference