跳过正文

WPS二次开发入门:使用JS宏定制个性化功能

目录
wps WPS二次开发入门:使用JS宏定制个性化功能

引言
#

在数字化办公时代,效率是核心竞争力。WPS Office作为一款功能强大的国产办公软件,早已超越了基础的文字处理、表格计算和演示制作范畴。其内置的二次开发能力,尤其是对JavaScript(JS)宏的支持,为用户打开了一扇通往办公自动化和个性化定制的大门。你是否厌倦了重复性的数据整理、格式调整或报告生成工作?是否曾希望WPS能像你的专属助手一样,理解并执行你的复杂操作流程?本文将带你从零开始,深入浅出地掌握WPS JS宏开发,让你能够亲手为WPS“编程”,打造契合个人或团队工作流的个性化功能,从而将工作效率提升至全新高度。无论你是零编程基础的办公人员,还是希望拓展自动化技能的开发者,这都将是一次极具价值的探索。

第一章:认识WPS二次开发与JS宏
#

wps 第一章:认识WPS二次开发与JS宏

1.1 什么是WPS二次开发?
#

WPS二次开发,简而言之,就是基于WPS Office提供的应用程序接口(API),通过编程的方式扩展其原生功能,实现自动化操作、定制化界面或集成外部系统。这允许用户和开发者不再局限于软件出厂时的固定功能,而是可以“创造”出新的工具来解决特定问题。例如,你可以开发一个插件来自动从公司数据库抓取数据并生成每日销售报表,或者创建一个专用工具来批量处理成百上千份文档的格式。

1.2 为何选择JS宏进行开发?
#

WPS支持多种开发方式,如VBA(Visual Basic for Applications)和JS宏。我们重点推荐JS宏,主要基于以下几点优势:

  • 现代且易学:JavaScript是当今最流行的编程语言之一,语法相对简单直观,网络学习资源极其丰富,对于新手更为友好。
  • 跨平台兼容性好:JS宏代码在Windows和Linux版本的WPS中都能良好运行,为跨平台办公环境提供了统一解决方案。
  • 强大的API支持:WPS为JS宏提供了与VBA对等、功能完备的对象模型(Object Model),你可以通过它控制文档、单元格、段落、形状等几乎所有元素。
  • 与Web技术生态融合:熟悉前端开发的开发者可以更快上手,并且未来有潜力与Web应用进行更深度的交互。

1.3 开发前的准备工作
#

在开始编写第一行代码前,请确保你的环境已就绪:

  1. 软件版本:确保你安装的是WPS Office 2019专业版或更新版本(如WPS Office 2024)。个人免费版可能对宏功能有所限制。你可以参考我们的《 WPS Office 2024最新版本免费下载与安装完整指南》获取并安装合适版本。
  2. 启用宏功能:首次使用可能需要手动启用宏。在WPS表格或文字中,点击“开发工具”选项卡(如果未显示,需在“文件”->“选项”->“自定义功能区”中勾选),确认“宏”相关按钮可用。
  3. 心理准备:将学习过程视为掌握一项强大的效率杠杆。从简单的自动化任务开始,积累小成功,逐步构建复杂功能。

第二章:搭建你的第一个JS宏开发环境
#

wps 第二章:搭建你的第一个JS宏开发环境

2.1 访问宏编辑器
#

在WPS表格(ET)或WPS文字(Writer)中,启动宏编辑器非常简单:

  • 方法一:点击顶部菜单栏的“开发工具” -> “JS宏” -> “宏编辑器”。
  • 方法二:使用快捷键 Alt + F11(与Microsoft Office的VBA编辑器快捷键一致)。

编辑器窗口将会弹出,左侧是项目浏览器(管理你的宏模块),右侧是宽敞的代码编辑区。

2.2 理解工程结构与模块
#

