Build systems, not scripts. Leverage AI, don't just ask it.
银河麒麟 V10。aarch64。Python 3.5。OpenSSL 1.0.2g。WPS Office,支持 JSA 宏,不支持 VBA。
这不是技术债。这是现实。
我有一个工作簿 表2026.xlsx,40+ 个工作表,需要合并、清洗、汇总。想用 Python 自动化到 目标.xlsm 里,目标.xlsm包括 JSA 宏——WPS 表格中可以直接调用自定义 JSA 函数,这点确实很赞!
运行脚本。数据对了。宏没了。
openpyxl 只能保留 VBA,不能保留 JSA。文档没说。Stack Overflow 没提。卡住了。
When the tool doesn't fit the problem, change the abstraction.
$ unzip -l 目标.xlsm | grep JDE 12345 2026-02-25 12:00 xl/JDEData.binWPS 的 JSA 宏,本质是 xl/JDEData.bin + 两个 XML 配置:
[Content_Types].xml:注册宏文件类型xl/_rels/workbook.xml.rels:建立工作簿与宏的关联关系openpyxl 保存时会重组 ZIP 结构,丢弃它不认识的条目。不是 bug,是设计。
错误思路:
"怎么让 openpyxl 支持 JSA?"
正确思路:
"怎么在 openpyxl 保存后,把宏配置重新塞回去?"
我没问:"怎么保留 JSA 宏?"(太宽泛)
我做了:
JDEData.bin 是关键每一步,验证、反馈、迭代。AI 提供选项,我决策方向。
将确认保有JSA宏代码的 目标.xlsm 另存为 template.xlsm。
# check_structure.pyimport zipfilewith zipfile.ZipFile("template.xlsm", 'r') as z: for name in z.namelist(): if 'JDE' in name or 'jsMacro' in name: print(name)输出:xl/JDEData.bin → 锁定目标。
def rebuild_zip_with_macros(source, template, output, macro_files): # 1. 读取模板的宏配置到内存 # 2. 读取 source 的所有内容 # 3. 用模板配置覆盖 source 中的对应项 # 4. 统一写入新文件(避免 ZIP 重复条目)关键细节:
zipfile 重建,而非 openpyxl 追加ZIP_DEFLATED 压缩:与原始 xlsm 文件格式保持一致$ python process.py🎉 完成!JSA 宏配置已恢复# 用 WPS 打开 → 宏编辑器显示 JS 代码 → 功能正常❌ "宏丢了怎么办?"
✅ "如何用 Python 在保存 xlsm 时保留 xl/JDEData.bin 及其 XML 关联?"
JDEData.bin 是否存在每一步都有输出、可回滚、可调试。
# 检查文件存在# 捕获 ZIP 操作异常# 打印每一步状态(✓/❌)# 保留 template.xlsm 只读The best time to automate was yesterday. The second best time is after you've manually done it once.
zipfile 查看其 xlsm 内部结构技术会过时。工具会迭代。但系统思维 + 第一性原理 + 人机协同的能力,是复利资产。
你今天的"银河麒麟 + WPS + Python 3.5",可能是别人明天的"新环境 + 新约束 + 新需求"。
Build the system. Ship the solution. Iterate with AI.
办公自动化,不该等待"完美工具"。它该始于:一个 ZIP 文件,一行 Python,一次与 AI 的精准对话。
现在,去构建你的杠杆吧!