夜雨聆风学习资料网

ARTICLE · 1205139

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

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 不是"能不能跑"一个问题,而是一条五层的链,断在任何一层,表现都差不多。所以正确姿势是把链拆开,逐层验证。

二、五层加载链:断在哪一层,表现都一样

层
内容
状态
打通手段
1
xll 被 WPS 加载
✅
Excel-DNA 1.9.0 已把 et.exe 加进进程白名单(issue #791,1.9.0-rc6 合入)
2
.NET 运行时起来
✅
进程里实测 hostfxr.dll / coreclr.dll 全命中
3
托管宿主落地
✅
预置 ExcelDna.ManagedHost.dll 到插件目录(关键,见踩坑 1)
4
COM 注册 + 白名单
✅
ProgID 写进 HKCU\Software\kingsoft\Office\ET\AddinsWL(关键,见踩坑 4)
5
COM 加载项激活(Connect=True)
❌
WPS 12.1 无此机制,E_FAIL,无解

前四层都能用"白名单 + 预置文件"打通,第五层怎么都不行——这不是配置问题,是机制没了。证据在第四节。

三、两个最关键的坑:宿主要预置,白名单有真假

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
假的
写了没任何反应,LoadBehavior 一直是 3 不被消费
HKCU\Software\kingsoft\Office\ET\AddinsWL真的
写入后 COMAddIns.Count 从 0 变 2,立刻生效

真键里实测有 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
xll 自动加载清单
值名=xll 完整路径,数据="1"("0"=不加载)
HKCU\Software\kingsoft\Office\6.0\et\LoadAddIns
启动加载清单
值名 LoadingAddIns,数据=xll 完整路径
HKCU\Software\Microsoft\Office\16.0\Excel\Add-in Manager
加载项对话框(WPS 复用微软这个键)
值名=xll 路径,数据="1"
HKCU\Software\kingsoft\Office\6.0\et\Security\Trusted Locations\LocationN
信任位置(消安全提示)
Path=插件目录,AllowSubFolders=1
HKCU\Software\kingsoft\Office\ET\AddinsWL
COM 加载项白名单(真正管用的键)
值名=ProgID(如 Dna_xxx_0),数据=""
HKCU\Software\kingsoft\Office\ET\AddinsBL
黑名单(被拉黑的加载项,如多标签类)
只读参考

四、决定性对照实验:VSTO加载项的 Connect 也是 False,Ribbon 却能出来

前四层打通后,插件模块全部命中、进程稳定不崩,但功能区还是不出来。卡点指向第五层:COM 加载项激活。我做了一组对照实验:

#
实验
结果
说明
1
白名单写错位置(6.0\et)
无反应
LoadBehavior 保持 3 不被消费
2
白名单写对位置(ET)
Count 0→2,Item() 通了
白名单机制证实
3
LoadMacros 加载 xll + 白名单就位
模块全命中、进程稳定不崩
加载链四层全通
4
COMAddIns.Item().Connect=True
E_FAIL (0x80004005)
激活被拒
5
清掉 LoadMacros 纯 COM 激活
无模块命中 + 仍 E_FAIL
WPS 不消费 LoadBehavior=3 的激活语义
6
对照 VSTO加载项:Office Tools 的 Connect
同样 False,Ribbon 却正常显示
COMAddIns 只是视图,激活走各自运行时

第 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 激活,按钮照样能用。

白名单我都找到了,最后一级它把机制撤了,那就别硬碰。工具能不能用,不是看它在自己电脑上跑得多顺,是看它在客户的电脑上少弹几次窗。

六、踩坑清单(每条都是实打实撞出来的)

#
现象
根因与处理
1
Saving EXCELDNA.MANAGEDHOST failed: 0x80070005
WPS 沙箱不让 xll 写盘;手工预置 ExcelDna.ManagedHost.dll(65024 字节)到插件目录
2
手写注册表后 WPS 完全不认
PowerShell 的 $env:TEMP 返回 8.3 短路径(HUANGJ~1);注册表里的路径一律用完整长路径
3
xlfRegister
 直接失败,还把微软 Excel 侧带崩
XLM 命令名带了全宽字符(「|」+空格);命令名用纯中文最稳
4
白名单写了没反应
写到假键 6.0\et\AddinsWL;换真键 ET\AddinsWL 立刻生效
5
"昨天还好好的今天就不加载了"
WPS 自我保护在加载失败一次后清空 LoadMacros、LoadAddIns、信任位置三个键;排查先查这三个键
6
Inno Setup 报 "Text is not inside a section"
Python 以 utf-8-sig 写 .iss 叠了两个 BOM,纯编码问题,跟脚本内容无关
7
误判加载失败
信了 COMAddIns 的 Connect 字段;它只是注册表视图,判断要看进程模块(tasklist /M)

七、总结

  1. 认链条
    :Excel-DNA 插件进 WPS 是五层加载链,断在哪一层表现都相似,必须逐层验证——进程白名单、.NET 运行时、托管宿主、COM 注册与白名单,前四层都能打通。
  2. 认关键点
    :托管宿主要预置 ExcelDna.ManagedHost.dll 绕开沙箱写盘;白名单真键是 Office\ET\AddinsWL,长得像的 6.0\et\AddinsWL 是假的。
  3. 认判据
    :加载成功与否看进程模块,不看 COMAddIns 的 Connect 字段——对照VSTO加载项就能证明它只是视图。
  4. 认现实
    :第五层 COM 激活在 WPS 12.1 上机制被撤,不是配置问题。终局方案是一个产品两个版本,WPS 用 CommandBar 工具栏降级。

兼容这件事,最难的不是把功能做出来,是搞清楚对方到底在哪一层把你挡住了。

关于我

13 年 IT 全栈,.NET、Python、Office 自动化(VSTO/VBA/Python)都做,也做 AI 应用实操(智能体开发),主业是帮企业和团队把重复劳动自动化——报表一键生成、数据对接、文档批量处理、工具定制。

本科物理化学、硕士计算机化学,在一线实验室待过 13 年(9 年制药 + 4 年第三方检测),现在主要服务药企、检测机构和实验室:SOP、合规、样本流、仪器数据接口这些词不用你解释。

这几年做得比较多的是这几类:Office 自动化(VSTO/VBA/Python)工具定制、数据对接与 LIMS 咨询、技术陪跑。

不是外包码农,是听得懂业务的自己人。有同类场景的朋友欢迎评论区聊聊,先聊清楚再动手不迟。

相关学习资料