投行 Word 表格美化小助手
概述
自动遍历 Word 文档中所有表格,一次性统一应用以下五项格式规则,保留原始内容不变,仅调整格式。
触发条件
当用户提到以下任意意图时使用本 skill:
- 要求美化/规范 Word 文档中的表格格式
- 要求统一设置表格边框、行距、字体
- 要求对表格列进行对齐规则设置
- 输入文件为 .docx 且需要批量处理表格格式
格式化规则(参考)
处理脚本 scripts/format_tables.py 已实现以下全部规则,此处列出供 AI 向用户说明使用:
| 规则 | 说明 |
|---|---|
| 段落间距与行距 | 表格所有单元格:段前 0 行、段后 0 行、单倍行距(1.0) |
| 段落缩进清零 | 首行缩进、左缩进、右缩进(含字符单位缩进)全部清零,消除粘贴残留 |
| 表格边框 | 外框线 1.5 磅,内框线 0.5 磅 |
| 表头行 | 自动检测单行或多行表头(含合并单元格),全部居中、加粗 |
| 列对齐 | 首列居中;数值/财务列自动检测并右对齐;其余列左对齐;序号/年份列(首列表头命中「序号/编号/年份/年/期间/日期/No./Num」)强制居中;内容为「合计/总计/小计」的单元格强制居中 |
| 字体 | 中文 → 宋体,英文/数字 → Times New Roman,统一五号(10.5pt) |
| 合计行 | 自动检测末行合计/总计/小计行并加粗,防止误判备注中的"合计"字样 |
| 垂直对齐 | 所有单元格垂直居中 |
多行表头智能检测
脚本自动识别表格中的多行表头结构(如截图中的年度分组 + 子指标两行表头),通过以下信号逐行判断:
| 信号 | 检测方式 | 示例 |
|---|---|---|
| A — 垂直合并 (vMerge) | XML 中 w:vMerge 属性 |
"项目"列跨2行垂直合并 |
| B — 大跨度合并 (gridSpan) | XML 中 w:gridSpan 属性(行内无长文本且无数值) |
"2025年度"跨3列横向合并 |
| C — 关键词匹配 | 内容含「占比/毛利率/增长率」等财务术语(50%+ 命中,中文≤18字/英文≤30字) | "营业毛利润 / 占比 / 毛利率" |
| D — 相邻推断 | 上一行是表头 且 当前行无任何数值单元格且无超长文字 | 中英混合子表头行 |
算法以第 0 行为起点的表头行,自上而下逐行判定;遇到首个含数值的数据行即停止。安全上限为前 5 行。检测到的所有表头行统一应用"居中 + 加粗"格式,视觉层级清晰。
合计行自动检测与加粗
脚本自动检测表格末尾的合计/汇总行并加粗,通过以下信号综合判定(防止误判普通数据行):
| 信号 | 检测方式 | 置信度 |
|---|---|---|
| A — 关键词前缀 | 首列以「合计/总计/小计」开头 | 高 |
| B — 关键词包含 | 首列文本含合计指示词(如"其中:合计") | 高 |
| C — 数值占比 | 整行 ≥80% 非空单元格为数值 + 首列为数值或短标签 | 中 |
| D — 大跨度合并 | 存在 gridSpan≥3 的合并单元格 + ≥50% 数值 | 中 |
防误判机制:
- 仅检查首列,备注列中的"合计"字样不触发
- 要求表头与末行之间至少有 1 行数据(排除仅表头+合计的微型表)
- 数值占比阈值从 50% 提升至 80%,避免普通数据行误判
支持的合计关键词:合计、总计、小计、累计、汇总、total、sum、grand total、subtotal(含首列括号变体如"合计(万元)")。
合计标签居中规则:单元格内容(去空格及尾随标点后)完全等于「合计/总计/小计」(含繁体合計/總計/小計)时,该单元格强制居中,优先级高于列对齐与数值右对齐;其余合计关键词(累计/汇总/total 等)仅参与合计行检测,不触发单元格居中。
数值列自动检测逻辑
跳过表头后,若某列中超过 50% 的非空单元格为数值/金额/百分比格式,则判定为数值列。支持的数值格式包括:
- 纯数字:
123、1,234、3.14 - 金额:
¥100、$50、100元、100万元、1.5亿元 - 百分比:
25%、3.14% - 负数:
-50、(100)、(1,234.56)万元 - 大数:
1.5万、3亿
gridSpan 感知列映射(v1.1 新增)
脚本通过 table.columns 获取表格真实逻辑列数,并为每行构建 {逻辑列索引 → 物理 cell} 映射,解决横向合并单元格(gridSpan≥2)导致的物理列索引错位问题。列对齐和数值列检测均基于逻辑列索引。
工作流
处理单个文档
- 确认用户提供的
.docx文件路径有效 - 运行格式化脚本:
python scripts/format_tables.py <输入文件.docx> [输出文件.docx]
- 若省略输出路径,脚本将自动另存为
<原名>_美化.docx(原文件不会被覆盖);仅当显式传入与原文件相同的输出路径时才覆盖(脚本会打印警告) - 查看脚本输出,确认处理的表格数量和状态
处理前确认
在执行脚本前,向用户确认:
- 要处理的文件路径
- 是否需要备份原文件(省略输出路径时脚本默认另存为 <原名>_美化.docx,不会覆盖原文件)
- 输出文件路径(显式指定时按指定路径保存)
依赖
脚本依赖 python-docx 和 lxml 库。如环境中未安装,执行:
pip install python-docx lxml
跨平台注意事项
- 字体兼容性:脚本硬编码中文字体为"宋体"。在 macOS / Linux 上"宋体"不可用时,Word 打开文档会自动回退到系统默认中文字体,文档可正常使用但外观可能略有差异。
- 环境:脚本已在 Windows(含 Git Bash / PowerShell)下验证。
OOXML 有效性红线(2026-08-10 修复沉淀,改代码前必读)
Word 对 OOXML 的校验远比 python-docx/WPS 严格,python-docx 能写能读 ≠ Word 能打开。
以下错误会让 Word 报「无法读取的内容」,点击「是」恢复后格式被丢弃:
- 子元素顺序:
tblPr / trPr / tcPr / rPr的子元素必须按 ECMA-376 顺序。
常见雷区:tblPr内tblBorders/tblCellMar必须在tblLook之前;trPr内trHeight
在jc之前;rPr内rStyle最前、rFonts紧随其后。脚本内统一用_insert_ordered
按顺序表插入,禁止裸append()向上述容器加子元素(_set_run_font的 rFonts 已处理 rStyle 前置)。 - 空单元格:
w:tc必须至少含一个w:p。删除单元格空段落时(如 vMerge 延续格全空)
每格至少保留一段。_remove_empty_paragraphs_in_cells已内置remaining<=1保护。 - 属性值:宽度/行高等数值属性不得为负或非整数。
交付前验证两步(缺一不可):
# ① Word COM 严格打开(本机装有 Word;损坏即抛异常,不弹恢复框)
$w = New-Object -ComObject Word.Application; $w.Visible=$false; $w.DisplayAlerts=0
$d = $w.Documents.OpenNoRepairDialog("输出文件.docx", $false, $true) # 抛异常=损坏
$d.Close($false); $w.Quit()
# ② 用 Word 打开原文件做基线对照:原文件坏 ≠ 脚本的锅
- 若本机无 Word,用 zipfile 解出 document.xml,按上述 4 张顺序表遍历校验(顺序+重复)。
资源
scripts/format_tables.py
可独立运行的表格格式化脚本。接收 .docx 文件路径作为参数,自动遍历所有表格并应用格式规则。
用法:
python scripts/format_tables.py report.docx # 另存为 report_美化.docx(原文件保留)
python scripts/format_tables.py report.docx formatted.docx # 另存为 formatted.docx