WPS 插件的 Java 開發主要基於 WPS 開放平台的 JS 插件體系 + Java 後端服務 實現(WPS 插件核心運行環境是瀏覽器內核,前端用 JS/HTML,Java 作為後端提供業務邏輯支撐);若需深度集成(如本地插件),可基於 WPS 提供的 C++ SDK 封裝 Java 調用(JNI)。

以下是最常用的 WPS 在線/桌面插件(前端 JS + 後端 Java) 開發示例,包含核心流程和代碼模板。

一、開發環境準備

  1. WPS 開發者賬號:註冊 WPS 開放平台,創建應用並獲取 AppId/AppSecret;
  2. 前端環境:HTML/CSS/JS(WPS 插件基於 ES6+);
  3. Java 後端環境:JDK 8+、Spring Boot(快速開發)、Maven;
  4. WPS 插件調試工具:WPS 客户端(開啓開發者模式:設置 → 高級 → 開發者模式)。

二、核心架構説明

WPS 插件運行流程:

WPS 客户端 → 加載 JS 插件(前端) → 調用 Java 後端接口(HTTP/JSON) → Java 處理業務(如數據查詢、文件解析) → 返回結果 → 前端渲染到 WPS 界面

三、示例:WPS 表格插件(Java 後端 + JS 前端)

實現功能:在 WPS 表格中點擊插件按鈕,調用 Java 後端接口獲取數據,並填充到表格中。

1. Java 後端(Spring Boot)
(1)pom.xml 依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/>
    </parent>
    <groupId>com.wps.plugin</groupId>
    <artifactId>wps-plugin-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>wps-plugin-demo</name>
    <description>WPS 插件 Java 後端示例</description>
    
    <dependencies>
        <!-- Spring Web 核心 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- JSON 工具 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        <!-- 跨域支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
(2)後端接口(數據提供)
package com.wps.plugin.controller;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * WPS 插件後端接口
 * 跨域註解:允許 WPS 前端插件調用(WPS 客户端內的插件運行在本地,需跨域)
 */
@RestController
@RequestMapping("/wps/api")
@CrossOrigin(origins = "*", maxAge = 3600) // 開發階段允許所有跨域
public class WpsPluginController {

    /**
     * 示例:獲取表格填充數據
     */
    @GetMapping("/getTableData")
    public JSONObject getTableData() {
        JSONObject result = new JSONObject();
        try {
            // 模擬業務數據(實際可從數據庫/文件讀取)
            List<List<Object>> data = new ArrayList<>();
            // 表頭
            data.add(List.of("姓名", "部門", "薪資"));
            // 數據行
            data.add(List.of("張三", "研發部", 15000));
            data.add(List.of("李四", "產品部", 12000));
            data.add(List.of("王五", "銷售部", 18000));

            result.put("code", 200);
            result.put("msg", "success");
            result.put("data", data);
        } catch (Exception e) {
            result.put("code", 500);
            result.put("msg", "獲取數據失敗:" + e.getMessage());
        }
        return result;
    }

    /**
     * 示例:保存表格數據到後端
     */
    @GetMapping("/saveTableData")
    public JSONObject saveTableData(String data) {
        JSONObject result = new JSONObject();
        try {
            // 解析前端傳入的表格數據(實際可寫入數據庫/文件)
            System.out.println("收到WPS表格數據:" + data);
            result.put("code", 200);
            result.put("msg", "數據保存成功");
        } catch (Exception e) {
            result.put("code", 500);
            result.put("msg", "保存失敗:" + e.getMessage());
        }
        return result;
    }
}
(3)啓動類
package com.wps.plugin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WpsPluginDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(WpsPluginDemoApplication.class, args);
        System.out.println("WPS 插件後端服務啓動成功:http://localhost:8080/wps/api");
    }
}
2. WPS 前端插件(JS/HTML)

WPS 插件核心是 plugin.json(配置文件) + 前端頁面,以下是關鍵文件:

(1)plugin.json(插件配置,必選)
{
  "name": "WPS-Java插件示例",
  "id": "wps-java-plugin-demo",
  "version": "1.0.0",
  "author": "開發者",
  "description": "WPS表格插件,調用Java後端接口",
  "main": "index.html",
  "permissions": [
    "activeSheet",
    "network"
  ],
  "platform": {
    "win32": {
      "minVersion": "11.1.0.10000"
    },
    "mac": {
      "minVersion": "11.1.0.10000"
    }
  },
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },
  "toolbar": [
    {
      "title": "Java插件示例",
      "icon": "icon48.png",
      "cmd": "showMainPanel"
    }
  ]
}
(2)index.html(插件主頁面)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>WPS Java 插件示例</title>
    <style>
        body {
            padding: 20px;
            font-size: 14px;
        }
        button {
            padding: 8px 20px;
            background: #1890ff;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin: 5px;
        }
        button:hover {
            background: #40a9ff;
        }
    </style>
