📊 投资估算对比表生成
从两个版次的投资估算 Excel 生成逐项对比表。零写死:结构自动探测,换个项目直接跑。
它能做什么
| 能力 | 说明 | |------|------| | 结构自动探测 | Sheet、表头行、序号列、名称列、金额列、一级分组全部运行时识别 | | 合并单元格还原 | 先把合并区铺满再解析,跨行合并的模块列不会丢 | | 逐级闭合校验 | 总计 vs 分组、每级分组 vs 明细、组内小计 vs 累计,逐条列出差额 | | 四轮名称匹配 | 完全匹配 → 包含关系 → 相似度(≥0.66) → 取消/新增,不做强行配对 | | 取消/新增标注 | 取消项红底、新增项绿底,按序号插入原位而非堆在末尾 | | 柱状图 | 送审 vs 修编对比图,数据源为隐藏 Sheet |
快速开始
pip install openpyxl
# 最简
python scripts/generate.py -f1 送审稿.xlsx -f2 修编稿.xlsx
# 先看探测结果对不对
python scripts/generate.py -f1 送审稿.xlsx -f2 修编稿.xlsx --inspect
默认输出:送审稿所在目录/对比分析/投资估算对比表.xlsx
参数速查
| 参数 | 说明 |
|------|------|
| -f1 / -f2 | 送审稿 / 修编稿(必需) |
| -o | 输出路径 |
| -s / --sheet1 / --sheet2 | 指定 Sheet(名称或 0 基索引) |
| -c / --config | JSON 配置,覆盖自动探测 |
| --inspect | 只打印探测结果,不生成文件 |
| --overall-depth | 总体表展开层数,默认 2 |
| --tol-abs / --tol-rel | 闭合校验容差,默认 0.02 / 0.001 |
| --no-chart | 不生成图表 |
| --json / -q | JSON 输出 / 静默 |
探测不准时怎么办
不要改源码,写配置文件覆盖:
{
"sheet": "总投资概算",
"header_row": 3,
"cols": {"seq": 0, "name": 1, "amount": 3, "unit": 4, "qty": 5, "price": 6}
}
python scripts/generate.py -f1 送审.xlsx -f2 修编.xlsx --config my.json
字段全部可选,列号 0 基。
输出
总体投资对比 总计 + 各层级分组(默认到第 2 层)
<各分项> 每个"直接含明细的分组"一张,数量/单价/金额三栏对比
说明 口径、匹配规则、颜色约定、完整闭合校验记录
图表数据(隐藏) 柱状图数据源
适用场景
- 可研阶段投资估算送审稿 / 修编稿对比
- 同一项目多轮修改稿之间的版本对比
- 多版本投资概算的变更追踪与审计
依赖
- Python 3.8+
openpyxl >= 3.1.0(唯一依赖)
故障排除
| 现象 | 原因 / 处理 |
|------|------------|
| 金额列读出来是空的 | 源表金额是公式且文件从未被 Excel 打开,缓存值缺失。用 Excel 打开另存一次 |
| 提示某分组不闭合 | 看「说明」Sheet 的差额,再核对该分组下的明细行。常见原因:空序号续行、层级写法不统一 |
| 明细被误判为取消+新增 | 改名幅度过大。相似度阈值 0.66 是保守值,调整需人工核对 |
| 报 Sheet 不存在 | 用 --sheet 指定,或先 --inspect 看可用 Sheet |
| 出现「名称疑似」 | 相似度兜底匹配,必须人工复核 |
版本历史
| 版本 | 说明 |
|------|------|
| v2.0.0 | 移除硬编码行号/列号,改为结构自动探测;闭合校验重写为三级;递归匹配修复只匹配一层的问题;新增 --config/--inspect/--json;补上柱状图;依赖瘦身为 openpyxl |
| v1.2 | 优化匹配逻辑,完善 CLI |
| v1.1 | 修复费用不闭合问题 |
| v1.0 | 初始版本 |
微信扫一扫