在宏编辑器中:

  • 工程(Project):对应你当前打开的WPS文档。每个文档可以拥有自己独立的宏工程。
  • 模块(Module):代码的容器。通常,我们会将相关的函数和过程放在同一个模块中。你可以通过右键点击工程名 -> “插入” -> “模块”来创建新模块。
  • ThisWPSDocument / ThisWorkbook:这是一个特殊的模块,其中的代码与文档/工作簿的生命周期事件(如打开、关闭)相关联。

2.3 编写并运行“Hello, WPS!”
#

让我们用最经典的例子来验证环境:

  1. 在新建的模块中,输入以下代码:
    function HelloWPS() {
        Console.WriteLine("Hello, WPS! 我的第一个JS宏运行成功!");
        Alert("你好!这是一个弹出提示框。");
    }
    
    • Console.WriteLine:将文本输出到编辑器底部的“立即窗口”,用于调试。
    • Alert:弹出一个消息对话框。
  2. 将光标置于HelloWPS函数内部,点击工具栏上的“运行”按钮(绿色三角),或按F5键。
  3. 你将首先在立即窗口看到输出文字,然后弹出一个提示框。恭喜,你的第一个JS宏已成功运行!

这个简单的过程确认了编辑、保存(宏代码随文档保存)和执行的基本流程。

第三章:JS宏基础语法与核心API速览
#

wps 第三章:JS宏基础语法与核心API速览

要驾驭JS宏,你需要熟悉一些JavaScript基础语法和WPS特有的API对象。

3.1 变量、数据类型与函数
#

  • 变量声明:使用 letconst(ES6语法)。let用于可变变量,const用于常量。
    let userName = "张三"; // 字符串变量
    const PI = 3.14159; // 数值常量
    let isActive = true; // 布尔值
    
  • 函数定义:如上例所示,使用 function 函数名(参数) { ... } 来封装可重用的代码块。

3.2 WPS对象模型核心概念
#

WPS的API是一个层次化的对象模型,最顶层的对象是 Application(代表WPS应用程序本身),你可以通过它访问所有下级对象。

  • Application(应用程序):根对象。例如,Application.ActiveDocument 获取当前活动的文字文档,Application.ActiveSheet 获取当前活动的表格工作表。
  • Document / Workbook(文档/工作簿):代表一个打开的文字文档或表格文件。
  • Range(区域):在表格中,这是最重要的对象之一,代表一个或一组单元格。你可以读取或设置它的值(Range.Value)、公式(Range.Formula)、格式(Range.Font, Range.Interior.Color)等。
  • Paragraph / Shape(段落/形状):在文字文档中,用于操作段落和图形对象。

3.3 常用API方法示例
#

  • 获取和设置单元格值
    function handleCellValue() {
        let sheet = Application.ActiveSheet;
        // 获取A1单元格的值
        let value = sheet.Range("A1").Value;
        Console.WriteLine("A1的值是: " + value);
        // 设置B2单元格的值和公式
        sheet.Range("B2").Value = "总计";
        sheet.Range("C2").Formula = "=SUM(A1:A10)";
    }
    
  • 操作文字文档
    function addTextToDoc() {
        let doc = Application.ActiveDocument;
        // 在文档末尾插入段落
        let para = doc.Content.Paragraphs.Add();
        para.Range.Text = "这是通过JS宏插入的文本。\n";
        // 设置部分文本格式
        let rng = doc.Range(para.Range.Start, para.Range.Start + 5); // 前5个字符
        rng.Font.Bold = true;
        rng.Font.Color = wpsColor.Red; // 使用颜色常量
    }
    

掌握这些基础后,你已经具备了实现简单自动化的能力。接下来,我们将通过实战项目深化理解。

第四章:实战项目一:打造智能数据报表自动化工具
#

假设你每周都需要整理一份销售数据,原始数据杂乱,需要清洗、计算并格式化为固定样式的报表。让我们用JS宏自动化这个过程。

4.1 项目目标与设计
#

  • 输入:一个名为“RawData”的工作表,包含无序的销售记录。
  • 处理:1) 按销售员汇总销售额;2) 计算排名;3) 添加条件格式(高亮前三名)。
  • 输出:在“Report”工作表中生成整洁的汇总报表,并自动绘制图表。