</head>
<body>
    <h3>WPS表格Java插件示例</h3>
    <button onclick="loadData()">加載後端數據到表格</button>
    <button onclick="saveData()">保存表格數據到後端</button>

    <script src="https://cdn.staticfile.org/jquery/3.6.4/jquery.min.js"></script>
    <script>
        // WPS 表格 API 初始化(WPS 內置對象)
        var wps = window.wps || {};
        var app = wps.Application;
        var activeSheet = app.ActiveWorkbook.ActiveSheet;

        // 加載Java後端數據到表格
        function loadData() {
            $.get("http://localhost:8080/wps/api/getTableData", function (res) {
                if (res.code === 200) {
                    var data = res.data;
                    // 清空表格原有內容
                    activeSheet.UsedRange.ClearContents();
                    // 填充數據到表格(從A1單元格開始)
                    for (var i = 0; i < data.length; i++) {
                        for (var j = 0; j < data[i].length; j++) {
                            var cell = activeSheet.Cells(i + 1, j + 1);
                            cell.Value = data[i][j];
                        }
                    }
                    alert("數據加載成功!");
                } else {
                    alert("加載失敗:" + res.msg);
                }
            }).fail(function (err) {
                alert("接口調用失敗:" + err.statusText);
            });
        }

        // 保存表格數據到Java後端
        function saveData() {
            // 獲取表格已使用區域的數據
            var usedRange = activeSheet.UsedRange;
            var rowCount = usedRange.Rows.Count;
            var colCount = usedRange.Columns.Count;
            var tableData = [];
            // 遍歷單元格獲取數據
            for (var i = 1; i <= rowCount; i++) {
                var rowData = [];
                for (var j = 1; j <= colCount; j++) {
                    rowData.push(activeSheet.Cells(i, j).Value);
                }
                tableData.push(rowData);
            }
            // 調用後端保存接口
            $.get("http://localhost:8080/wps/api/saveTableData", {
                data: JSON.stringify(tableData)
            }, function (res) {
                if (res.code === 200) {
                    alert("數據保存成功!");
                } else {
                    alert("保存失敗:" + res.msg);
                }
            }).fail(function (err) {
                alert("接口調用失敗:" + err.statusText);
            });
        }
    </script>
</body>
</html>

四、插件部署與調試

1. 啓動Java後端

運行 WpsPluginDemoApplication,確保服務啓動在 http://localhost:8080

2. 部署WPS前端插件
  1. 創建插件目錄,放入 plugin.jsonindex.html、圖標文件;
  2. 打開WPS客户端 → 點擊「插件中心」→ 「本地插件」→ 「加載插件」→ 選擇插件目錄;
  3. 加載成功後,WPS表格頂部會出現「Java插件示例」按鈕。
3. 調試

點擊插件按鈕,調用「加載後端數據到表格」,即可看到Java後端返回的數據填充到WPS表格中;點擊「保存」可將表格數據提交到Java後端。

五、進階開發(本地C++ SDK + Java JNI)

若需開發本地無網絡依賴的WPS插件(如操作本地文件、調用系統API),可基於WPS C++ SDK封裝JNI接口,讓Java調用C++代碼:

  1. 用C++實現WPS SDK的插件接口;
  2. 通過JNI將C++方法暴露給Java;
  3. Java實現業務邏輯,調用C++接口與WPS內核交互。

核心步驟(簡化):

// C++ 端(WPS SDK)
#include <jni.h>
#include "wps_sdk.h"

extern "C" JNIEXPORT void JNICALL
Java_com_wps_plugin_WpsNativeApi_insertText(JNIEnv *env, jobject obj, jstring text) {
    // 調用WPS SDK插入文本到文檔
    const char *textStr = env->GetStringUTFChars(text, 0);
    wps::Application::ActiveDocument::InsertText(textStr);
    env->ReleaseStringUTFChars(text, textStr);
}
// Java 端(JNI調用)
public class WpsNativeApi {
    static {
        System.loadLibrary("wps-native-sdk"); // 加載C++編譯的動態庫
    }
    // 聲明本地方法
    public native void insertText(String text);
    
    // 業務調用
    public void insertHello() {
        insertText("Hello WPS from Java!");
    }
}

六、關鍵注意事項

  1. 跨域問題:WPS插件前端運行在本地沙箱,調用Java後端需開啓跨域(@CrossOrigin);
  2. WPS API 兼容性:不同WPS版本的API可能有差異,需參考WPS 開放平台文檔;
  3. 打包發佈:Java後端可打包為Jar/War部署到服務器,前端插件需按WPS規範打包並提交審核;
  4. 權限控制:生產環境需限制跨域來源(不要用*),增加接口鑑權(如Token)。

七、參考資源

  1. WPS 開放平台官方文檔(核心API、插件規範);
  2. Spring Boot 官方文檔(後端開發);
  3. JNI 開發指南(本地插件開發)。

通過以上示例,你可以快速搭建WPS插件的Java後端服務,並實現前端插件與Java的交互,擴展WPS的業務能力(如數據對接、報表生成、批量處理等)。