立项背景与目标:
多个门店/部门每月需要把一批 Excel 报表合并成一张总表。实际工作中
存在三个痛点:
1. 各表列的顺序不一致。有的表是"门店|日期|金额",有的是
"日期|金额|门店",手工按位置合并会错位。
2. 各表列名写法不统一。同一列在不同表里写成"门店""店铺名称"
"门店名",Excel 无法识别它们是同一列。
3. 重复数据难以剔除。同一个订单可能出现在多张表里,靠肉眼排查
效率低且容易漏。
目标是做一个客户能自己操作、不需要技术背景的合并工具,把上述三件事
一次性解决,并让客户能自行确认处理结果是否正确。
核心功能模块:
模块一:列名智能匹配
对每个来源表的表头做归一化处理,再依次经过同义词库比对、修饰语识别
(区分"客户"与"客户编号"这类不同概念)、字符相似度计算,最后用
匈牙利算法求出全局最优的列对应关系。因此即使各表列顺序完全打乱、
列名写法不同,也能正确对齐到同一张表。
模块二:跨文件去重
对每一行生成指纹进行比对,支持数值等价识别(1 与 1.0 视为同一行),
避免因格式差异导致去重遗漏。
模块三:结果可追溯
自动生成《处理报告》(每个文件读取多少行、去重多少行、忽略哪些列)
和《列匹配报告》(每一列对应到哪一列、匹配方式与把握度)。
客户可以自己核对结果,而不是只能信任工具。
模块四:兼容与容错
同时支持老式 .xls 与新式 .xlsx;自动跳过空行、重复表头、Excel 临时
文件;结果输出到独立目录,不污染原始数据;读不了的文件会明确警告,
绝不静默丢数据。
业务流程:
客户操作路径:把需要合并的表格放进一个文件夹 → 双击运行工具 →
点"浏览"选择该文件夹 → 点"开始合并" → 在同级"汇总输出"目录得到
结果文件(含汇总数据、处理报告、列匹配报告三张表)。
整个过程无需安装任何环境,也不需要命令行操作。
整体架构与设计思路:
采用"读取层—匹配层—组装层—输出层"的分层设计:
· 读取层:负责扫描目录、识别文件格式、读取表头与数据。
新式 .xlsx 用 openpyxl 读取,老式 .xls 用 xlrd 读取,
并对日期等特殊单元格类型做转换,避免显示为数字。
· 匹配层:列名智能匹配引擎,是本项目技术核心。
处理流程为 列名归一化 → 同义词库比对 → 修饰语识别 →
字符 bigram 与序列相似度混合打分 → 匈牙利算法求全局最优分配。
· 组装层:按匹配结果把各行数据映射到标准列,并处理整行空白、
覆盖率过滤(只在一个文件出现的列会被忽略,避免其他文件凭空多出空列)。
· 输出层:生成汇总表并做表头样式与列宽自适应,同时生成处理报告
与列匹配报告,最后用 PyInstaller 打包为免安装 exe。
我负责的模块与结果(量化):
独立完成全部环节:需求分析、算法设计、开发、测试、打包、文档编写。
量化结果:
· 列名匹配准确率:使用 3 个来源、列名与列顺序均不一致的表验证,
16 个列的映射全部正确,准确率 100%。
· 数据处理结果:读取 9 行 → 跨文件去重剔除 2 行 → 正确输出 7 行。
· 兼容性:.xls 与 .xlsx 混合场景验证通过。
· 交付形态:打包为约 30MB 的免安装 exe,在无 Python 环境的电脑上
可直接双击运行,首次启动约 2 秒。
遇到的难点与解决方案:
难点一:不同概念的列被错误合并。
最初算法只按"包含关系"给分,导致"客户"与"客户编号"被判定为同一列
(相似度 0.86),会造成数据串列。解决方案是引入修饰语识别机制,
区分同义型修饰语(名称/姓名,应合并)与限定型修饰语(编号/类别/单位,
应判为不同列),调整后该类误配全部被正确拒绝(相似度降至 0.387),
同时"客户/客户名称"等正确匹配仍保持 0.95。
难点二:老式 .xls 文件被静默跳过,导致数据丢失。
早期版本遇到 .xls 会跳过并在界面上仍显示"处理完成",客户会误以为
合并成功,实际丢失了部分数据。解决了两个层面:一是引入 xlrd 直接
读取 .xls,实现新旧格式混合处理;二是把"未读取文件"做成醒目警告,
明确列出文件名,杜绝静默丢数据。
难点三:打包为免安装程序后的两个异常。
一是界面中文在客户电脑上显示为乱码;二是打包成窗口模式后标准输出
句柄无效,导致程序静默退出。通过显式处理输出流编码、以及对无效
句柄做兜底处理解决。
工程总结:
以上三个难点都不是业务逻辑问题,而是交付环节的问题。这段经历让我
形成一个原则:程序能在自己电脑上跑通,不等于能交付到客户电脑上——
交付前必须在干净环境中完整验证一遍。