4.2 分步实现代码
#

我们创建一个名为 GenerateSalesReport 的函数。

步骤1:定义变量与获取数据源

function GenerateSalesReport() {
    let app = Application;
    let wb = app.ThisWorkbook; // 当前工作簿
    let rawSheet = wb.Sheets.Item("RawData");
    let reportSheet = wb.Sheets.Item("Report");
    // 如果Report表不存在,则创建
    if (!reportSheet) {
        reportSheet = wb.Sheets.Add();
        reportSheet.Name = "Report";
    }
    // 清空Report表旧内容(保留表头)
    reportSheet.UsedRange.Offset(1, 0).Clear(); // Offset跳过标题行
}

步骤2:数据处理与汇总(使用字典对象) WPS JS宏提供了 ActiveXObject("Scripting.Dictionary") 来模拟键值对集合,非常适合汇总。

    // ... 接上文函数内
    let lastRow = rawSheet.Cells.Find("*", undefined, undefined, undefined, wpsSearchOrder.xlByRows, wpsSearchDirection.xlPrevious).Row;
    let dict = new ActiveXObject("Scripting.Dictionary");

    // 遍历原始数据 (假设销售员在B列,销售额在D列)
    for (let i = 2; i <= lastRow; i++) {
        let salesPerson = rawSheet.Range("B" + i).Value;
        let amount = parseFloat(rawSheet.Range("D" + i).Value) || 0;
        if (salesPerson) {
            if (dict.Exists(salesPerson)) {
                dict.Item(salesPerson) += amount;
            } else {
                dict.Add(salesPerson, amount);
            }
        }
    }

步骤3:输出汇总结果并排序

    // 获取键(销售员)并排序
    let keys = new VBArray(dict.Keys()).toArray();
    // 按销售额降序排序(简单冒泡排序示例)
    for (let i = 0; i < keys.length - 1; i++) {
        for (let j = i + 1; j < keys.length; j++) {
            if (dict.Item(keys[i]) < dict.Item(keys[j])) {
                let tempKey = keys[i];
                keys[i] = keys[j];
                keys[j] = tempKey;
            }
        }
    }
    // 写入Report表
    reportSheet.Range("A1").Value = "销售员";
    reportSheet.Range("B1").Value = "销售额";
    reportSheet.Range("C1").Value = "排名";
    for (let idx = 0; idx < keys.length; idx++) {
        let row = idx + 2; // 从第2行开始写数据
        reportSheet.Range("A" + row).Value = keys[idx];
        reportSheet.Range("B" + row).Value = dict.Item(keys[idx]);
        reportSheet.Range("C" + row).Value = idx + 1;
    }

步骤4:应用格式与创建图表

    // 设置货币格式
    let dataRange = reportSheet.Range("B2:B" + (keys.length + 1));
    dataRange.NumberFormatLocal = "\"¥\"#,##0.00";

    // 为前三名添加条件格式(高亮)
    let top3Range = reportSheet.Range("A2:B4");
    let cf = reportSheet.ConditionalFormats.Add(wpsConditionFormatType.xlCellValue, wpsConditionOperator.xlGreaterEqual, "=$B$2", undefined, top3Range);
    cf.Interior.Color = wpsColor.Yellow;

    // 创建一个简单的柱状图
    let chartRange = reportSheet.Range("A1:B" + (keys.length + 1));
    let chart = reportSheet.Shapes.AddChart2(251, wpsChartType.xlColumnClustered, 100, 100, 400, 250).Chart; // AddChart2参数为(样式, 类型, Left, Top, Width, Height)
    chart.SetSourceData(chartRange);
    chart.HasTitle = true;
    chart.ChartTitle.Text = "销售员业绩汇总";

    Alert("销售报表已生成完毕!");
} // 函数结束

运行此宏,一个包含数据汇总、格式化和图表的报表在几秒内即可生成,替代了可能耗时数十分钟的手工操作。你可以将此宏关联到按钮上,实现一键生成。

