如何通过本地HTML+JavaScript编写的Word加载项运行本地EXE程序
在离线HTML+JS版Word加载项中运行本地EXE的可行方案
你尝试的两种方法失效的核心原因是现代Office加载项的安全限制:
window.open("file:///C:/Windows/notepad.exe"):Office加载项使用的WebView2(Windows)或WebKit(Mac)出于安全考虑,会拦截本地可执行文件的直接打开请求,仅触发下载。ActiveXObject("Shell.Application"):仅支持旧版IE,现代Office加载项已切换到Chromium内核的WebView2,完全不兼容ActiveX,因此该方法无效。
以下是几种可行的离线解决方案:
方案1:VBA宏中间层(Windows专属,离线可用)
通过Word内置的VBA宏作为桥梁,让JS加载项调用宏来执行本地命令:
- 打开Word,启用「开发工具」选项卡,插入模块并添加VBA代码:
Sub LaunchLocalEXE(exeFullPath As String) ' 启动指定路径的EXE,vbNormalFocus表示正常窗口显示 Shell exeFullPath, vbNormalFocus End Sub - 在你的JS加载项中,通过Office.js调用该宏:
注意:需提前在Word中信任该宏文件,加载项需配置对应的权限(在manifest.xml中声明对VBA的调用权限)。// 调用VBA宏,传入EXE路径 Office.context.document.run("LaunchLocalEXE", "C:\\Windows\\notepad.exe") .then(() => console.log("程序已启动")) .catch(err => console.error("启动失败:", err));
方案2:WebView2原生消息主机(Windows专属,需提前部署)
利用Office加载项底层的WebView2原生消息机制,通过本地原生程序中转启动EXE:
- 编写一个轻量Win32/WinForms程序,注册为WebView2的消息主机(需在注册表中添加对应项,指定程序路径)。
- 在JS加载项中发送消息到该主机:
// 向自定义消息主机发送启动指令 chrome.runtime.sendMessage("com.yourdomain.localexe.launcher", { action: "run", exePath: "C:\\Windows\\notepad.exe" }, (response) => { console.log(response ? response.status : "无响应"); }); - 原生主机程序收到消息后,调用
ShellExecute或CreateProcessAPI启动目标EXE。
注意:需将原生程序提前部署到用户本地,离线环境下无需网络。
方案3:PowerShell脚本中转(Windows专属)
通过VBA调用PowerShell脚本执行启动命令,适合不想编写原生程序的场景:
- 编写PowerShell脚本
StartEXE.ps1:param([string]$ExePath) # 启动指定程序 Start-Process -FilePath $ExePath -WindowStyle Normal - 修改VBA宏调用该脚本:
Sub LaunchViaPowerShell(exePath As String) Dim psCmd As String ' 绕过执行策略,调用脚本 psCmd = "powershell.exe -ExecutionPolicy Bypass -File ""C:\\Scripts\\StartEXE.ps1"" """ & exePath & """" Shell psCmd, vbNormalFocus End Sub - 同样通过Office.js的
document.run调用该VBA宏即可。
注意:需确保用户的PowerShell执行策略允许运行本地脚本。
重要限制
- 所有方案仅支持Windows平台,Mac版Office的WebKit引擎安全限制极严,无法直接启动本地EXE。
- 必须确保用户信任相关组件(宏、原生程序、脚本),否则会被Office安全策略或杀毒软件拦截。
- 全程离线需提前将所有依赖(宏文件、原生程序、脚本)部署到用户本地设备。
内容的提问来源于stack exchange,提问作者FilipA
相关产品推荐
相关产品推荐

