| 名称 | xlsx-cn 名称: Excel中文表格处理 |
| 描述 | “批量创建、清洗、合并与美化 Excel 工作簿(.xlsx)的中文业务表格技能:生成工资表、成绩单、进销存、台账等报表,按中文表头模糊对齐合并多个表,清洗文本型数字、全角字符、混乱日期与合并单元格,保护身份证号/工号等标识列的前导零,并套用千分位、负数标红、冻结窗格与打印排版。触发词:Excel、xlsx、表格、报表、工资表、成绩单、数据清洗、多表合并、批量处理、格式化、openpyxl。” |
| 版本 | v1.0.0 |
| 开源协议 | MIT allowed-tools: Bash(python *) metadata: emoji: “📊” openclaw: requires: bins: [“python”] install: - id: pip-openpyxl kind: pip package: openpyxl label: 安装 openpyxl |
以下是关于 xlsx-cn 技能的说明。
描述
本技能协助智能体批量创建、清洗、合并与美化 Excel 工作簿(.xlsx),面向工资表、成绩单、进销存、台账等中文业务表格场景。它通过本技能目录下的 scripts/ 脚本,以确定性方式完成诊断、清洗、合并与排版四类操作,并以内置的 references/chinese-spreadsheet-conventions.md 作为中文表格规范的判断依据。使用前请先阅读《注意事项》,其中前两条违反会造成不可逆的数据事故。关键词:Excel、xlsx、表格、报表、工资表、成绩单、数据清洗、多表合并、批量处理、格式化、openpyxl。
快速开始
# 0. 先诊断(必做):表头在第几行、合并区域、逐列问题清单
python scripts/inspect_workbook.py 输入.xlsx
# A. 清洗:类型归一、合并单元格填充、标识列保护、去重
python scripts/clean_table.py 输入.xlsx -o 清洗后.xlsx
# B. 合并:按中文表头模糊对齐后纵向合并多个表
python scripts/merge_tables.py -o 汇总.xlsx 一月.xlsx 二月.xlsx --add-source
# C. 美化:套用中文报表格式并输出
python scripts/format_report.py 汇总.xlsx -o 报表.xlsx --title "2026年10月工资表" --money-cols 应发工资,实发工资 --print
工作流程
- 诊断:运行
scripts/inspect_workbook.py,获取表头所在行号、合并单元格清单,以及每一列的类型问题(文本型数字、首尾空格、全角字符、文本型日期、标识列被存成数字、完全重复行)。先看清问题清单再决定后续走哪条流程,不要直接改数据。 - 清洗:运行
scripts/clean_table.py,按列推断类型后统一口径:- 首尾空格、全角 ASCII → 半角
- 文本型数字(
"1,234.00"、"¥500")→ 数值 - 整列百分比(
"12.5%")→ 数值0.125+ 百分比格式 - 中文日期(
2026年10月10日、2026/10/10)→ 日期类型;8 位紧凑写法20261010需显式加--compact-dates - 合并单元格拆开并向下填充(横向合并的报表标题只拆不填,避免把标题复制进每一列)
- 标识列强制文本,保住前导零
- 完全重复行去重,并报告删除了几行
- 合并:运行
scripts/merge_tables.py,按归一化后的列名对齐(忽略空格、全角/半角、(元)等后缀差异),列顺序不同也能对齐;列名只在一部分文件中出现时会明确告警,缺失处以空白填充。 - 美化输出:运行
scripts/format_report.py,套用中文报表格式——表头样式、冻结表头行、自动筛选、按中文显示宽度计算列宽、金额千分位与负数标红、标识列文本格式、打印排版。 - 自检:按下方《交付前自检》逐项核对,并重新打开输出文件确认行列数没有少。
脚本说明
| 脚本 | 作用 | 关键参数 |
|---|---|---|
scripts/inspect_workbook.py |
诊断工作簿并输出问题清单与下一步建议 | --json |
scripts/clean_table.py |
按列清洗、合并单元格填充、去重 | --sheet、--no-dedupe、--no-fill-merged、--compact-dates |
scripts/merge_tables.py |
多表按中文表头模糊对齐合并 | --add-source、--all-sheets、--header-row |
scripts/format_report.py |
套用中文报表格式 | --title、--money-cols、--int-cols、--pct-cols、--print、--grid |
代码模板
from openpyxl import load_workbook
# 读取:保留公式;大文件用 read_only=True 流式读
workbook = load_workbook("输入.xlsx", data_only=False)
sheet = workbook.active
# 写入:定点写回,不要用 DataFrame 覆盖整个工作簿
sheet["B2"].number_format = "#,##0.00;[Red]-#,##0.00" # 金额
sheet["A2"].number_format = "@" # 标识列:文本,保住前导零
sheet["A2"].value = str(sheet["A2"].value)
workbook.save("输出.xlsx") # 保存为新文件,不覆盖原始输入
样式、条件格式、打印设置、大文件流式写入的完整片段见 references/openpyxl-cookbook.md。
注意事项
- 绝不覆盖原文件。 每个脚本都用
-o指定新文件,除非用户明确要求原地修改。 - 标识列必须保持文本。 身份证号、手机号、银行卡号、工号、编号、订单号、邮编一旦被 Excel 当数字处理,会丢前导零、变科学计数法(
1.10101E+17),这是不可逆的数据事故。 - 不要用 DataFrame 覆盖工作簿,会丢公式、图表和格式。分析用 pandas,写回用 openpyxl 定点写入。
- openpyxl 不计算公式。 写入公式后缓存值仍为空或陈旧;需要算好的值必须用 LibreOffice 重算后再交付。
- 日期写成日期类型 +
yyyy-mm-dd,不要把2026.10.10、20261010这类值原样当成数值留在表里。 - 8 位紧凑日期默认不转换,因为它与普通 8 位编号无法区分,需显式加
--compact-dates。 - 金额列必须仍是数值,否则
SUM结果为 0——这是最常见的"表看着没问题但合计是 0"。
交付前自检
- [ ] 重新打开输出文件核对行列数,确认没有少表、少行
- [ ] 标识列没被转成科学计数法,前导零还在
- [ ] 金额列仍是数值(不是文本),
SUM能算 - [ ] 日期列是日期类型,不是字符串
- [ ] 合并单元格已拆开填充的列,数据没有错位
- [ ] 输出路径与文件名符合用户要求
知识来源
references/chinese-spreadsheet-conventions.md—— 中文表格的坑与行业约定:标识列事故、金额与百分比口径、日期与序列号、合并单元格、不可见字符、工资表/进销存/学籍表/财务报表惯例references/openpyxl-cookbook.md—— openpyxl 常用片段:数字格式速查、样式、列宽、冻结筛选、条件格式、打印排版、大文件流式读写、公式与重算