两版 Excel 行顺序不同,不能逐行相减。先找业务认可的唯一键,再比较字段。重复键没有解决之前,取第一条会制造看似完整的假对账。
准备两张完整教学表
新建 old.xlsx、new.xlsx,工作表均为 Customers。先把 A 列“编号”设为文本再输入,手机号也用文本,金额为数值。保存后让 Codex 回读类型,确认 00101 仍有五位;已经丢失的零不能靠猜测补齐。
old.xlsx:
| 编号 | 手机号 | 状态 | 金额 |
|---|---|---|---|
| 00101 | 13800000001 | 启用 | 100 |
| 00102 | 13800000002 | 启用 | 200 |
| 00103 | 13800000003 | 停用 | 300 |
| 00104 | 13800000004 | 启用 | 40 |
| 00104 | 13800000044 | 启用 | 60 |
new.xlsx:
| 编号 | 手机号 | 状态 | 金额 |
|---|---|---|---|
| 00103 | 13800000003 | 启用 | 330 |
| 00101 | 13800000009 | 启用 | 100 |
| 00105 | 13800000005 | 启用 | 150 |
| 00104 | 13800000004 | 启用 | 100 |
号码为教学占位。金额都是整数,无真实币种含义;真实项目需先约定币种、小数位、舍入规则。
重复键要两边一起隔离
00104 在旧表两次。新版即使仅一行,也不能确定对应哪条旧记录。旧表第 5/6 行、新表第 5 行应全部进 anomalies;行号包括表头。
text
只读两个工作簿 Customers,按文本“编号”核对。
先查缺失键、重复键、列名与类型。任一侧重复的键,两侧该键全部隔离,不做普通字段比较。
比较手机号、状态、金额:前两者精确文本比较,金额按整数;保留前导零。
输出 reconciliation.xlsx 的 summary、changes、anomalies,不覆盖原件。
changes 每行一处差异:编号、类型、字段、旧值、新值、旧/新文件与单元格坐标。
新增/缺失独立标类别,不把不存在一侧的金额写成真实零值。
summary 分列原始总额、隔离金额、可比范围金额和变动拆分。
先给键检查结果,再完成已明确规则;不能解释的键保留待处理。
底层程序可参考Python Excel 差异报告。使用任何脚本都不能跳过业务键口径。
应解释这五件事
| 编号 | 类别 | 字段变化 | 证据位置 |
|---|---|---|---|
| 00101 | 变更 | 手机号 13800000001→13800000009 | old!B2 → new!B3 |
| 00103 | 变更 | 状态 停用→启用 | old!C4 → new!C2 |
| 00103 | 变更 | 金额 300→330 | old!D4 → new!D2 |
| 00102 | 旧版有、新版缺失 | 保留整条旧记录 | old!A3:D3;新版无行 |
| 00105 | 新增 | 保留整条新记录 | new!A4:D4;旧版无行 |
old/new 是文件简称,工作表名均为 Customers。缺失可能只是导出范围不同,没有说明不能写“客户已销户”。
两层金额对账
| 范围 | 旧版 | 新版 |
|---|---|---|
| 全部金额 | 700 | 680 |
| 00104 隔离金额 | 100(40+60) | 100 |
| 可比规则覆盖金额 | 600 | 580 |
可比变动为 −20:共同键 00103 增加 30、新增 00105 增加 150、新版未见 00102 减少 200,30+150−200=−20。00101 手机号变化不影响金额。
原始总额碰巧也只差 −20,不意味着 00104 已解释。它仍是三行异常;把旧两行相加只能是待业务确认的候选规则。以上为教学预期,实际 Excel 引擎、公式缓存、外链及格式保留需在你的文件环境另查。
下一步
继续阅读与你当前问题相关的教程:


