ARTICLE · 1205139
Excel-DNA 插件进 WPS:四层都通,最后一层过不去

用 Excel-DNA 给公司做 Excel 插件,在自己机器上跑得好好的,客户那边一换 WPS 就出事:要么一加载就崩,要么功能区死活不出来。想排查都不知道从哪下手——讲 Excel-DNA 的文章本来就少,讲 WPS 兼容的更少,能把"WPS 到底在哪一层把它挡住"讲清楚的,动手实测之前一篇都没有。
为了解决这个问题,Excel-DNA 提供了一整套跨宿主机制:1.9.0 起把 WPS 主程序 et.exe 加进了进程白名单,配合托管宿主与 COM 动态注册,理论上能把插件送进 WPS。但实测下来,光有机制不够——加载链一共五层,得一层一层打通,而且最后一层在 WPS 12 上根本不存在。
本文按两天的实机实测(WPS 12.1.0.29158 x64 个人版 + Excel-DNA 1.9.0 + .NET 10)往下走:先看问题现象,再拆五层加载链,然后讲两个最关键的坑,接着用一组决定性对照实验定位真正的断点,最后给出终局方案和踩坑清单。全部数据是实机测出来的,不是查文档抄的。
一、问题现象:Excel 里好好的,到 WPS 就断
场景很典型:插件用 Excel-DNA 开发,在微软 Excel 里加载顺畅、功能区正常。客户公司强制用 WPS,或者用户机器上 Excel 和 WPS 并存,一进 WPS 表格就翻车。更麻烦的是没有任何报错线索——你不知道它崩在加载、初始化还是功能区注册,全网也搜不到一篇把断点讲清楚的文章。
排查之前先建立一个基本认知:Excel-DNA 插件进 WPS 不是"能不能跑"一个问题,而是一条五层的链,断在任何一层,表现都差不多。所以正确姿势是把链拆开,逐层验证。
二、五层加载链:断在哪一层,表现都一样
HKCU\Software\kingsoft\Office\ET\AddinsWL(关键,见踩坑 4) | |||
前四层都能用"白名单 + 预置文件"打通,第五层怎么都不行——这不是配置问题,是机制没了。证据在第四节。
三、两个最关键的坑:宿主要预置,白名单有真假
3.1 托管宿主必须预置,WPS 沙箱不让写盘
第一层堵点出现在托管宿主:WPS 的沙箱不允许 xll 往自己目录里写 ExcelDna.ManagedHost.dll,报 Saving EXCELDNA.MANAGEDHOST failed: 0x80070005,链直接断在第三层。
解法是手工预置:把 ExcelDna.ManagedHost.dll(65024 字节)从 xll 的 PE 资源里提取出来,提前放到插件目录。宿主发现文件已存在就跳过写盘,加载继续往下走。这一步不做,后面全免谈。
3.2 白名单有两个长得像的键,只有一个是真的
COM 白名单也有大坑。注册表里有两个名字几乎一样的键:
HKCU\Software\kingsoft\Office\6.0\et\AddinsWL | ||
HKCU\Software\kingsoft\Office\ET\AddinsWL | 真的 |
真键里实测有 78 条记录,Office Tools、KSOAutoTest64.Helper 这些都在里面。我第一次就写错了位置,排查半天还以为机制不存在——换到真键那一刻才发现,白名单机制一直都在,只是我写错了门。
把 ProgID 写进真键就涉及一个问题:Excel-DNA 的 Ribbon/任务窗格用动态 CLSID,ProgID 不是固定的,但不用改源码就能算:
clsId = GuidUtility.Create({306D016E-CCE8-4861-9DA1-51A27CBE341A}, xll完整路径大写)progId = "Dna_" + clsId.ToString("N") + "_" + loadedComAddIns.Count
_0 结尾是 Ribbon,_1 结尾是任务窗格。这套公式来自 ExcelHome 网友 wodewan 的逆向帖(2022),他实测 Excel-DNA 1.5 + WPS 11744 成功。实操建议:装好后让 Excel-DNA 自己注册一次,去 HKCU\Software\Microsoft\Office\Excel\Addins\ 看实际写出来的名字,以注册表为准——我自己手算复复没对上,最后是靠注册表拿到的真实值。
其余几个实测有效的键一并列出,方便速查:
HKCU\Software\kingsoft\Office\6.0\et\LoadMacros | ||
HKCU\Software\kingsoft\Office\6.0\et\LoadAddIns | ||
HKCU\Software\Microsoft\Office\16.0\Excel\Add-in Manager | ||
HKCU\Software\kingsoft\Office\6.0\et\Security\Trusted Locations\LocationN | ||
HKCU\Software\kingsoft\Office\ET\AddinsWL | Dna_xxx_0),数据="" | |
HKCU\Software\kingsoft\Office\ET\AddinsBL |
四、决定性对照实验:VSTO加载项的 Connect 也是 False,Ribbon 却能出来
前四层打通后,插件模块全部命中、进程稳定不崩,但功能区还是不出来。卡点指向第五层:COM 加载项激活。我做了一组对照实验:
第 6 组是决定性的:Office 自动化(VSTO/VBA/Python)体系里微软官方的 VSTO加载项,它的 Connect 同样是 False,Ribbon 却显示得好好的。这说明 WPS 12 的 COMAddIns 集合只是"注册表的读取视图",别信它的 Connect 字段——所有条目都是 False,包括明明在工作的加载项。真正的激活走各自运行时:VSTO加载项有 vstoee.dll 这类运行时支撑,Excel-DNA 没有对应物。
结论落定:第五层在 WPS 12.1 上不是"配置没调对",是机制本身被撤了。判断加载是否成功要看进程模块(tasklist /M),别看 Connect 字段。
五、终局方案:一个产品、两个版本
既然最后一层过不去,就不跟平台较劲,换个姿势交货:一个产品、两个版本。
- Excel 版
:走完整加载链,出 Ribbon 功能区; - WPS 版
:用 CommandBar 工具栏降级——不依赖 COM 激活,按钮照样能用。
白名单我都找到了,最后一级它把机制撤了,那就别硬碰。工具能不能用,不是看它在自己电脑上跑得多顺,是看它在客户的电脑上少弹几次窗。
六、踩坑清单(每条都是实打实撞出来的)
Saving EXCELDNA.MANAGEDHOST failed: 0x80070005 | ExcelDna.ManagedHost.dll(65024 字节)到插件目录 | |
$env:TEMP 返回 8.3 短路径(HUANGJ~1);注册表里的路径一律用完整长路径 | ||
xlfRegister | ||
6.0\et\AddinsWL;换真键 ET\AddinsWL 立刻生效 | ||
LoadMacros、LoadAddIns、信任位置三个键;排查先查这三个键 | ||
tasklist /M) |
七、总结
- 认链条
:Excel-DNA 插件进 WPS 是五层加载链,断在哪一层表现都相似,必须逐层验证——进程白名单、.NET 运行时、托管宿主、COM 注册与白名单,前四层都能打通。 - 认关键点
:托管宿主要预置 ExcelDna.ManagedHost.dll绕开沙箱写盘;白名单真键是Office\ET\AddinsWL,长得像的6.0\et\AddinsWL是假的。 - 认判据
:加载成功与否看进程模块,不看 COMAddIns 的 Connect 字段——对照VSTO加载项就能证明它只是视图。 - 认现实
:第五层 COM 激活在 WPS 12.1 上机制被撤,不是配置问题。终局方案是一个产品两个版本,WPS 用 CommandBar 工具栏降级。
兼容这件事,最难的不是把功能做出来,是搞清楚对方到底在哪一层把你挡住了。
关于我
13 年 IT 全栈,.NET、Python、Office 自动化(VSTO/VBA/Python)都做,也做 AI 应用实操(智能体开发),主业是帮企业和团队把重复劳动自动化——报表一键生成、数据对接、文档批量处理、工具定制。
本科物理化学、硕士计算机化学,在一线实验室待过 13 年(9 年制药 + 4 年第三方检测),现在主要服务药企、检测机构和实验室:SOP、合规、样本流、仪器数据接口这些词不用你解释。
这几年做得比较多的是这几类:Office 自动化(VSTO/VBA/Python)工具定制、数据对接与 LIMS 咨询、技术陪跑。
不是外包码农,是听得懂业务的自己人。有同类场景的朋友欢迎评论区聊聊,先聊清楚再动手不迟。















































































