OnlineExcelEditor(本地/附件表格 → 在线编辑)
接收本地文件路径或附件,生成带完整工具栏的 SpreadJS 设计器在线编辑页(前端 import 保留原始格式与样式),用户编辑后回传编辑后的 xlsx 文件与修改摘要,供 Agent 继续处理(汇总、分析等)。
使用场景(触发条件)
使用此技能,当:
- 用户要求“帮我处理这个 Excel 文件”“打开并编辑我的附件表格”“预览并修改这个 xlsx/csv 文件”;
- 用户提供了本地文件路径,或上传/粘贴了附件文件;
- 用户希望先在线编辑文件,再由 AI 基于编辑结果做后续处理;
- 用户要求收集/登记/填报一批结构化数据——用
--form生成可填写的网格表单(每行一条记录,字段为列)。典型业务举例:- 团队排班/值班/轮班表(“帮我收集团队这周的排班”)
- 活动/会议报名、签到登记(“做个报名表让大家填”)
- 请假/考勤、费用报销、物资领用登记
- 设备巡检、安全检查/隐患排查、库存盘点
- 问卷/调研收集、周报/日报收集、门店数据上报
- 项目风险登记(“做一个项目风险登记表”)、客户信息/销售线索收集、候选人登记
不要使用,当:
- 用户只是询问 Excel 处理的一般性问题,没有具体文件;
- 数据来源是网页 URL(改用
web-data-extractor); - 文件是旧版
.xls(不支持,需先另存为.xlsx/.csv)。
支持格式
.xlsx .xlsm .xltx .xltm .csv .sjs .ssjson(不支持 .xls)
前置要求
- 运行环境 Node.js ≥ 18(零第三方依赖,无需 npm install)。
- 用户浏览器需能访问 jsdelivr CDN(编辑页从 CDN 加载 SpreadJS 19.1.1)。
工作流(Agent 执行步骤)
A. 文件编辑模式(默认)
- 确认文件:从用户指令解析文件路径或附件。
- 若用户未提供文件,直接运行
node index.js(不带参数),技能会扫描最近下载目录并列出候选,由用户选择。
- 若用户未提供文件,直接运行
- 运行技能:在技能目录执行:
建议加node index.js <文件路径> [--no-open]--no-open;有图形界面时可省略。 - 展示链接:把 stdout 中打印的
http://localhost:<端口>/index.html链接展示给用户,并提示: “请在浏览器打开,用顶部工具栏编辑表格,完成后点击右上角『下载表格 (xlsx)』。” - 等待完成:进程持续运行,直到用户在浏览器点击「下载表格」后自动退出。点击会直接下载 xlsx 文件,
同时仍通过
POST /save把编辑结果(xlsx base64 + 修改摘要)回传给 Agent——两条路径都会执行, 用户手里一定有文件,Agent 也能拿到结构化数据。 - 解析结果:取 stdout 中最后一个 JSON 对象作为结果。
- 继续原任务:用结果中的
xlsxPath读取编辑后的文件,继续执行用户原始指令。
B. 表单采集模式(--form,数据填报/收集)
- 生成表单定义:根据用户要收集的数据,写一个表单定义 JSON 到临时文件,例如
./排班表.json:{ "type": "form", "title": "团队排班登记", "subtitle": "请为每位成员填写,完成后点击右上角「下载表格 (xlsx)」", "fields": [ { "name": "姓名", "label": "姓名", "type": "text", "required": true, "width": 120 }, { "name": "值班星期", "label": "值班星期", "type": "dropdown", "options": ["周一","周二","周三","周四","周五"], "required": true, "width": 110 }, { "name": "开始日期", "label": "开始日期", "type": "date", "width": 150 }, { "name": "是否出差", "label": "是否出差", "type": "checkbox", "width": 100 } ], "rowCount": 5 }type支持:text/number/dropdown(需options)/checkbox/date。dropdown用「数据验证 → 序列」实现(Excel 原生下拉,导出 xlsx 后仍可下拉,不会像 ComboBox 那样丢失)。required: true→ 表头加*,提交时校验必填(空行自动跳过)。
- 运行技能:
node index.js --form ./排班表.json [--no-open] - 展示链接:把链接展示给用户,提示:“请在浏览器打开,用顶部工具栏填写表格,完成后点击右上角『下载表格 (xlsx)』。” (每行一条记录;可用工具栏增删行。点击会下载填好的 xlsx,同时把填写的记录静默回传给 Agent。)
- 等待完成:用户在浏览器点击「下载表格 (xlsx)」后进程退出,回传结构化记录。
- 解析结果:取 stdout 中最后一个 JSON 对象作为结果。
- 继续原任务:用结果中的
records(或jsonPath读取form_records.json)继续处理。
输出协议(Agent 解析)
文件编辑模式:
{
"type": "file",
"xlsxPath": "<技能运行目录>/temp_skill_xlsx/edited.xlsx",
"savedDir": "<技能运行目录>/temp_skill_xlsx",
"summary": {
"rowCount": 51,
"colCount": 8,
"rowsDelta": -2,
"colsDelta": 1,
"cellsChanged": 14,
"text": "删除了 2 行,增加了 1 列,修改了 14 个单元格"
}
}
xlsxPath:编辑后的文件路径,主流程读取该文件做后续分析。summary.text:中文修改摘要,可向用户复述改动内容。
表单采集模式(--form):
{
"type": "form",
"title": "团队排班登记",
"records": [
{ "姓名": "张三", "值班星期": "周一", "开始日期": "2026-08-10", "是否出差": true }
],
"rowCount": 1,
"jsonPath": "<技能运行目录>/temp_skill_xlsx/form_records.json",
"xlsxPath": "<技能运行目录>/temp_skill_xlsx/form_records.xlsx",
"savedDir": "<技能运行目录>/temp_skill_xlsx"
}
records:用户填写的结构化记录(数组 of 对象),key 为字段name;checkbox 为布尔、date 为yyyy-mm-dd字符串、空数字为null。jsonPath:记录已落盘路径,主流程可直接读取。xlsxPath:用户下载的填好 xlsx 的同一份拷贝,主流程可直接读取(与用户手里的文件一致)。
权限与安全
- 启动本地 HTTP 服务、读写文件、打开浏览器属敏感操作:执行前向用户说明并获取允许。
- 只读取用户指定的文件;未指定时仅扫描用户自己的下载目录候选。
- 涉及敏感文件时提醒用户确认处理范围。
已知限制
- CSV 编码:非 UTF-8(如 GBK)可能乱码,建议先转存 UTF-8。
- 修改摘要对比范围限活动工作表前 500 行 × 200 列(防止超大表卡死浏览器)。
- 表单采集(
--form):下拉字段未选时回传空字符串;checkbox 未勾选回传false;必填校验只针对非空行(整行为空的记录自动跳过)。 - SpreadJS 未配置 LicenseKey 时页面带试用水印,不影响功能。
平台集成(可选)
若平台支持内嵌 iframe 而非启动本地服务:用 lib/html-template.js 的 buildPageHtml(payload) 生成页面,
并把页面的回传从 fetch /save 改为 window.parent.postMessage(result, '*')(「下载表格」下载仍可用);
主流程监听 message 事件即可。
微信扫一扫