Excel插件系列(一)架构篇

去年(2018)年初公司为了开拓市场,决定提供Excel的数据操作方式,可以提高市场占有率。
恰巧OfficeDev/office-js这个项目早在16年12月份开源,经过一年的完善已经是个成熟的项目了。

需求分析

  1. 用户可以输入我们定义函数(如果用户拖拽函数的话出现M*N级的函数量),来获取数据,同时部分数据需要实时刷新
  2. 需要提供一个操作界面,让用户通过点击插入所有的函数、模板等,刷新部分单元格
  3. 支持一键部署以及自动更新
  4. 插件需要获取系统的信息以及读取ENV里面的license

技术选型

附上EXCEL的构造图

通过询问产品,目前这块国内做的比较好的比如wind。

让我想起了大学时候写的winform程序。。。
不过看了office-js的介绍,觉得这些应该都没问题吧。(坑就这么开始了,这个项目那个时候根本没有这么完善,什么Streaming functions(可以不断的push新值)想都不要想)

需要的技术支持

必须

  • 插入数据
  • 读取单元格数据
  • 控制不同工作表,包括增删改查
  • 自定义函数
  • 一件安装,自动升级
  • 读取系统信息,并能执行系统命令

非必须

  • 对话框

office-js深入调查

首先它会要求你插入一个manifest.xml(这个具体可以看下文档,或者在下一篇中介绍)。这个xml里面指定了插件的基本信息,资源,顶部按钮,以及事件等等。最后顶部的菜单会由Excel生成,而Task panesdialog这些全部是HTML,最终会调用系统的IE进行渲染。

附上当时更具功能提出出来的兼容性表格(补充了当前(20190323)状态):
功能仅对于window而言,mac兼容性会比window更差,想到新的再补充。

功能是否需要体验计划版office(Insider Version)是否需要使用beta api
插入数据
读取单元格数据
控制不同工作表(不包含图表及宏表)
弹窗
自定义函数
excel监听事件是(现在已经不需要了)

如果是beta api那还可以接受,比较只要我更新的够快,BUG就更不上我,毕竟
但是自定义函数始终都是一个preview的功能,而且还不支持类似 rxjs observable multiple push的Streaming functions方式。
最关键的是似乎连发布的计划还没确定

发现问题:如何添加自定义函数,并实现multiple push

office-js 当时就算是 Insider Version 也还是不完全支持的,那么怎么实现函数呢?

  1. 参考了 wind 插件,发现它提供了一个VBA的宏文件,文件里定义了很多函数,函数里面调用一个叫做RTD的函数。(看来这个宏文件只是类似协议转接器的东西)
  2. 通过查找RTD函数的资料,发现C# 还有一个叫做COM组件的东西,而基于COM实现的RTD服务器实现的接口可以被Excel调用。(OO思想果然牛批)
  3. 同时打通这条链路,读取系统信息,并能执行系统命令这个要求也得以实现。

安装与更新

这个插件不是纯粹的 office-js 插件,不符合安全策略:4.21 Your app or add-in must not install or launch other executable code on the user’s environment,也就是无法发布到 AppSource 的。
而且附带的dll库也不支持发布。所以我们需要一个安装程序,来执行RTDmanifest.xml的注册和版本控制。

架构

最终我们得到所有架构

通信与页面架构

下图中,你可能注意到了Office-js Page没有与RTD服务器直接通信,因为Office-js为了平台的兼容性选择了不支持

安装程序架构

卸载也是同理,不过卸载不需要检测更新。

结语

到此为止,除了一些技术细节,大致的架构已经整理完成。接下来谈一谈我的看法吧:
关于office-js:

  • 如果是做一些数据的处理工具,比如翻译、字符编码等等,那么这个repo已经足够的成熟了。
  • 如果需要自定义函数,不太建议使用office-js实现该模块,毕竟大部分用户用不了。
  • 如果可能会调用一些系统命令,这个office-js也帮不上忙。
  • 如果这个自定义函数功能能早点正式发布的话,到时候我就可以为替换掉 RTD 服务器,采用全前端技术栈,并且将支持WIN7+ 改为全平台了。哈哈哈

关于RTD:
COM技术已经十分的成熟,而实现的RTD服务器只需要在代码(c++、c#、vb都可)里面实现对应的 Excel Interface 即可完美运行,建议office-js不足之处可以使用这个来弥补。


接下来我会写关于office-jsRTD相关的文章,同时之后如果有人接手这个项目,到时候就可以把这个东西复制进WIKI,哈哈哈,我真机智!

引用

  1. https://docs.microsoft.com/zh-cn/office/dev/add-ins/ office-js 文档
  2. https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.rtd?view=excel-pia rtd 文档
  3. https://stackoverflow.com/questions/5397607/how-do-i-create-a-real-time-excel-automation-add-in-in-c-sharp-using-rtdserver rtd 使用案例
  4. https://www.add-in-express.com/creating-addins-blog/2011/01/17/excel-real-time-data-architecture/ rtd 原理介绍
Author: PaulHan
Link: https://www.paulhan.cn/blog/2019/03/23/Excel插件系列(一)架构篇/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.