阅读提示
本文涉及的授权政策、版本号、接口标识核对于 2026 年 9 月。金山办公的宏授权策略这几年调整过不止一次,动手之前,请以你本机实际版本弹出的提示为准。信息核验时点:2026-09(授权政策、版本号、接口标识均核对于 2026 年 9 月)
本文要点
- 一句话定义:这是一篇 Office 与 WPS 六条自动化路线(VBA、WPS JS 宏、Python、COM、Office Web Add-ins、WPS JS 加载项)的横向选型对比,写给要做办公自动化的普通用户和 IT。
- 选型三句话:一次性小脚本用 VBA 或 JS 宏;批量处理、无人值守用 Python 或 COM;要做界面、要分发给别人用,才轮到加载项。
- 判断技巧:代码跟着文件走(同事打开文档就能点按钮)的是宏;不跟着走、本机跑一遍就完的是脚本。
- 最易踩的坑:COM 标识别混——WPS 表格是 Ket.Application,写成 Excel.Application 会报"无效的类字符串";宏文件要存成 .xlsm 或 .docm。
- 版本/时效:内容核对于 2026 年 9 月;VBA 版本号停在 7.1 只修安全补丁;WPS 旧加载项部署方式自 12.1.0.16910 版本起被限制。
- 授权变量:WPS 个人版能否用 VBA 政策改过好几轮,以本机"开发工具 → 切换到 VB 环境"的实际提示为准。
- 短板:COM 路线基本锁死 Windows;Office Scripts 只支持 Excel 且需企业版或教育版许可证。
一、一句话结论
如果你只想要答案,可以先记住三句话:
- 写个一次性小脚本,解决自己手头的重复劳动 —— 装了 Office 用 VBA,只用 WPS 用 JS 宏(JSA)。
- 批量处理几百个文件、跟其他系统对接、半夜无人值守地跑 —— 用 Python,或者直接走 COM。
- 做出来要给别人用,要有界面,要能分发安装 —— 才轮到加载项登场。
拿不准的时候,有个偷懒的判断法:看代码是不是"跟着文件走"的。跟着文件走(发给同事,他打开文档就能点按钮)就是宏;不跟着走(在你自己电脑上跑一遍,跑完就完了)就是脚本。
二、换个角度理解:办公软件到底是怎么"被编程"的?
市面上讲这个话题的文章,习惯一上来就甩六个名词。名词记不住,是因为没弄清它们各自站在哪里。其实只需要想象一栋房子。
2.1 住在房子里的人:进程内脚本
VBA 和 WPS 的 JS 宏都属于这一类。它们被塞在办公软件自己的进程里运行,用的是软件内部的脚本引擎。
好处是离得近:读写单元格、操作文档,几乎零成本,代码还能跟文档一起保存,随文档分发。代价是它也出不了这栋房子。VBA 写了三十多年,本质上仍然只能在这台 Windows 机器上活动,苹果版 Excel 干脆不支持,网页版也只认一部分。
2.2 站在门外用对讲机指挥:进程外自动化
Python 和 COM 是这一类。你的程序在办公软件外面,通过一层标准化的接口(COM)对里面喊话:"打开那个文件,把 A 列删了,保存,退出。"
好处是视野宽。你的程序可以同时读数据库、发邮件、调接口、跑在服务器上,办公软件只是它指挥的一个工具人。代价是重:得先在本机装上 Office 或 WPS,启动软件本身也要花时间,而且这条路基本锁死在 Windows 上。
2.3 给房子加盖一层:扩展与加载项
Office 加载项(Office Web Add-ins)和 WPS JS 加载项是这一类。它们不满足于"用软件",而是要改软件本身 —— 在功能区加一排自己的按钮,在右侧开一个任务窗格,做一个真正的产品。
代价也最大:要写界面、要调试、要部署,做的是软件工程的活,而不是写几行宏。
三、六条路线总览
把上面三层拆开,就是下面这张表。建议先扫一眼,再看后面的逐条拆解。
| 路线 | 语言 | 运行位置 | 授权情况 | 平台覆盖 | 典型场景 |
|---|---|---|---|---|---|
| VBA 宏 | Visual Basic | Office/WPS 进程内 | Office 免费用;WPS 需 VBA 权益 | 桌面端(Mac 受限) | 单文档自动化、存量老代码 |
| WPS JS 宏(JSA) | JavaScript | WPS 进程内 | 个人版即可用 | 取决于 WPS 版本 | WPS 环境下的轻量自动化 |
| Python 自动化 | Python | 独立进程 | 免费 | 跨平台(COM 部分仅 Windows) | 批量处理、数据清洗、无人值守 |
| COM 接口 | 支持 COM 的任意语言 | 独立进程 | 免费 | 仅 Windows | 系统集成、老系统对接 |
| Office Web Add-ins | HTML/CSS/JS/TS | Office 内嵌 WebView | 开发免费,分发需账号 | 网页版、桌面、iPad | 面向多人分发的扩展产品 |
| WPS JS 加载项 | HTML/CSS/JS | WPS 内嵌 WebView | 开发免费 | Windows/Linux 客户端 | WPS 插件、内网工具 |
四、逐条拆解
4.1 VBA:用了三十多年的老方言
VBA 全称 Visual Basic for Applications,1993 年为了赶超 Lotus 1-2-3 被匆匆缝进 Excel。它的版本号从 Excel 2013 时代停在 7.1,之后微软只打安全补丁,没有加过新功能。微软官方文档里,VBA 的推荐顺序也已经排到了 Office Scripts 后面。
但"遗产技术"不等于"不能用"。恰恰相反,它的存量代码量巨大,网上教程、现成的财务对账模板、计算机二级题库,大多基于 VBA。
它最舒服的地方是录制宏:不懂代码也能用。点一下"录制宏",手动把操作做一遍,软件自动生成代码,以后一键回放。
它最难受的地方是界面和网络。做窗体只能用几十年前风格的控件,发个 HTTP 请求要写一大坨代码。
有一个 2025—2026 年的新变化值得单独提一句:微软正在分三个阶段退役 Windows 里的 VBScript。这件事会波及 VBA —— 如果你的 VBA 代码里引用了 VBScript.RegExp(用正则表达式),或者调用了外部 .vbs 脚本,将来会失效。官方的替代方案是:从 Office 2508 版本开始,VBA 编辑器里直接内置了正则类,不用再去引用外部组件。
Dim re As RegExp ' Office 2508 起内置,无需引用 vbscript.dll
Set re = New RegExp
re.Pattern = "^\d{4}-\d{2}-\d{2}$"
re.Global = True
If re.Test("2026-09-29") Then
MsgBox "日期格式正确"
End If4.2 WPS JS 宏(JSA):WPS 自家的现代宏
WPS 里其实有两套宏体系并存:一套是传统的 VBA 宏,一套是用 JavaScript 写的 JS 宏(社区常叫 JSA,JavaScript for Applications)。在"开发工具"选项卡里,你能看到"切换到 VB 环境"和"JS 宏"两个入口。
JS 宏是 WPS 自己押注的方向。它语法更轻,和前端技术栈天然亲近,而且不需要额外安装组件,个人版打开就能用编辑器。功能上也不含糊:可以录制宏生成 JS 代码,可以插入模块和用户窗体,还能用 AddCustomFunction 给表格自定义公式。
要留意的是它和 VBA 的关系:对象模型大体一致(都会用 Workbooks、Worksheets、Range 这些概念),但接口命名有差别。比如同样是弹窗,VBA 写 MsgBox,JS 宏写 Application.Alert。
4.3 Python:站在软件外面指挥
用 Python 做办公自动化,其实是两条完全不同的路,很多人会混为一谈。
第一条路:通过 COM 驱动本机软件。 也就是用 pywin32 库连上已安装的 Office 或 WPS,让它替你干活。这条路等价于"用 Python 写 VBA 能写的东西",好处是 Python 生态强、调试舒服,坏处是同样要装软件、同样只能跑在 Windows 上。
这里有一个特别容易踩的坑:WPS 和 Excel 的接口标识不一样。如果你的电脑上装的是 WPS,写 Excel.Application 是连不上的,会报"无效的类字符串"。WPS 表格的标识是 Ket.Application(K 代表金山 Kingsoft,et 对应 Excel)。
第二条路:直接读写文件,根本不启动软件。 用 openpyxl 读 .xlsx、用 python-docx 读 .docx、用 pandas 处理数据。这条路快得多,也不挑操作系统,缺点是它不会执行文档里的宏,也处理不了复杂的公式和图表联动。
import win32com.client as win32
# 连接 WPS 表格(若是微软 Excel,这里换成 "Excel.Application")
wps = win32.Dispatch("Ket.Application")
wps.Visible = True
wb = wps.ActiveWorkbook # 操作当前已打开的工作簿
ws = wb.Worksheets(1)
ws.Range("A1").Value = "Hello"
wb.Save()
print("A1 =", ws.Range("A1").Value)
# 注意:这里只断开连接,不会关闭 WPS 进程如果只是想改单元格内容、不想让公式弹窗干扰你,第二条路更省事:
from openpyxl import load_workbook
wb = load_workbook("demo.xlsx")
ws = wb.worksheets[0]
ws["A1"] = "Hello"
wb.save("demo.xlsx")安装依赖:
pip install pywin32 xlwings openpyxl pandas4.4 COM:所有进程外自动化的地基
很多人把 COM 当成第六种"独立的编程方式",其实它更像是前面那条 Python 路线脚下的地基。COM(组件对象模型)是微软 90 年代定下的二进制接口标准,它让不同语言写的程序能互相调用。Office 和 WPS 都对外暴露了自己的 COM 对象,于是任何"能说 COM 这门话"的语言都能来指挥它。
能说这门话的语言包括:Python、PowerShell、C#、VB.NET,当然还有 VBA 和 VBScript 本身。所以"用 COM"和"用 Python 通过 COM"本质是一回事,区别只在你怎么写。
微软 Office 家族的标识很规整,软件名加 .Application 就行:Word.Application、Excel.Application、PowerPoint.Application。WPS 则由一组带 K 前缀的标识组成:Kwps.Application(文字)、Ket.Application(表格)、Kwpp.Application(演示),新版还提供了统一入口 wps.Application。
用 PowerShell 调 COM 不需要装任何额外的东西,Windows 自带:
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$book = $excel.Workbooks.Add()
$sheet = $book.Worksheets.Item(1)
$sheet.Range("A1").Value2 = "Hello"
$book.SaveAs("C:\temp\demo.xlsx")
Write-Host "A1 已写入"这条路最常见的四种报错,先记下来能省很多时间:
| 错误码 | 提示信息 | 多半是什么原因 |
|---|---|---|
| -2146959355 | 服务器运行失败 | 32 位与 64 位不匹配,或 COM 组件没注册 |
| -2147221005 | 无效的类字符串 | 标识写错了,典型是 WPS 环境里写了 Excel.Application |
| -2147221008 | 尚未调用 CoInitialize | 在多线程里用 COM,线程没初始化 |
| -2147417851 | 服务器出现意外情况 | 软件崩溃、加载项冲突或对象引用已失效 |
另外,用 COM 加载项(COM Add-ins)做深度集成是可行的,但要知道:Windows 上的新版 Outlook 已经不再支持 COM 和 VSTO 加载项,微软正在把这块往 Web 加载项上迁。
4.5 Office Web Add-ins:微软的现代扩展方案
这是微软给 Office 准备的"正经扩展"路线:用 HTML、CSS、JavaScript(或 TypeScript)写应用,挂进 Office 里。它长得不像宏,而像一个嵌在 Office 里的网页。
它能跑的地方很广:Windows、Mac、Office 网页版、iPad。机制略有差别 —— 在 Office 网页版里,加载项就是一个 iframe,用的是你当前浏览器的内核;在桌面和移动客户端里,用的是系统或 Office 提供的 WebView 控件。具体来说,Windows 上用的是基于 Edge(Chromium)的 WebView2,Mac 和 iOS 上用的是 Safari 的 WKWebView,Android 上用的是 Chrome。
代价是能力被"要求集"框住。Office.js 的 API 是按不同平台分批开放的,同一个方法在网页版能用、在桌面版未必能用,具体得查官方要求集表格。所以它适合从零做新东西,不适合把老 VBA 搬过去。
2026 年还有一条重要变动:从 Visual Studio 2026 开始,在 Visual Studio 里开发和发布 Office 外接程序已被弃用,官方建议改用 Microsoft 365 Agents Toolkit 或 Yeoman 生成器来建项目。
// Office.js:把第 1 个工作表的 A1 设为 Hello
function writeHello() {
Excel.run(function (context) {
var sheet = context.workbook.worksheets.getItemAt(0);
sheet.getRange("A1").values = [["Hello"]];
return context.sync();
});
}4.6 WPS JS 加载项:WPS 的对位方案
WPS 的官方说法是:加载项是一套基于 Web 技术扩展 WPS 的解决方案,每个加载项对应打开一个网页,通过调用网页里的 JavaScript 方法来完成逻辑。
它和 Office 加载项长得很像,但有两个关键差异必须讲清楚。
第一,它的内核到底是什么。 官方文档的原话是"底层是以 Chromium 开源浏览器项目为基础进行的优化扩展"。注意这个措辞:不是把一整个 Chromium 搬了进来,而是以它为底、按自己的需要裁剪优化后的内置浏览器内核。外面流传的"WPS 内嵌完整 Chromium 内核"这种说法,说得太满了。
第二,它跑不出 WPS 客户端。 WPS 加载项本质上是"网页 + 一层 JS 桥接到了 WPS 的 API"。它的网页必须运行在 WPS 自带的那块浏览器里,才会有 wps 对象;放在 Edge、Chrome、Firefox 里打开,什么也拿不到。这一点和 Office 加载项不同,后者是可以在网页版 Office 里跑的。简单说:Office 加载项是"页随 Office 走",WPS 加载项是"页被关在客户端里"。
它的项目结构很朴素,核心就两个文件:一个定义功能区的 ribbon.xml,一个放逻辑的 main.js。文件之间的关系大致是这样:
WPS 加载项项目结构
ribbon.xml --- 定义功能区界面(CustomUI 标准)
└─ customUI
└─ ribbon
└─ tabs
└─ tab label="我的工具"
└─ group label="常用"
└─ button label="写入 Hello" onAction="OnBtnHello"
main.js --- 放接口函数,与功能区按钮一一对应
index.html --- 启动时自动生成的宿主页,不要自己建写一个按钮回调,代码本身很直观:
// main.js:功能区按钮点击后写入 A1
function OnBtnHello() {
let app = wps.WpsApplication();
let book = app.ActiveWorkbook;
let sheet = book.Worksheets.Item(1);
sheet.Range("A1").Value2 = "Hello";
app.Alert("已写入 A1");
}开发流程靠一个命令行工具包 wpsjs 串起来,前提是本机装好 Node.js:
npm install -g wpsjs # 全局安装脚手架
wpsjs create MyAddin # 生成项目骨架
cd MyAddin
wpsjs debug # 启动本地调试服务(默认 3889 端口)
wpsjs publish # 打包并生成发布页五、逐条核验:几个流传说法的问题与修正
以下几条,是初次接触这个话题时最容易记岔的地方。逐条对一遍,能少走弯路。
| 序号 | 常见的说法 | 核验结论 | 修正后的表述 |
|---|---|---|---|
| 1 | "WPS 免费个人版默认禁用 VBA" | 方向对,措辞不准 | 个人版默认不内置 VBA 运行时,需要单独安装官方 VBA 组件;同时新版本把"VBA 使用权"与套餐权益绑定,切到 VB 环境时会弹窗引导。"完全禁用""必须付费才能用"两种说法都不准确,它会随版本变化 |
| 2 | "WPS JS 宏免费版就能用" | 正确 | 保留。JSA 无需安装额外组件,个人版打开"开发工具"就能进编辑器 |
| 3 | "WPS 内嵌完整 Chromium 内核" | 过于绝对 | 官方表述是"以 Chromium 开源浏览器项目为基础进行的优化扩展",是裁剪优化后的内置内核,不是完整 Chromium |
| 4 | VBA 与 JS 宏示例、Python 的 ket.Application | 正确 | 保留。补充:WPS 的标识还有 Kwps.Application、Kwpp.Application,新版有统一入口 wps.Application |
| 5 | 结论"脚本用 VBA/JS 宏、批量用 Python、产品用加载项" | 成立 | 保留,但要补上两个前提:一是平台(是不是只在 Windows 上用),二是授权(WPS 侧 VBA 要过权益这一关) |
关于第 1 条,再展开说一句。这件事之所以容易传错,是因为 WPS 的 VBA 政策改过好几轮:
- 早期版本,个人版可以自己下载官方 VBA 模块装上,装完就能用;
- 后来官方把 VBA 环境收进专业版增强版、WPS+ 等版本;
- 再到近两年,新版本把入口改成"切换到 VB 环境",点下去会提示升级套餐,官方口径指向 WPS 365 商业标准版或商业高级版。
所以在个人版上"想用 VBA"的正确心态是:先试,别信任何一篇文章(包括这篇)的绝对结论。打开"开发工具",看 VB 环境能不能进,比什么都准。
六、同一件事,六种写法
目标统一为:把当前表格第 1 个工作表的 A1 写成 Hello。对比着看,风格的差异会非常直观。
① VBA
Sub WriteHello()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
ws.Range("A1").Value = "Hello"
MsgBox "A1 现在是:" + ws.Range("A1").Value
End Sub② WPS JS 宏(JSA)
function WriteHello() {
let ws = Application.ActiveWorkbook.Worksheets.Item(1);
ws.Range("A1").Value2 = "Hello";
Application.Alert("A1 现在是:" + ws.Range("A1").Value2);
}③ Python 通过 COM(WPS 表格)
import win32com.client as win32
app = win32.Dispatch("Ket.Application")
app.Visible = True
book = app.ActiveWorkbook
sheet = book.Worksheets(1)
sheet.Range("A1").Value = "Hello"
book.Save()
print("A1 =", sheet.Range("A1").Value)④ PowerShell 通过 COM
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$book = $excel.Workbooks.Add()
$sheet = $book.Worksheets.Item(1)
$sheet.Range("A1").Value2 = "Hello"
Write-Host "A1 已写入"⑤ Office Web Add-ins(Office.js)
function writeHello() {
Excel.run(function (context) {
var sheet = context.workbook.worksheets.getItemAt(0);
sheet.getRange("A1").values = [["Hello"]];
return context.sync();
});
}⑥ WPS JS 加载项
function OnBtnHello() {
let app = wps.WpsApplication();
let sheet = app.ActiveWorkbook.Worksheets.Item(1);
sheet.Range("A1").Value2 = "Hello";
app.Alert("已写入 A1");
}① 和 ② 是"住房子里"的写法,改完立刻就能看到效果。③ 到 ⑥ 方案启动成本更高,但你换来的是可维护性和可扩展性。
七、十个最常踩的坑
1. 在 WPS 里写 VBA 之前,先确认能不能进 VB 环境。 进不去就别折腾了,直接改写 JS 宏,或者把任务交给 Python。
2. 宏文件一定要存成 .xlsm 或 .docm。 存成 .xlsx、.docx,宏代码会在保存时被丢掉,而且不会提示你。
3. COM 的标识别写错。 装了 WPS 却写 Excel.Application,会报"无效的类字符串"。反过来也一样。
4. 32 位和 64 位要配套。 32 位的 Office/WPS 配 32 位的驱动方式,位数不一致就会撞上"服务器运行失败"。
5. 多线程里调 COM 要记得初始化。 否则报"尚未调用 CoInitialize"。
6. "能打开文件"不等于"宏能跑"。 用 WPS 打开别人发来的 .xlsm,表格内容、公式、格式通常都能正常显示,但里面的 VBA 宏、ActiveX 控件、外部数据连接不一定能按原样执行。这是两件事。
7. WPS 加载项的旧部署方式已经受限。 改 oem.ini 加载加载项、以及 jsplugins.xml 模式,从 12.1.0.16910 版本开始被限制了。现在推荐用 wpsjs publish 的 publish 模式。
8. 别指望把 WPS 加载项放进浏览器里跑。 没有 WPS 客户端进程、没有那层 RPC 通道,网页里的 WPS 对象就是空的。
9. Office Scripts 不是给所有人的。 它只支持 Excel,而且需要企业版或教育版许可证才能使用或创建。
10. 不要把 VBA 里的 VBScript 调用当成永久可用。 VBScript 正在分三阶段退役,正则表达式相关代码要早点换成本地内置的写法。
八、快问快答
我只用 WPS,想学一门自动化语言,学 VBA 还是 JS 宏?
先看你本机能不能进 VB 环境。能进,且你要复用大量网上的 VBA 代码,学 VBA;进不去,或者你本来就懂一点前端,直接学 JS 宏。
Python 和 VBA 哪个快?
看任务类型。有第三方测试用"批量把文本文件转成表格"做过对比,100 个文件下 Python(openpyxl)耗时约为 VBA 的三分之一,内存占用也更低。但这类数字跟硬件、文件结构强相关,只能当作量级参考 —— 它想说明的是"数据量越大,差距越明显",而不是一个固定的倍数。
为什么我的 WPS 打开 .xlsm 后按钮点了没反应?
大概率是没有 VBA 环境,或者宏被安全策略拦了。先去"开发工具"看宏入口是否可用,再看信任中心的宏设置。
Office 加载项能在国内顺利开发吗?
能做,但工具链比较重,对 Node 版本敏感,部署还要服务器和 HTTPS 证书,个人开发者上手成本不低。如果只是自己用,宏或 Python 更划算。
能不能混合着用?
可以,而且很常见。用 VBA 处理文档内部逻辑,再让 VBA 调用 Python 做重计算;或者用 Python 生成好文件,交给带宏的模板去套版。各取所长,不必强求统一。
九、一页速查表
| 你想做的事 | 推荐路线 | 关键前提 |
|---|---|---|
| 给一份报表加个一键整理按钮 | VBA / JS 宏 | 存成 .xlsm |
| 把 500 个 Excel 合并成一张表 | Python | 装 pandas、openpyxl |
| 让脚本每天凌晨自动跑 | Python + 计划任务 | 无需打开软件 |
| 把表格数据和公司系统打通 | Python 或 COM | 仅 Windows |
| 给整个部门做一个带界面的插件 | WPS JS 加载项 | 装 Node.js,走 wpsjs publish |
| 做一套网页版/桌面版都能装的扩展 | Office Web Add-ins | 需要服务器与分发账号 |
打开老 .xlsm 让里面的宏跑起来 | 装 VBA 组件 | 先确认版本与权益 |
十、信息来源与时效声明
- 授权与政策部分,参考金山办公官方帮助中心与官方博客;微软侧参考 Microsoft Learn 的 Office 加载项文档、Office Scripts 与 VBA 差异说明、以及 VBScript 退役公告。
- 接口标识与内核描述,以 WPS 开放平台的加载项开发说明为准。
- 性能数字来自第三方对比测试,只代表特定条件下的量级,不作为选型依据。
- 本文内容核对于 2026 年 9 月。 办公软件的授权政策和版本号变动较频繁,正式动手前,请以你本机实际版本的界面提示为准。
如果这篇文章帮你少踩了一个坑,欢迎在评论区补充你遇到过的具体情况。