第五章:实战项目二:创建WPS文字“智能格式刷”宏
#

在文档排版中,我们常常需要将某个段落的格式(字体、缩进、行距等)快速应用到其他多个段落。原生格式刷需要多次点击。我们来创建一个“超级格式刷”,可以一次性将格式应用到用户选定的所有段落。

5.1 项目目标
#

编写一个宏,记录源段落的格式,然后遍历当前选定的所有段落(或全文),将格式统一应用。

5.2 关键API:Selection与ParagraphFormat
#

在WPS文字中,Application.Selection 对象代表当前选中的内容。Paragraph.Format 包含了段落的所有格式属性。

5.3 代码实现
#

function SmartFormatPainter() {
    let app = Application;
    let selection = app.Selection;
    // 检查是否选中了内容,且至少在一个段落内
    if (!selection || selection.Type === wpsSelectionType.wpsNoSelection) {
        Alert("请先选中一个段落作为格式源,或选中要应用格式的目标区域。");
        return;
    }

    // 1. 获取源段落格式
    // 将插入点移动到选中内容的起始处,确保能获取到正确的段落对象
    let sourceRange = selection.Range;
    sourceRange.Collapse(wpsCollapseDirection.wpsCollapseStart); // 折叠到起点
    let sourceParagraph = sourceRange.Paragraphs.First; // 获取源段落
    let sourceFormat = sourceParagraph.Format; // 获取段落格式对象

    // 询问用户:应用到哪里?
    let option = Confirm("请选择应用范围:\n点击【确定】应用到当前选中的所有段落。\n点击【取消】应用到全文所有段落。", "智能格式刷");
    let targetParagraphs;

    if (option) {
        // 应用到当前选中区域内的所有段落
        if (selection.Type === wpsSelectionType.wpsSelectionIP) { // 如果只是插入点
            targetParagraphs = [selection.Paragraphs.First]; // 只应用当前段落
        } else {
            targetParagraphs = selection.Paragraphs; // 选中的多个段落
        }
    } else {
        // 应用到全文
        targetParagraphs = app.ActiveDocument.Paragraphs;
    }

    // 2. 应用格式到目标段落
    // 注意:有些属性是只读的,我们需要复制可写的属性
    let count = 0;
    for (let i = 1; i <= targetParagraphs.Count; i++) {
        let targetPara = targetParagraphs.Item(i);
        let targetFormat = targetPara.Format;

        // 复制关键格式属性(此处列出部分,可根据需要扩展)
        targetFormat.Alignment = sourceFormat.Alignment; // 对齐方式
        targetFormat.FirstLineIndent = sourceFormat.FirstLineIndent; // 首行缩进
        targetFormat.LeftIndent = sourceFormat.LeftIndent; // 左缩进
        targetFormat.LineSpacingRule = sourceFormat.LineSpacingRule; // 行距规则
        targetFormat.LineSpacing = sourceFormat.LineSpacing; // 行距值
        targetFormat.SpaceBefore = sourceFormat.SpaceBefore; // 段前间距
        targetFormat.SpaceAfter = sourceFormat.SpaceAfter; // 段后间距

        // 复制字体属性(需要访问字体对象)
        targetFormat.Font.Name = sourceFormat.Font.Name;
        targetFormat.Font.Size = sourceFormat.Font.Size;
        targetFormat.Font.Bold = sourceFormat.Font.Bold;
        targetFormat.Font.Italic = sourceFormat.Font.Italic;
        // ... 其他字体属性如Color, Underline等

        count++;
    }

    Alert("格式已成功应用到 " + count + " 个段落。");
}

将这个宏添加到WPS文字的快速访问工具栏或自定义功能区,你就拥有了一个强大的批量排版工具。关于WPS更多提升效率的隐藏功能,可以阅读我们的《 WPS特色功能盘点:PDF转Word、流程图、脑图等》。

第六章:代码调试、优化与最佳实践
#

