利用WPS JS宏结合Node.js实现自动化数据抓取与Excel导出
1. 为什么需要WPS JS宏调用Node.js来抓数据如果你经常需要从一些需要登录的网站比如内部系统、数据分析后台、或者某些社区论坛定期抓取数据然后整理到Excel里做分析那你肯定懂我的痛。手动复制粘贴太慢了而且容易出错。用Python写脚本当然可以但很多办公电脑环境限制多安装Python和各种库可能是个麻烦事而且最终还得把数据导进Excel。这时候如果你电脑上正好有WPS Office事情就变得有趣了。WPS内置了JS宏编辑器这玩意儿本质上是一个JavaScript运行环境。但它的能力主要局限在操作WPS自身的文档、表格上对于网络请求特别是处理复杂的、需要携带登录状态Cookie的请求原生支持比较弱。虽然WPS 2024版本开始支持Fetch API这是一个巨大的进步但对于一些老版本用户或者需要更底层控制、更复杂数据处理比如直接生成格式精美的Excel报表的场景我们可能需要更强大的工具。这就是Node.js登场的时候了。Node.js在数据处理和网络请求方面是专家。我们可以想一个“曲线救国”的办法让WPS JS宏扮演一个“指挥官”的角色它通过系统命令调用我们事先写好的Node.js脚本去执行实际的网络抓取和数据处理任务最后把结果比如一个Excel文件生成在指定位置。这个思路特别适合那些日常办公离不开WPS但又需要一点自动化能力的同学。你不用打开复杂的开发环境就在WPS里点一下按钮数据就自动抓取好、整理成表格了非常省心。我最初想到这个方案是因为要每周从几个需要账号登录的行业网站抓取最新的数据报表。纯手动操作耗时耗力用Python脚本又得每次打开IDE运行。后来发现用WPS宏来触发整个流程可以无缝嵌入到我的周报制作流程里效率提升了好几倍。下面我就把这个“缝合”了WPS和Node.js的自动化方案一步步拆开给你看。2. 环境准备让你的电脑“听懂”指令工欲善其事必先利其器。要让WPS能成功指挥Node.js干活我们得先确保几个基础软件已经就位。别担心每一步都很简单。2.1 安装Node.js运行环境Node.js是我们的“主力工人”。首先你需要去Node.js的官方网站nodejs.org下载安装包。建议选择标有“LTS”长期支持版的版本比较稳定。下载下来之后直接双击运行安装程序基本上一直点击“Next”就可以了安装路径用默认的就行。安装完成后我们需要验证一下是否成功。按下键盘上的Win R键输入cmd并回车会打开一个黑乎乎的“命令提示符”窗口。在这个窗口里输入命令node -v然后回车。如果屏幕上显示出了类似v18.19.0这样的版本号那么恭喜你Node.js安装成功了如果提示“不是内部或外部命令”那可能是安装时没勾选“添加到环境变量”的选项你需要重新运行安装程序检查一下或者手动配置一下系统的Path环境变量。2.2 创建项目文件夹与初始化Node.js装好了我们得给它安排一个“工作间”。在你的电脑上找一个合适的位置比如桌面新建一个文件夹名字可以叫wps_data_crawler。这个名字随意但最好别用中文和空格避免一些不必要的路径问题。接下来我们需要在这个文件夹里初始化一个Node.js项目并安装一个关键的依赖包exceljs。这个包能让我们用代码非常方便地创建和编辑Excel文件功能很强。我们不用VSCode也能操作就用刚才的命令提示符窗口。首先在命令提示符里使用cd命令切换到你的项目文件夹。比如我的文件夹在桌面cd C:\Users\你的用户名\Desktop\wps_data_crawler然后执行以下命令来初始化项目并安装依赖npm init -y npm install exceljs第一条命令npm init -y会快速生成一个package.json文件记录项目信息。-y参数表示全部选默认选项省去我们手动确认。第二条命令npm install exceljs就是从网络上下载并安装exceljs这个包。安装成功后你会看到文件夹里多了一个node_modules文件夹和package-lock.json文件。2.3 准备核心的Node.js脚本文件现在在我们刚创建的项目文件夹里新建一个文本文件然后把它的后缀名从.txt改为.js比如命名为crawler.js。这个文件就是我们整个自动化任务的核心大脑所有复杂的网络请求和Excel生成逻辑都会写在这里。你可以用任何文本编辑器来写这个文件比如系统自带的记事本或者更专业的Notepad、VSCode等。我个人推荐VSCode因为它对代码的语法高亮和提示做得很好写起来不容易出错。准备好这个空文件我们接下来就要往里面填充灵魂代码了。3. 核心原理拆解宏如何与Node.js“对话”理解了环境搭建我们来看看最关键的部分WPS JS宏和Node.js脚本之间究竟是怎么沟通的。这个机制是整个方案的桥梁理解了它你就能举一反三。3.1 WPS JS宏的Shell函数启动外部程序的钥匙WPS JS宏提供了一个非常实用的函数Shell。这个函数可以让你在宏里面执行操作系统的命令就像你亲手在“开始菜单”里搜索“cmd”然后输入命令一样。它的基本用法是Shell(command, windowStyle);command一个字符串就是你想要在命令行里执行的完整命令。windowStyle指定命令窗口的显示样式。比如jsNormalNoFocus表示正常打开窗口但不获得焦点jsHide表示隐藏窗口在后台默默执行。举个例子如果我们想在宏里打开计算器可以写Shell(calc.exe, jsNormalNoFocus);运行这行宏代码计算器程序就会被启动。同理我们要启动Node.js运行我们的脚本命令就是node 你的脚本文件路径。3.2 参数传递解决“说什么”的问题光启动Node.js还不够我们得告诉它具体要抓哪个网站、用什么Cookie。这就需要从WPS宏向Node.js脚本传递参数。我们通过命令行的参数来实现。在Node.js脚本里可以通过process.argv这个数组获取到命令行传递过来的所有参数。假设我们在命令行这样执行node crawler.js {url:https://example.com/api}那么在crawler.js文件中process.argv的值就会是[ C:\\Program Files\\nodejs\\node.exe, // Node.js解释器的路径 C:\\path\\to\\your\\crawler.js, // 脚本文件的路径 {url:https://example.com/api} // 我们传递的JSON字符串 ]我们需要的信息就在数组的最后一个元素process.argv[2]。为了传递复杂的数据比如包含URL、请求头、保存路径等一个非常好的办法是将这些配置信息组合成一个JavaScript对象然后通过JSON.stringify()方法把它转换成JSON字符串进行传递。在Node.js脚本里再用JSON.parse()把它还原成对象这样就可以方便地使用了。这里有一个至关重要的细节命令行参数中的双引号需要转义。直接传递一个包含双引号的JSON字符串命令行可能会解析错误。所以在WPS宏里我们在生成命令字符串时需要把JSON字符串里所有的双引号替换成三个双引号。这是Windows cmd的一个特性。let options {url: https://api.example.com/data, method: GET}; let arg JSON.stringify(options); // 转为JSON字符串 arg arg.replace(/\/g, ); // 转义所有双引号 let command node C:\\你的路径\\crawler.js ${arg}; Shell(cmd /k ${command}, jsNormalNoFocus);3.3 执行流程全景图让我们把上面的步骤串起来看看一次完整的自动化抓取是如何发生的你在WPS表格里点击一个绑定好的按钮或者运行一个宏。WPS JS宏代码开始执行。宏代码构造好包含目标URL、Cookie等信息的配置对象并将其转义为命令行参数字符串。宏使用Shell函数启动cmd并命令它执行node crawler.js [参数]。操作系统找到Node.js并运行我们的crawler.js脚本同时把参数字符串传递进去。Node.js脚本启动解析参数向目标网站发送携带了Cookie的HTTPS请求。网站服务器验证Cookie通过返回数据。Node.js脚本接收到数据进行解析和处理。脚本使用exceljs库将处理好的数据写入到一个新的Excel工作簿中。脚本将工作簿保存为.xlsx或.csv文件到你指定的路径比如D盘根目录。Node.js脚本执行完毕退出。命令提示符窗口可能根据你的设置保持打开或关闭。此时你指定的路径下已经生成了包含最新数据的Excel文件。你可以在WPS中直接打开它进行分析。整个过程你只需要在WPS里点一下剩下的全部自动完成。是不是很像拥有了一个私人助理4. 实战编写Node.js数据抓取与导出脚本理论讲完了我们来动手写真正的代码。我会用一个模拟的场景来举例你可以根据自己的实际需求修改其中的URL和数据处理逻辑。4.1 构建网络请求模拟浏览器获取数据首先我们在crawler.js文件里写数据抓取的部分。Node.js内置的https模块对于http链接则用http模块可以让我们发送网络请求。// crawler.js - 第一部分引入模块和解析参数 const https require(https); // 引入https模块 const ExcelJS require(exceljs); // 引入exceljs模块 // 从命令行参数获取配置。process.argv最后一个元素是我们传递的JSON字符串。 const args process.argv; const configJson args[args.length - 1]; // 注意由于我们传递时转义了双引号Node.js接收到的参数可能自带了一层引号。 // 有时需要先去掉首尾可能存在的多余引号再解析。 const configStr configJson.replace(/^|$/g, ); // 移除首尾的引号 const options JSON.parse(configStr); // 解析为配置对象 // 现在options对象里应该包含我们需要的所有信息例如 // { // url: https://目标网站.com/api/data, // method: GET, // fileName: D:\\data_output.xlsx, // headers: { ... } // }接下来我们写一个函数用https.request来发起请求。这个函数会接收配置并在请求完成后通过“回调函数”告诉我们结果。// crawler.js - 第二部分定义数据获取函数 function fetchData(url, requestOptions, callback) { const req https.request(url, requestOptions, (res) { console.log(状态码: ${res.statusCode}); let rawData ; // res对象是一个“流”Stream数据可能会分多次传输过来。 // 每次收到数据片段就拼接到 rawData 变量上。 res.on(data, (chunk) { rawData chunk; }); // 当所有数据都接收完毕触发 ‘end’ 事件。 res.on(end, () { // 此时 rawData 是完整的响应体字符串。 // 我们通过 callback 函数把它传递出去。 callback(null, rawData); // 第一个参数为null表示没有错误 }); }); // 处理请求过程中可能发生的错误如网络断开 req.on(error, (err) { console.error(请求出错:, err); callback(err, null); // 将错误传递出去 }); req.end(); // 真正发出请求 }关键点在于请求头headers的模拟。网站验证登录状态主要看Cookie但User-Agent模拟浏览器类型、Referer来源页面、Origin请求来源等字段也经常被用来做简单的反爬虫判断。这些信息都需要你从浏览器的开发者工具里获取。4.2 解析数据与组装结构拿到服务器返回的rawData通常是JSON格式的字符串后我们需要把它转换成JavaScript对象并从中提取出我们关心的字段。// crawler.js - 第三部分处理数据并准备写入Excel fetchData(options.url, options, (err, data) { if (err) { console.error(抓取失败:, err); return; // 如果出错就停止执行 } try { const responseObj JSON.parse(data); // 解析JSON // 假设我们需要的数据在 responseObj.data.list 这个数组里 const items responseObj.data.list || []; // 准备一个二维数组用来存放Excel每一行的数据 let excelRows []; // 先添加表头第一行 excelRows.push([用户名, 评论内容, 发布时间, 点赞数]); // 遍历数据列表提取字段组成一行行数据 items.forEach(item { const row [ item.user?.name || 匿名, // 用户名如果为空则用‘匿名’ item.content, // 评论内容 new Date(item.createTime).toLocaleString(), // 格式化时间 item.likeCount || 0 // 点赞数 ]; excelRows.push(row); }); console.log(共处理了 ${items.length} 条数据); // 接下来调用写Excel的函数 exportToExcel(excelRows, options.fileName); } catch (parseError) { console.error(解析响应数据失败:, parseError); console.log(原始数据:, data); // 打印出原始数据方便调试 } });这段代码展示了典型的数据处理流程解析JSON - 提取数组 - 遍历并转换格式 - 组装成表格行。你需要根据目标网站返回的实际数据结构来调整responseObj.data.list这个路径和字段名。4.3 使用ExcelJS生成精美的报表数据准备好了现在用exceljs库把它写入Excel。这个库功能非常强大可以设置样式、合并单元格、加公式等等。这里我们先完成最基本的写入。// crawler.js - 第四部分导出到Excel文件 async function exportToExcel(dataRows, filePath) { const workbook new ExcelJS.Workbook(); // 创建一个新的工作簿 workbook.creator WPS-Node自动抓取工具; // 设置属性 workbook.created new Date(); const worksheet workbook.addWorksheet(抓取数据); // 添加一个工作表并命名 // 最简单的方式将二维数组直接写入工作表 worksheet.addRows(dataRows); // 可选简单美化一下表头 const headerRow worksheet.getRow(1); headerRow.font { bold: true, size: 12 }; // 加粗加大字号 headerRow.fill { type: pattern, pattern: solid, fgColor: { argb: FFE0E0E0 } // 浅灰色背景 }; // 自动调整列宽让内容能完整显示 worksheet.columns.forEach(column { let maxLength 0; column.eachCell({ includeEmpty: true }, cell { const columnLength cell.value ? cell.value.toString().length : 10; if (columnLength maxLength) { maxLength columnLength; } }); column.width Math.min(maxLength 2, 50); // 设置一个最大宽度限制 }); try { // 根据文件后缀决定保存格式 if (filePath.endsWith(.xlsx)) { await workbook.xlsx.writeFile(filePath); } else if (filePath.endsWith(.csv)) { await workbook.csv.writeFile(filePath); // 注意csv会丢失样式 } else { // 默认保存为xlsx await workbook.xlsx.writeFile(filePath.replace(/\.[^/.]$/, ) .xlsx); } console.log(文件已成功保存至: ${filePath}); } catch (writeError) { console.error(写入文件失败:, writeError); } }注意exportToExcel函数被声明为async异步并且我们使用await来等待文件写入完成。这是因为写文件是一个耗时的磁盘操作使用异步可以避免阻塞。exceljs的writeFile方法返回一个Promiseawait能让我们更优雅地处理它。5. 在WPS JS宏中组装并触发任务Node.js脚本已经是一个功能完备的独立程序了。现在我们需要在WPS里创建一个宏作为启动这个程序的“遥控器”。5.1 获取浏览器请求信息在编写宏之前最关键的一步是获取目标请求的详细信息。你需要使用Chrome或Edge浏览器的“开发者工具”。打开目标网站并登录。按下F12键打开开发者工具。切换到Network网络 面板。在网站上执行你想要自动化的操作比如点击“查询数据”。在网络面板中找到刚刚发出的那个请求通常是XHR或Fetch类型点击它。在右侧的详细信息中找到Headers标头 选项卡。在这里你需要复制以下关键信息Request URL: 请求的完整地址。Request Method: 请求方法如 GET 或 POST。Request Headers下的cookie: 这是你的登录凭证是整个环节的钥匙。user-agent: 用户代理标识浏览器类型。referer: 来源页面地址。origin: 请求来源。accept: 接受的数据类型。把这些信息记录下来待会要填到我们的宏代码里。5.2 编写WPS JS宏代码打开WPS表格按下Alt F11打开宏编辑器。在左侧“工程”窗口找到你的表格文件右键插入一个“模块”。然后就可以在右侧的代码窗口写代码了。function AutoFetchData() { // 1. 配置抓取参数请替换为你从浏览器获取的真实信息 const requestOptions { url: https://api.example.com/your/data/endpoint, // 替换为真实的请求URL method: GET, // 根据实际情况可能是 POST fileName: D:\\我的数据\\抓取结果_ new Date().toISOString().slice(0,10) .xlsx, // 动态生成带日期的文件名 headers: { accept: application/json, text/plain, */*, cookie: 你的很长一串Cookie字符串在这里, // 粘贴完整的Cookie origin: https://www.example.com, referer: https://www.example.com/page/, user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... // 你的User-Agent } }; // 2. 将配置对象转换为JSON字符串并转义双引号以供命令行使用 let cmdArgument JSON.stringify(requestOptions); cmdArgument cmdArgument.replace(/\/g, ); // 关键转义步骤 // 3. 指定你的Node.js脚本的绝对路径这里是我的示例路径你必须修改 const nodeScriptPath C:\\Users\\你的用户名\\Desktop\\wps_data_crawler\\crawler.js; // 4. 组装完整的命令行指令 // 格式node [脚本路径] [参数字符串] const fullCommand node ${nodeScriptPath} ${cmdArgument}; // 5. 使用Shell函数执行命令 // jsNormalNoFocus: 打开CMD窗口并显示方便调试看日志 // jsHide: 隐藏CMD窗口静默执行适合最终使用 Shell(cmd /k fullCommand, jsNormalNoFocus); // 调试时用 /k窗口会保持打开 // Shell(cmd /c fullCommand, jsHide); // 正式使用时用 /c执行完自动关闭窗口 // 6. 可选提示用户 // Application.Alert(数据抓取任务已启动请稍后查看生成的文件。, jsInformation); }重要提示路径问题nodeScriptPath必须是crawler.js文件的绝对路径且使用双反斜杠\\或单正斜杠/。直接复制我的路径一定会报错请务必修改。Cookie安全这段代码里的Cookie是你的个人隐私信息请妥善保管不要分享给他人或上传到公开的代码仓库。调试初次运行时强烈建议使用cmd /k和jsNormalNoFocus这样Node.js脚本运行时的所有console.log信息包括错误信息都会显示在CMD窗口里方便你排查问题。5.3 绑定宏到按钮并测试代码写好后关闭宏编辑器。回到WPS表格界面你可以在菜单栏找到“开发工具”选项卡如果没有需要在“文件”-“选项”-“自定义功能区”里勾选。在“开发工具”选项卡里点击“插入”选择一个按钮表单控件。在表格上画出一个按钮后会弹窗让你指定宏选择我们刚写的AutoFetchData函数。这样按钮就和宏关联起来了。现在进行第一次激动人心的测试确保你的Node.js脚本crawler.js已经写好了。确保WPS宏里的路径和请求信息配置正确。点击表格上的按钮。你应该会看到一个CMD窗口弹出并开始打印信息。如果一切顺利最后会看到“文件已成功保存至: ...”的提示并且在你指定的fileName路径下确实生成了一个Excel文件。打开它里面应该整整齐齐地排列着你抓取到的数据。6. 避坑指南与进阶技巧第一次尝试很可能不会一帆风顺。下面是我在实践过程中踩过的一些坑以及对应的解决办法希望能帮你少走弯路。6.1 常见错误与排查方法错误‘node’ 不是内部或外部命令原因Node.js没有安装或者安装后没有正确添加到系统环境变量PATH中。解决重新运行Node.js安装程序确保勾选“Add to PATH”选项。或者手动将Node.js的安装目录如C:\Program Files\nodejs\添加到系统的用户环境变量Path中。错误Cannot find module ‘exceljs’原因Node.js脚本找不到exceljs模块。解决确保你在项目文件夹即crawler.js所在的目录下运行了npm install exceljs。并且WPS宏中nodeScriptPath指向的正是这个项目文件夹里的crawler.js文件。错误Unexpected token ‘x’ in JSON at position 0原因Node.js脚本解析命令行参数时出错。通常是参数字符串格式不对比如双引号转义问题或者参数在传递过程中被意外截断、添加了多余字符。解决在Node.js脚本开头打印process.argv看看实际接收到什么。在WPS宏里可以在调用Shell前先用Console.log(fullCommand)把完整的命令打印到WPS的“立即窗口”看看。确保JSON字符串是完整的、正确转义的。错误网络请求返回403/404等状态码原因请求头信息不正确或已过期。Cookie是有时效性的可能已经失效。或者网站有额外的反爬机制如验证Token、签名等。解决重新从浏览器开发者工具复制最新的请求头信息。检查cookie、user-agent、referer是否和浏览器发出的请求完全一致。对于更复杂的反爬可能需要研究请求参数是如何生成的并在Node.js脚本中模拟这个过程。CMD窗口一闪而过原因使用cmd /c且脚本执行出错窗口快速关闭看不到错误信息。解决调试阶段务必使用cmd /k和jsNormalNoFocus。或者在Node.js脚本中使用try...catch包裹主要逻辑并将错误信息写入一个日志文件方便事后查看。6.2 安全性、稳定性与优化建议Cookie管理将Cookie等敏感信息直接硬编码在宏里不安全。一个改进方法是将其存储在WPS表格的某个隐藏工作表里或者一个加密的配置文件中宏运行时再去读取。对于团队使用可以考虑设计一个简单的登录流程让脚本动态获取Cookie。错误处理与日志在生产环境中完善的错误处理至关重要。在Node.js脚本中应该用try...catch包裹所有可能出错的操作网络请求、文件读写、数据解析并将错误详情和运行日志写入到文件而不是仅仅打印到控制台。这样即使后台运行也能追溯问题。设置超时与重试网络请求可能因为各种原因失败。使用axios、got等第三方HTTP客户端库需额外安装可以更方便地设置请求超时、自动重试机制比原生https模块更健壮。定时自动执行WPS JS宏本身不支持定时任务。但你可以结合Windows系统的“任务计划程序”定时打开一个特定的WPS表格文件并设置该文件打开时自动运行宏通过Auto_Open函数从而实现定时抓取。处理分页数据很多API返回的数据是分页的。你需要在Node.js脚本中设计一个循环根据API的响应如has_more字段、page参数来连续请求多页数据并将所有数据合并后再导出到Excel。提升Excel输出质量exceljs库功能非常丰富。你可以探索更多样式设置如字体、边框、对齐方式可以创建多个工作表Sheet可以插入图表甚至可以使用公式。让你的输出报表不仅包含数据还直接具备可读性和美观性。这个方案的精髓在于“组合创新”用WPS这个几乎每台办公电脑都有的工具作为入口和触发器借用Node.js强大的生态和能力来完成重活累活。它可能不是性能最高、架构最优雅的方案但绝对是对办公一族最实用、上手门槛相对较低的自动化方案之一。当你看到点击按钮后数据自动归集到表格里时那种成就感会让你觉得这一切的折腾都是值得的。