乐于分享
好东西不私藏

两版 Excel 到底改了哪里?我做了一个差异对比器

两版 Excel 到底改了哪里?我做了一个差异对比器
Vibe Coding 100 天挑战 · Day 19

两版 Excel 到底改了哪里?我做了一个差异对比器

很多表格不是一次写完的。

预算表会改,名单会改,报价单会改,项目排期也会改。最麻烦的是,别人常常只发你一句:“这是最新版,你看下。”

问题来了:最新版到底新在哪里?

如果只有十几行,还能靠肉眼扫;如果是几百行、多个工作表、几轮来回修改,靠人工找差异就很容易漏。漏掉一个金额、一个状态、一个日期,后面可能就是一串沟通成本。

今天做的工具叫 excel-diff。它只做一件事:对比两版 .xlsx 文件,生成一份带高亮的差异报告。

这次 MVP 解决什么问题?

excel-diff 面向的是很常见的办公场景:

  • 同事发来一版更新后的名单,想知道新增了哪些人。
  • 客户改了报价单,想知道哪些金额变了。
  • 项目排期来回调整,想快速定位日期和负责人变化。
  • 多个工作表混在一个文件里,想先知道哪些 sheet 被新增或删除。

它不会试图变成一个完整的 Excel 协作平台,只是把“肉眼找不同”这件事变成一条命令。

现在支持什么?

这一版 MVP 支持:

  • 对比两个 .xlsx 文件。
  • 检测新增工作表。
  • 检测删除工作表。
  • 检测新增单元格。
  • 检测删除单元格。
  • 检测修改单元格。
  • 把空字符串和空单元格都当作空值处理。
  • 输出一份 Excel 差异报告。
  • 在报告里用不同颜色区分新增、删除、修改。
  • 可选输出 JSON,方便后续接自动化流程。
  • 支持 --data-only,用于读取公式缓存值而不是公式文本。

报告里会有两个工作表:

Sheet
作用
Summary
汇总旧文件、新文件和各类差异数量
Diff
展示每一条差异的位置、类型、旧值和新值

怎么使用?

安装依赖:

python -m pip install -r requirements.txt

对比两个表格:

python src\excel_diff.py examples\old.xlsx examples\new.xlsx -o examples\diff-report.xlsx

如果还想额外生成 JSON 明细:

python src\excel_diff.py examples\old.xlsx examples\new.xlsx -o examples\diff-report.xlsx --json examples\diff.json

如果表格里有公式,且你想对比公式缓存出来的值:

python src\excel_diff.py examples\old.xlsx examples\new.xlsx -o examples\diff-report.xlsx --data-only

运行后会看到类似输出:

旧版: examples\old.xlsx新版: examples\new.xlsx差异总数: 8新增单元格: 2删除单元格: 0修改单元格: 4新增工作表: 1删除工作表: 1报告: examples\diff-report.xlsx

打开 diff-report.xlsx,就能看到每一处变化。

差异是怎么判断的?

这一版采用最朴素、也最容易理解的对比方式:按工作表名称和单元格坐标对齐。

第一步,对比工作表名称。

如果新版里有、旧版里没有,就是新增工作表;如果旧版里有、新版里没有,就是删除工作表。

第二步,对比共同工作表里的单元格。

工具会遍历旧版和新版共同覆盖的行列范围,读取每个单元格的值,然后判断:

  • 旧值为空,新值不为空:新增单元格。
  • 旧值不为空,新值为空:删除单元格。
  • 旧值和新值都不为空但不同:修改单元格。
  • 两边都为空或值相同:忽略。

第三步,生成报告。

Summary 负责告诉你“总共变了多少”;Diff 负责告诉你“具体哪里变了”。这比直接打开两个 Excel 来回切换更稳定,也更容易发给别人复核。

为什么没有做复杂匹配?

比如“根据 ID 对齐行”“识别插入行后整体偏移”“把相似文本归并为同一条记录”,这些都很有价值。

但我这次刻意没有塞进 MVP。

原因很简单:表格差异对比的场景很多,如果一开始就做复杂智能匹配,很容易在规则上变得含糊。对于 Day 19 这个版本,我更希望它先做到三点:

  • 结果可解释。
  • 行为可预测。
  • 命令能马上跑通。

所以它现在更适合“模板结构相对稳定”的表格,例如报价单、台账、清单、排期表。

现在的局限

这一版还有明显边界:

  • 只支持 .xlsx,不支持 .xls
  • 按单元格坐标对比,不会自动识别插入行导致的整体偏移。
  • 不比较单元格样式、批注、图片、筛选器和图表。
  • 公式默认按公式文本比较,除非加上 --data-only
  • 不处理合并单元格的语义差异。

但对于最常见的“这个表到底改了哪里”,它已经够用了。

后续可以怎么升级?

后面可以继续加:

  • 指定主键列,根据 ID 对齐行。
  • 输出一份带原表结构的高亮副本。
  • 支持只对比指定工作表。
  • 增加忽略列、忽略大小写、忽略空格等规则。
  • 统计每个工作表的差异数量。
  • 生成适合邮件或飞书消息的变更摘要。

源码

Day 19 项目源码已经放在 GitHub:

GitHub - Day 19 excel-diff

这类小工具最有用的地方,不是让 Excel 变得高级,而是让人少做一点低价值的反复确认。表格可以慢慢改,但差异最好一眼看见。