前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『JSA神助攻之三』将JSA宏另存为xlam以加载项方式供外部程序无感调用和手撸大法生成带JSA宏的xlam文件

『JSA神助攻之三』将JSA宏另存为xlam以加载项方式供外部程序无感调用和手撸大法生成带JSA宏的xlam文件

作者头像
Excel催化剂
发布2024-06-27 19:59:25
1630
发布2024-06-27 19:59:25
举报
文章被收录于专栏:Excel催化剂

此乃旧文,题目改一下,有点系统性,JSA助攻第一波:可以通过Application.Run接口,让外部程序或VSTO/ExcelDNA项目可以调用JSA的宏代码。

以下是历史内容:

昨天匆忙间发布了使用外部程序/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宏的应用场景,特别是第三方程序去调用、创建等环节,已经完全打通,接下来就是想象力的时间,一些特定场景,用上本篇的黑科技,产出的效果将是非常惊艳。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Excel催化剂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档