Excel Data Merger - Excel 数据汇总工具
概述
从多个上报的 Excel 文件中提取数据,按列名智能匹配后填充到模板 Excel 中。解决不同上报单位格式略有差异(列顺序不同、列名略有差异、多余列)的汇总难题。
适用场景
- 多个部门/单位上报作业任务清单,需要汇总到一个总表中
- 源文件格式大部分相同但存在细微差异(列顺序不同、列名写法不同、有多余列)
- 模板有固定结构(表头位置、数据起始行),需要将源数据追加到模板中
- 需要定期/频繁执行此操作
核心能力
- 自动表头识别:智能识别模板和源文件的表头行位置(支持表头前有说明行、子表头行)
- 列名智能匹配:去除括号说明、标点差异后模糊匹配(如"变电站线路设备" ↔ "变电站/线路/设备")
- 自动跳过多余列:源文件中模板没有的列自动跳过
- 去重:基于关键列(如工单单号)自动跳过重复数据——工单号优先作主键(工单号唯一,同一张工作票下可有多个工单/多条作业记录),工单号缺失时退化为工作票号
- 值映射:可配置值转换(如"低" → "低风险")
- 保留模板格式:字体、边框、合并单元格等格式完整保留
- 自动编号:可选的序号自动编号
使用方法
前置条件
安装 openpyxl 库(使用 WorkBuddy 管理环境的 Python,路径见当前环境的 binary_context,如 C:\Users\<用户名>\.workbuddy\binaries\python\versions\3.13.12\python.exe):
# Windows 示例(请替换 <用户名> 为本机实际用户名,或直接用环境提供的 Python 路径)
C:\Users\<用户名>\.workbuddy\binaries\python\versions\3.13.12\python.exe -m pip install openpyxl
基本用法
python scripts/excel_merge.py \
--template <模板文件.xlsx> \
--sources <源文件1.xlsx> [源文件2.xlsx ...] \
--output <输出文件.xlsx> \
--config <配置文件.json>
参数说明
| 参数 | 必填 | 说明 |
|---|---|---|
--template |
是 | 模板 Excel 文件路径 |
--sources |
是 | 源 Excel 文件路径(可多个,空格分隔) |
--output |
否 | 输出文件路径(默认:模板名_汇总.xlsx) |
--config |
否 | 配置文件路径(JSON 格式) |
配置文件格式
配置文件为 JSON 格式,可配置以下选项(均为可选):
{
"clear_template_data": true,
"dedup_keys": ["工单单号", "工作票号"],
"value_mappings": {
"风险等级": {
"低": "低风险",
"中": "中风险",
"高": "高风险"
}
},
"row_filters": [
{
"name_contains": "变电所",
"columns": ["明日工作计划"],
"keywords": ["/", "工作间断", "间断", "暂停"]
}
],
"placeholder_cleanup": [
{
"columns": ["工作票号"],
"exact_keywords": ["/", "-", "—", "无", "暂无", "待定", "null", "none", "na", "n/a"],
"contains_keywords": ["无", "待定", "未定", "空白"]
}
],
"skip_sheets": ["参考表1", "参考表2"],
"auto_sequence": "序号",
"match_threshold": 0.6
}
| 配置项 | 说明 | 默认值 |
|---|---|---|
clear_template_data |
清除模板中已有的数据行,只保留当天上报的数据(模板仅作格式模板) | true |
dedup_keys |
去重关键列名列表,按优先级从高到低排列,取第一个有效值作为该行的主去重键 | ["工单单号", "工作票号"] |
value_mappings |
值映射,按列名配置 | {} |
row_filters |
行过滤规则列表(见下方说明) | [] |
placeholder_cleanup |
占位符清理规则列表(见下方说明) | [] |
skip_sheets |
跳过的工作表名列表 | [] |
auto_sequence |
自动编号的列名 | null |
match_threshold |
模糊匹配阈值(0-1) | 0.6 |
行过滤规则(row_filters)
用于剔除某些来源文件中内容无效的数据行,例如变电所上报文件中"明日工作计划"列为 /、工作间断、暂停 等标记的行(表示无计划或工作中断,不应计入汇总)。
规则字段:
| 字段 | 说明 |
|---|---|
name_contains |
源文件名包含的关键词(如"变电所"),不填则对所有源文件生效 |
columns |
检查的列名列表(按列名匹配源文件表头) |
keywords |
过滤关键词列表:指定列的值包含任一关键词即整行剔除 |
可以配置多条规则,分别作用于不同来源文件。
占位符清理规则(placeholder_cleanup)
用于清理指定列为占位符的值,例如工作票号为 / 时只清空该单元格(把 / 抹掉留空),整行数据保留——要求该列要么是真实票号,要么为空值,不能是 /、-、无 等符号。
规则字段:
| 字段 | 说明 |
|---|---|
name_contains |
源文件名包含的关键词(不填则对所有源文件生效) |
columns |
检查的列名列表(按列名匹配源文件表头) |
exact_keywords |
完全匹配关键词:列的值恰好等于任一关键词(如 /)即清空该单元格 |
contains_keywords |
包含匹配关键词:列的值包含任一关键词(如"无票号"含"无")即清空该单元格 |
> 注意:
> - - 只能放 exact_keywords(真实票号如 2026-08-C2-001 也含 -),不能放 contains_keywords,否则会误伤所有含 - 的真实票号。
> - 空值(空白单元格)允许保留,不会被清理。
> - 清理只作用于占位符所在的单元格,该行其余数据全部保留。
默认配置文件位于 assets/default_config.json,可直接使用或修改后使用。
工作流程
- 准备文件:将模板文件和所有源文件放在同一目录下
- 执行汇总:运行脚本,指定模板、源文件和配置
- 检查结果:打开输出文件,检查数据是否正确填充
- 如需调整:修改配置文件后重新运行
实际示例
以"作业任务清单"汇总为例:
python scripts/excel_merge.py \
--template "2026-08-12作业任务清单(南宁局).xlsx" \
--sources "2026-08-12 作业任务清单(变电所).xlsx" "2026-8-12作业任务清单(南宁局)-输电所.xlsx" \
--output "汇总结果.xlsx" \
--config assets/default_config.json
脚本会输出每个工作表的匹配和汇总统计:
[检修维护任务清单] 变电所.xlsx: 匹配 23/28 列
[检修维护任务清单] 输电所.xlsx: 匹配 23/26 列
[设备操作任务清单] 变电所.xlsx: 匹配 13/15 列
汇总完成!
新增行数: 23
跳过重复: 0
过滤行数: 7
清空占位符: 2 个单元格(整行数据保留)
[检修维护任务清单] 新增 23 行, 跳过 0 行, 过滤 7 行, 清占位 2 个单元格, 共 23 行
[设备操作任务清单] 新增 2 行, 跳过 0 行, 共 2 行
注意事项
- 每天汇总场景:模板只作格式模板,
clear_template_data: true会先清除模板中所有旧数据行,输出文件只包含当天源文件上报的数据;多个源文件之间重复的数据自动跳过(按关键列去重) - 行过滤:
row_filters规则会剔除指定列包含过滤关键词的行(如变电所"明日工作计划"列为/、工作间断、暂停),过滤整行不进汇总 - 占位符清理:
placeholder_cleanup规则会把指定列值为占位符的单元格清空(如工作票号为/、-、无时把该格抹掉留空),保证该列要么是真实值、要么为空;整行数据保留,空值单元格不处理 - 源文件和模板必须包含相同名称的工作表(Sheet),不同名称的工作表会被跳过
- 模板格式(.xlsx)会被完整保留,包括合并单元格、字体、边框等
- 新增行会复制模板中最后一行数据行的格式
- 去重基于配置的关键列,按优先级取第一个有效值作为该行的主去重键:工单号唯一,优先使用(同一工作票下多个工单是不同作业记录,必须都保留);工单号缺失/为占位符时,退化为工作票号兜底
- 占位符(如
/、-、无)不参与匹配;如果某行所有关键列都为空或为占位符,则不去重(直接添加) - 仅支持 .xlsx 格式文件(不支持 .xls)
故障排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 匹配列数为 0 | 表头行识别错误 | 检查源文件表头是否在前 2 行内 |
| 数据未填充 | 工作表名称不匹配 | 确保源文件和模板的工作表名称一致 |
| 重复数据被添加 | 源文件票号为 / 等占位符,与模板正式票号对不上 |
已修复:工单号优先作主键去重,票号兜底 |
| 正常数据被误删 | 工作票号重复但工单号不同(同一张票多条作业记录) | 已修复:工单号优先,票号仅在工单号缺失时参与判重 |
| 值未转换 | 列名不匹配 | 检查 value_mappings 中的列名是否与模板一致 |
工作票号列为 / 等符号 |
未配置清理规则 | 在 placeholder_cleanup 中配置 columns: ["工作票号"],命中后该格被清空、整行保留 |
| 真实票号被误删 | 清理规则误配了 - 等符号到 contains_keywords |
- 只能放 exact_keywords,不能包含匹配 |
资源文件
| 文件 | 说明 |
|---|---|
scripts/excel_merge.py |
核心汇总脚本 |
assets/default_config.json |
默认配置文件(含风险等级值映射) |