# WPS 加载项开发 (`WPS Add-in`) 完整指南
## 概述
WPS 加载项是一套基于 Web 技术用来扩展 WPS Office 应用程序的解决方案。每个加载项本质上对应一个网页,通过调用网页中的 JavaScript 方法来完成功能逻辑。底层基于 **Chromium 开源浏览器项目**,开发者无需关注浏览器兼容问题。
**核心特性**:
- **标准化集成**:不影响 JavaScript 语言特性,网页运行效果与浏览器中完全一致
- **低学习成本**:接口设计符合 JavaScript 语法规范,API 风格与 VBA 一致
- **TypeScript 支持**:`wps-jsapi` 依赖包提供全部接口的 TypeScript 描述,支持 VSCode 代码联想
- **跨平台**:支持 Windows / Linux 操作系统
- **灵活部署**:支持 Publish 模式、jsplugins.xml 模式和动态传递模式
**运行环境要求**:
| 项目 | 要求 |
|------|------|
| WPS Office | 企业版推荐;个人版需 >= 12.1.0.16910 |
| Node.js | 支持至 V20.15 |
| 编辑器 | VSCode(推荐) |
```bash
# 安装开发工具包
npm install -g wpsjs
# 安装 TypeScript 类型定义(可选,用于代码提示)
npm install --save-dev wps-jsapi
```
## 架构组成
WPS 加载项由**自定义功能区(Ribbon)**和**网页部分**两大组成部分构成,通过 JSAPI 实现网页与 WPS 应用程序之间的交互。
```
WPS 加载项架构
├── 自定义功能区 (Ribbon)
│ ├── ribbon.xml # 基于 Office 2007 UI 标准定义
│ ├── 按钮 (Button) # onAction / getEnabled / getVisible
│ ├── 右键菜单 (ContextMenu) # 扩展右键菜单项
│ └── 命令覆盖 (Commands) # 覆盖内置命令行为
│
├── 网页部分
│ ├── TaskPane (任务窗格) # 停靠在主窗口一侧的面板
│ ├── Dialog (对话框) # 弹出式交互界面
│ └── index.html (入口文件) # 加载项主入口
│
└── JSAPI 交互层
├── wps.WpsApplication() # WPS 文字 Application
├── wps.EtApplication() # WPS 表格 Application
├── wps.Application # 通用 Application(演示等)
├── wps.PluginStorage # 跨页面数据共享
├── wps.Enum # 枚举常量
└── wps_sdk.js # Web 集成 SDK 封装
```
### 三种交互方式
| 方式 | 说明 | 适用场景 |
|------|------|---------|
| **自定义功能区** | 通过 `ribbon.xml` 配置 CustomUI 标准控件 | 添加工具栏按钮、菜单项 |
| **任务窗格** (TaskPane) | 停靠在 WPS 主窗口侧边的网页面板 | 展示丰富的交互内容,与文档实时交互 |
| **对话框** (Dialog) | 弹出式网页对话框 | 结合事件监听,实现表单交互 |
---
## 项目目录结构
### 原生 JS 模式
```
HelloWps/
├── images/ # 资源图片,ribbon 菜单图标等
├── js/
│ ├── ribbon.js # ribbon 入口功能 JS(事件分发)
│ ├── taskpane.js # 任务窗格交互逻辑
│ ├── dialog.js # 对话框功能 JS
│ ├── systemdemo.js # 外部系统调用接口
│ └── util.js # 工具类,枚举定义等
├── ui/
│ ├── taskpane.html # 侧边栏内部页面
│ └── dialog.html # 对话框内部页面
├── index.html # 入口文件(核心)
├── ribbon.xml # 定义 customUI(核心)
├── main.js # 代码加载管理入口
├── manifest.xml # 自定义函数元数据(可选)
├── functions.json # 函数定义(可选,可自动生成)
└── package.json # Node.js 项目配置
```
### Vue 模式
```
HelloWps-Vue/
├── public/
│ └── ribbon.xml # 自定义功能区配置
├── src/
│ ├── components/
│ │ ├── js/
│ │ │ ├── ribbon.js # Ribbon 事件处理逻辑
│ │ │ ├── taskpane.js # 任务窗格交互逻辑
│ │ │ ├── dialog.js # 对话框交互逻辑
│ │ │ ├── systemdemo.js # 外部系统调用接口
│ │ │ └── util.js # 工具函数 / 枚举值
│ │ └── views/ # Vue 组件
│ └── App.vue
├── index.html # 入口文件
├── main.js # Vue 应用入口
├── manifest.xml # 自定义函数元数据
├── vite.config.js # 构建配置
└── package.json
```
---
## 1. 快速开始:创建首个加载项
### 创建项目
```bash
# 创建新项目(交互式选择类型和风格)
wpsjs create HelloWps
```
执行后会出现交互式选项:
1. **选择加载项类型**:文字(Writer)/ 电子表格(Spreadsheet)/ 演示(Presentation)
2. **选择代码风格**:无(原生 JS + HTML)/ Vue(集成 Vue 脚手架,v1.5.4+ 支持 Vue3)
### 启动调试
```bash
cd HelloWps
# 启动调试(自动启动 WPS 并加载加载项,支持热更新)
wpsjs debug
```
`wpsjs debug` 会执行以下操作:
- 自动启动 WPS 应用程序并加载加载项
- 启动本地 HTTP 服务,提供前端页面热更新功能
- 检测到文件变化时自动刷新加载项
### 调试工具
- **快捷键** `ALT + F12`:打开加载项独立调试器
- 调试器基于 Chromium DevTools,支持断点、控制台、网络监控等
---
## 2. 自定义功能区 (`ribbon.xml`)
### 基本结构
`ribbon.xml` 是加载项的界面定义文件,基于 **Office 2007 CustomUI 标准**。
```xml
```
### 主要属性说明
| 元素/属性 | 说明 |
|----------|------|
| `onLoad` | 加载时执行的回调函数名 |
| `startFromScratch` | 是否隐藏默认 UI(`false` 保留默认界面) |
| `id` | 元素唯一标识符 |
| `idMso` | 引用 WPS 内置元素标识 |
| `label` / `getLabel` | 静态显示文本 / 动态文本回调 |
| `onAction` | 点击事件处理函数名 |
| `getEnabled` | 启用状态回调函数名 |
| `getVisible` | 可见性回调函数名 |
| `getImage` | 图标获取回调函数名 |
| `size` | 按钮大小(`large` / `normal`) |
| `insertBeforeMso` / `insertAfterMso` | 定位到内置标签的前/后 |
### 注意事项
1. **XML 声明必须顶行顶格**,前面不能有空格或空行
2. `