图书填表专家。当用户提交一份包含图书信息的表格(Excel)并要求填充、补全、填写字段信息时触发此技能。技能从用户指定的 WorkBuddy 工作空间中自动读取所有图书资料文件(docx/xlsx/txt/pdf 等),智能匹配并直接填入表格中缺失的字段,输出完整填表文件。
图书填表专家(bookform-pro)是一项面向实际任务的技能,主要用于从用户指定的 WorkBuddy 工作空间中自动读取全部图书资料文件,智能解析内容并直接填充至喂投表格中的缺失字段;全自动流程,无需中间审核,直接输出填表结果;
它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
从用户指定的 WorkBuddy 工作空间中自动读取全部图书资料文件,智能解析内容并直接填充至喂投表格中的缺失字段。全自动流程,无需中间审核,直接输出填表结果。
核心能力:
output/ 目录,即填即用核心铁律:填表的本质是"把数据填进空格里",不是"改写表格"。
严禁改动字段名称
严禁改动现有内容
只填写空白字段
不擅自改写字段语义
作者/出版社等"无字段"信息的处理
🔴 严禁无依据填充(零容忍)
🔴 套装书定价规则(全X册)
markitdown 技能可用(用于转换 docx/pdf 等复杂格式)不硬编码工作空间路径,采用以下优先级策略定位:
{PROJECT_DIR}工作空间目录记为 {WORKSPACE_DIR},后续所有文件检索均基于此路径。
输入/输出规范:
{WORKSPACE_DIR}/input/ 或工作空间根目录{WORKSPACE_DIR}/output/(如不存在则自动创建)使用 Glob 工具扫描工作空间中所有文件(模式:**/*),按类型分类处理:
| 格式 | 处理工具 | 说明 |
|---|---|---|
.docx |
markitdown 技能 | 转换为 Markdown 后按段落/表格/键值对解析 |
.xlsx / .xls |
openpyxl(直接读取) | 识别表格行列结构,提取单元格数据 |
.pdf |
markitdown 技能 | 转换为文本后解析 |
.txt / .md / .csv |
Read 工具 | 直接读取文本内容 |
.png / .jpg |
Read 工具(多模态) | 利用 AI 视觉能力识别图片中的文字信息 |
~$*、._*、系统隐藏文件.git/、.svn/.workbuddy/ 目录(内部配置,非业务数据)从解析后的文本中提取结构化图书信息:
字段名:值、字段名: 值、【字段名】值**字段名** 值| 字段 | 值 | 表格整个流程分为 3 步,无需用户审核,全自动执行:
{WORKSPACE_DIR}.docx → 使用 python-docx 解析表格结构.xlsx / .xls → 使用 openpyxl 解析python-docx 读取 table.rows 和 table.cells,注意合并单元格的正确处理ws.iter_rows(),注意 merged_cells 合并区域填写前必须先精确定位每个字段的单元格位置:
对 Word 表格:table.cell(row_idx, col_idx) 或 table.rows[r].cells[c] 对 Excel 表格:ws.cell(row=row_idx, column=col_idx)
字段定位原则:
对每个缺失字段,使用 5 级匹配策略在工作空间资料中查找:
⚠️ 关键原则:字段标签 + 字段值必须在源文件中同时出现。仅凭内容描述推测(如"这是一本科普书" → 类别=少儿科普)视为无依据,不得填入。
| 情况 | 处理 |
|---|---|
| 找到唯一匹配值,且源文件有明确字段标签 | 直接填入对应的空白单元格 |
| 找到唯一匹配值,但源文件无明确字段标签 | 保留空白,视为无依据(如:内容描述含"科普"但不是"图书分类:少儿科普"这种标签格式) |
| 同一字段有多个可能值 | 选择有明确字段标签的填入;均无标签则留空 |
| 未找到任何匹配 | 保留空白,不做标记 |
| 资料有信息但表格无对应字段 | 把信息归入"图书简介"、"内容简介"等综合字段,不修改字段名 |
| 定价字段有多个值(套价+单价) | 书名含"(全X册)"→ 取高价(套价);书名无套书标注 → 取单一值 |
python-docx(Word)或 openpyxl(Excel)直接写入填充数据[原文件名]_已填写.docx 或 [原文件名]_已填写.xlsx{WORKSPACE_DIR}/output/详见 references/field_mapping_rules.md,其中包含完整的图书字段同义词映射表和匹配规则。
核心匹配管道:
原始文本 → [预处理] → [图书定位 S1-S5] → [字段匹配 L1-L5] → [结果聚合]
同义词映射(部分):
作者 = 著者 = 编者 = 编著者 = Author ISBN = 书号 = ISBN号 = 标准书号 出版社 = 出版机构 = 出版单位 = Publisher 定价 = 价格 = 售价 = 原价 = 单价 内容简介 = 内容介绍 = 内容摘要 = 简介 出版时间 = 出版日期 = 出版年 = 上市时间
| 场景 | 处理方式 |
|---|---|
| 工作空间中无该图书资料 | 整行保留空白,汇报时告知用户 |
| 资料中有图书但无该字段值 | 该单元格保留空白,汇报时告知用户 |
| 同一字段有多个可能值 | 自动选择最优匹配(最高置信度来源)填入 |
| 场景 | 处理方式 |
|---|---|
| 文件格式不支持 | 跳过该文件,记录日志,汇总时说明跳过的文件 |
| 文件损坏/无法读取 | 跳过,提示用户检查该文件 |
| markitdown 转换失败 | 降级尝试直接 Read 读取原始内容 |
| 工作空间为空(无有效文件) | 提示"工作空间中未找到任何资料文件,请确认工作空间路径" |
| 场景 | 处理方式 |
|---|---|
| 找不到表头行 | 尝试前 5 行自动识别,失败则询问用户指定表头行号 |
| 找不到书名列 | 先尝试关键词匹配(书名/图书名/名称...),失败则询问用户 |
| 合并单元格 | 使用 openpyxl merged_cells 属性正确读取合并区域的值 |
| 多 Sheet 表格 | 优先处理活动 Sheet,提示用户确认 |
| 同名图书出现多次 | 按行独立处理,各自匹配相同的工作空间数据 |
当待填充表格中含有封面图/封面相关字段列,且工作空间中存在图书资料文件(docx 等包含内嵌图片的文档)时,自动触发此子流程。这是必选流程,不可跳过。
⚠️ 核心原则: 封面图必须通过 docx 内部 XML 精确识别,禁止仅凭文件大小猜测、禁止插入无关图片。
识别算法(按优先级):
word/_rels/document.xml.rels → 建立 rId → 图片文件名映射word/document.xml → 找到所有含 a:blip 元素的段落,收集其上下文(前 3 段文本)对提取的封面图,使用 Read 工具的多模态能力读取图片,确认书名与表格匹配:
Read 工具支持 PNG/JPG 等格式的多模态识别)将识别结果整理为映射 JSON:
{
"mappings": [
{
"book_name": "少年读天工开物",
"image_path": "<临时目录>/提取的封面图.png",
"target_column": ""
}
]
}
target_column 为空时脚本会自动检测"封面图"列根据目标文档格式调用对应命令:
Word 文档 (.docx):
C:UsersASUS.workbuddybinariespythonversions3.13.12python.exe scripts/cover_image_inserter.py insert-word <输入.docx> <输出.docx> --mapping ''
Excel 表格 (.xlsx):
C:UsersASUS.workbuddybinariespythonversions3.13.12python.exe scripts/cover_image_inserter.py insert-excel <输入.xlsx> <输出.xlsx> --mapping ''
插入图片后,自动调整封面图所在单元格的行高和列宽。
| 参数 | 值 | 说明 |
|---|---|---|
| 最大高度 | 4 cm | 硬性上限,等比例缩放宽度 |
| 宽度 | 等比例缩放 | 根据原始宽高比自动计算 |
| 封面图所在行高 | 5 cm (141.73pt) | 仅调整含图片的行,其他行不变 |
| 封面图所在列宽 | 23 字符 | 仅当有封面图插入时才设置 |
| 图片在单元格内 | 水平+垂直居中 | 图片边缘不超出单元格边框 |
| Excel 内部单位 | EMU (1cm = 360000 EMU) | openpyxl 序列化: EMU = img.width × 9525 |
| Word 单位 | Cm | 直接通过 python-docx 的 Cm() 指定 |
使用 OneCellAnchor 精确控制图片在单元格内的位置:
常量: CELL_W_EMU = 1800000 # 单元格宽度(固定 5cm EMU) CELL_H_EMU = 1800000 # 单元格高度(固定 5cm EMU) 计算: img_w_emu = img.width × 9525 img_h_emu = img.height × 9525 col_offset = (CELL_W_EMU - img_w_emu) / 2 # 水平居中偏移 row_offset = (CELL_H_EMU - img_h_emu) / 2 # 垂直居中偏移 锚定: AnchorMarker(col=E-1, colOff=col_offset, row=N-1, rowOff=row_offset) OneCellAnchor(_from=marker, ext=XDRPositiveSize2D(cx=img_w_emu, cy=img_h_emu))
⚠️ CELL_W_EMU 使用固定 5cm 而非从列宽反算: Excel 列宽(字符数)与 EMU 之间没有可靠的线性转换。使用固定 5cm 值确保图片始终在视觉范围内居中,不超出单元格边框。
脚本自动查找以下字段名变体:
| 关键词类别 | 匹配词 |
|---|---|
| 封面图 | 封面图、封面、立体封、立体封面、图书封面、书籍封面、封面照片、封面图片 |
| 英文 | cover, Cover Image, 封面影像 |
word/document.xml)分析段落位置关系。找到标题段落后或"商品主图(封面)"标注后的首张图。禁止仅凭文件大小猜测、禁止从工作空间随机选取图片。OneCellAnchor + AnchorMarker 设置 colOff/rowOff 偏移量,基于固定 CELL_W_EMU=1800000(5cm),确保图片不超出单元格边缘通过 docx 内部 XML 分析,三级优先级保障识别准确率:
解析 word/_rels/document.xml.rels → rId → 图片文件名映射 解析 word/document.xml → 含 a:blip 元素的段落 收集每张图前 3 段文本作为上下文 → 判定优先级
判定优先级:
提取后的图片保存到临时目录(.workbuddy/temp/covers_v2/),以便后续插入表格。
| 场景 | 处理方式 |
|---|---|
| 图片不存在 | 跳过该条映射,记录到 skipped 列表 |
| 未找到封面图列 | 跳过,提示用户确认表格中是否有"封面图"相关列 |
| 未找到书名匹配行 | 跳过,汇报未匹配的书名列表 |
| 目标单元格非空 | 跳过,不覆盖已有内容 |
| 图片格式不支持 | 跳过,提示用户转换为 PNG/JPG |
| PIL/Pillow 缺失 | 回退到默认尺寸(宽约 3cm × 高 4cm),建议安装 Pillow 以获得精确尺寸控制 |
所有脚本通过 managed Python 运行,统一环境配置:
set PYTHONPATH=C:UsersASUS.workbuddybinariespythonworkspace C:UsersASUS.workbuddybinariespythonversions3.13.12python.exe scripts/<脚本名>.py <命令> <参数...>
read→ 解析表格结构,输出 JSON fill <输入路径> <输出路径> --fill-data JSON → 直接写入数据,保持原始格式不变
scan <工作空间目录> [--include PATTERN] → 扫描文件清单,输出 JSON parse <文件路径...> --output JSON → 批量解析文件为结构化数据 extract <解析结果JSON> → 从解析结果构建图书信息知识库
scan <工作空间目录> [--include PATTERN] → 扫描文件清单,输出 JSON parse <文件路径...> --output JSON → 批量解析文件为结构化数据 extract <解析结果JSON> → 从解析结果构建图书信息知识库
match --field <字段名> --source <知识库JSON> --book <图书名>
→ 单字段匹配,返回 {value, confidence, alternatives, status}
batch --mapping <映射JSON> --source <知识库JSON>
→ 批量匹配,处理多个字段
scan-images <工作空间目录> [--pattern PATTERN] → 扫描封面图片文件,输出清单 JSON insert-word<输出路径> --mapping JSON → 将封面图插入 Word 表格 insert-excel <输出路径> --mapping JSON→ 将封面图插入 Excel 表格
{WORKSPACE_DIR}/output/,不污染其他目录当填表目标是 Word (.docx) 文档时,需要注意以下差异:
使用 python-docx 而非 openpyxl:
from docx import Document doc = Document(docx_path) table = doc.tables[0]
正确处理合并单元格:
table.rows[r].cells[c] 在合并区域中会返回相同对象cell._tc.find('.//{http://schemas.openxmlformats.org/wordprocessingml/2006/main}gridSpan') 检查水平合并vMerge 检查垂直合并逐行扫描定位字段:
for r, row in enumerate(table.rows):
for c, cell in enumerate(row.cells):
text = cell.text.strip()
if '字段名关键词' in text:
# 这就是字段标签单元格
value_cell = table.rows[r].cells[c+1] # 右侧通常是值
写入内容时不要破坏格式:
cell.text = "新值" 会清空原段落但保留单元格格式cell.paragraphs[0].runs[0]cell.text 即可常见 Word 表格布局:
[标签] [值][标签1] [值1] [标签2] [值2][标签(合并)] [值(合并)][值(跨多列)] / [标签(跨多列)]相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习