编写出能运行的代码只是第一步,写出健壮、高效、易维护的代码才是终极目标。

6.1 调试技巧
#

  • 立即窗口 (Immediate Window):使用 Console.WriteLine(变量或表达式) 输出中间结果,这是最直接的调试方式。
  • 断点 (Breakpoint):在代码行的左侧灰色区域点击,设置一个红色断点。当运行到此处时,程序会暂停,你可以将鼠标悬停在变量上查看其当前值,或使用立即窗口执行命令。
  • 单步执行 (F8):在断点暂停后,按F8可以逐行执行代码,观察程序流程和变量变化。
  • 错误处理 (Try…Catch):使用 try...catch 语句捕获运行时错误,避免宏意外崩溃并提供友好提示。
    function SafeOperation() {
        try {
            // 可能出错的代码,例如访问不存在的Sheet
            let sheet = Application.ActiveWorkbook.Sheets.Item("不存在的工作表");
            // ... 其他操作
        } catch (error) {
            Console.WriteLine("发生错误: " + error.message);
            Alert("操作失败,原因:" + error.message);
        }
    }
    

6.2 性能优化建议
#

  • 减少与应用程序的交互次数:API调用(如读写单元格)是相对耗时的操作。应避免在循环内进行大量单个单元格操作。
    • 差实践for (let i=1; i<=1000; i++) { sheet.Range("A"+i).Value = i; } (1000次调用)
    • 好实践:将数据先存入数组,然后一次性写入一个区域。
      let data = [];
      for (let i=0; i<1000; i++) data.push([i+1]); // 创建二维数组
      sheet.Range("A1:A1000").Value = data; // 1次调用
      
  • 禁用屏幕更新:在宏执行大量UI变更时,暂时关闭屏幕刷新可以极大提升速度。
    Application.ScreenUpdating = false;
    // ... 执行大量操作的代码
    Application.ScreenUpdating = true;
    
  • 合理使用变量:避免重复计算,将频繁访问的对象(如 Application.ActiveSheet)存储在局部变量中。

6.3 代码维护与安全
#

  • 模块化与注释:将功能拆分成小的、可复用的函数。为函数和复杂逻辑添加清晰的注释。
  • 常量定义:将魔法数字(如特定的颜色值、工作表名)定义为文件开头的常量,便于统一修改。
  • 宏安全性:由于宏可以执行任意代码,来源不明的宏文档可能存在风险。WPS提供了宏安全设置(在“开发工具”->“宏安全性”中),建议设置为“禁用所有宏,并发出通知”,以便在打开含宏文档时自主决定是否启用。

第七章:进阶方向与资源推荐
#

掌握了基础与实战后,你可以向更广阔的领域探索:

7.1 进阶开发方向
#

  • 用户窗体 (UserForm):创建带有按钮、文本框、列表框等控件的自定义对话框,打造更专业的交互界面。通过“插入”->“用户窗体”来创建。
  • 响应文档事件:在ThisWPSDocumentThisWorkbook模块中,可以编写响应“文档打开(Document_Open)”、“文档关闭”、“工作表变更(SheetChange)”等事件的代码,实现更智能的自动化。
  • 调用外部库与REST API:通过复杂的脚本,JS宏理论上可以调用系统组件或与网络API交互(但这通常需要更高级的配置或特定的WPS环境支持,且受安全限制)。
  • 开发独立插件:对于更复杂、通用的功能,可以考虑使用WPS提供的更专业的插件开发框架(如使用C++或.NET),但这需要更强的编程背景。

7.2 学习资源推荐
#

  • 官方文档与社区:WPS开放平台提供了API参考文档和开发者社区,是查找对象、方法、属性详情的第一站。
  • 利用VBA资料:WPS JS宏的API对象模型与Microsoft Office VBA高度相似。当你找不到JS宏的直接示例时,可以搜索VBA的解决方案,然后将其语法转换为JavaScript。大多数对象和方法名是通用的。
  • JavaScript基础学习:推荐MDN Web Docs (developer.mozilla.org) 上的JavaScript教程,夯实语言基础。
  • 实践出真知:最好的学习方式是从解决自己工作中一个具体的、微小的痛点开始。例如,如果你经常需要合并多个表格,可以尝试搜索“WPS JS宏 合并工作表”并动手实现。

