昨天匆忙间发布了使用外部程序/VSTO插件执行JSA宏的推文,其实还有一些后续的更劲爆的效果,在某些场景上可以有很好的发挥。
『WPS二次开发最新成果』使用外部程序/VSTO插件执行JSA宏
外部程序/VSTO插件执行JSA宏,可以将JSA宏保存到xlsm文件里,但更好的方式是保存到xlam文件里,用户更无感它的存在。
可以在外部程序/VSTO插件里直接使用Application.Addins.Add,将xlam文件加载进来。当然也可以直接修改注册表,让WPS表格每次启动时自动加载。
使用xlam文件,将它变成普通加载项,不会出现一个新的工作薄的打开。使用体验更友好。
接着,如果用户想获得某个JSA宏嵌入到它的当下的工作薄里,这个又该如何处理。总不能用RPA技术,一步步地打开用户的界面【工具】=》【开发工具】=》【切换到JS环境】=》【WPS宏编辑器】,这样就显得很low,也容易不稳定。
在RPA方案里,这个就简单,直接做好一个xlsm模板文件存放到资源文件里,这个xlsm模板文件预先已经存储了JSA宏代码,从那里复制一个文件再加工就可以了。
如果是插件环境,需要对用户当前的工作薄进行操作呢?
一开始笔者想到的方案是将当前工作薄另存为xlsm(如果当前工作薄不是xlsm文件时),然后打开压缩包,在里面修改JSA宏的文件。
发现这样不可行,里面压根没有JSA宏的【xl\JDEData.bin】文件。
经过多翻测试,直接另存为xlsm,因为没有打开宏编辑器添加过代码,所以不会出现这个文件。
如果从零开始改造xlsx文件,让其转变为一个WPS表格可识别并可加载JSA宏成功的方案,至少要改动以下三个地方。
1、在xl文件夹下添加上JDEData.bin文件,全路径为:【xl\JDEData.bin】
比较可喜的是,JSA宏的代码文件是个文本文件,并没有加密,也不知道未来它们会不会以安全之名又给加密上,目前是可用了。
2、在【xl\_rels\workbook.xml.rels】文件上添加上一个节点,用来和JDEData.bin作绑定关系。
3、在【[Content_Types].xml】文件里,添加上一个节点,用来和JDEData.bin作绑定关系。
经过以上三步操作,重新将解压后的xlsx文件进行zip压缩后,改后缀名为xlsm,使用WPS表格打开后,即可将JSA宏代码加载进文件中并可使用。
如果还想在工作表上,将形状绑定这个JSA宏代码呢?
再次测试后发现,在形状Shape上,对其进行JSA宏代码绑定,最终在xml文件上留下的痕迹是在对应的drawing文件里【xl\drawings\drawing1.xml】,它的xdr:sp节点上多了一个macro属性,指向所在的JSA宏。里面有个[0]序号,估计是第一个模块的意思,没有亲测有多个模块的情况。
总结
经过笔者比较xml文件级别的发现,对一个普通xlsx文件,添加JSA宏代码,也不是一个很困难的事,xlsx格式的一个好处是,本质是文本文件,任何东西的添加,最终都能找到源头,发现规律。就算没有Excel/WPS客户端,也可以手撸一个文件出来,实现相应功能,当然代价就是没有任何API接口的帮助,只能自己对文本文件进行读写操作。
有了本篇的进一步探索,也将JSA宏的应用场景,特别是第三方程序去调用、创建等环节,已经完全打通,接下来就是想象力的时间,一些特定场景,用上本篇的黑科技,产出的效果将是非常惊艳。