常见问题解答 (FAQ)
#

Q1: 我写的JS宏在别人的电脑上无法运行,怎么办? A: 首先确保对方安装了支持JS宏的WPS版本(专业版)。其次,宏代码是保存在文档中的。将包含宏的文档(通常是.et.wps格式,注意.xlsx默认不保存宏)发送给对方,对方打开时需“启用宏”。如果代码引用了特定路径的文件或特殊设置,可能需要在对方电脑上调整路径。

Q2: JS宏和VBA宏哪个更好?我该学哪个? A: 对于WPS新用户和希望未来技术栈更现代的开发者,推荐JS宏。它更符合当前编程趋势,学习曲线平缓。如果你所在环境大量依赖遗留的Microsoft Office VBA代码,且需要无缝迁移,那么学习VBA也有其价值。但WPS对JS宏的支持正在不断加强,是未来的重点方向。

Q3: 宏运行速度很慢,尤其是处理大量数据时,如何改善? A: 请回顾第六章的性能优化建议。最关键的优化点是:1) 将单元格的读写操作批量进行,使用数组一次性赋值;2) 在执行期间关闭屏幕更新 (Application.ScreenUpdating = false)。这两点通常能带来数量级的性能提升。同时,优化你的算法逻辑,避免不必要的嵌套循环。

Q4: 如何将我写好的宏分发给团队其他成员使用? A: 有几种方式:1) 保存为模板:将写好宏的文档另存为模板文件(.ett.wpt),团队成员新建文档时基于此模板。2) 保存为加载宏:对于更通用的功能,可以将其保存为WPS加载宏文件(.xlam类似格式,WPS具体扩展名可能不同),然后在其他电脑的WPS中加载此宏文件,使其在所有文档中可用。3) 简单共享文档:直接发送含宏的文档文件。

Q5: 学习JS宏需要对编程有很深的理解吗? A: 不需要很深,但需要基础逻辑思维。你可以完全从零开始。从录制简单的“宏”开始(WPS支持录制部分操作生成JS代码),然后阅读和修改这些代码,是最快的学习路径。本文的实战项目也是遵循从易到难的原则。遇到问题多搜索、多尝试、多使用调试工具,积累是关键。如果你想更系统地了解WPS的自动化能力,可以先从《 WPS宏功能入门与实战:自动化你的办公任务》这篇文章开始,建立宏观认识。

结语
#

通过本文的旅程,你已从对WPS JS宏一无所知,走到了能够亲手构建两个实用自动化工具的门口。你了解了开发环境、核心语法、关键API,并掌握了调试与优化的基本思想。WPS二次开发的世界广阔而充满可能,从解放双手的重复劳动自动化,到创造性地解决复杂业务流程,JS宏都是你手中一把锋利的瑞士军刀。

记住,所有强大的技能都始于第一个简单的“Hello, World!”。不要试图一开始就构建一个完美的系统。从你最迫切想解决的那个小麻烦开始,写几行代码,看到它成功运行,享受那份效率提升带来的成就感。然后,挑战下一个稍大一点的目标。在这个过程中,你不仅会成为一名更高效的办公者,更将培养出用计算思维解决问题的能力——这在任何领域都是宝贵的财富。

现在,打开你的WPS,启动宏编辑器,开始创造吧!让你的WPS Office真正成为独一无二的、专属的智能办公伙伴。如果在探索过程中遇到与WPS核心功能相关的问题,例如字体管理或云同步,我们的《 WPS字体安装、管理与缺失字体解决方案》和《 WPS云文档同步与团队协作功能全攻略》或许能为你提供额外的帮助。

本文由 WPS Office 官网下载 站点提供,欢迎访问 WPS客户端 页面了解更多办公软件资讯。