| 项 | 内容 |
|---|---|
| 需求来源 | 《投资月报数据处理与多表更新需求说明(最终汇总版)》第九节确认事项 D(格式探测)、E(字段映射表先出草案,不改程序);用户 2026-09-17 答复「你先弄一份映射表出来看看,先不改程序」 |
| 本次交付 | ① docs\投资\工具\格式探测.py(可复跑的只读探测脚本)② docs\投资\输出\市州月报格式差异报告_2026-07.md ③ docs\投资\输出\字段映射表_草案_2026-07.xlsx(7 个 sheet)④ docs\投资\输出\格式探测_2026-07.md / .tsv(脚本输出) |
| 功能边界 | 只读:不修改任何源文件、目标表;不写入数据库;不改动业务程序代码 |
| 探测范围 | docs\投资\输入\客运(客运站)\7月 10 个文件、docs\投资\输入\物流(物流园区)\7月 17 个文件、docs\投资\模板 6 张目标表、docs\投资\输入\模板_查询结果(投资系统-客运+物流 2026.7).xls 1 个投资系统项目表 |
D:\文档\ChatGPT\traffic-auditxlrd 2.0.2 位于项目 _pylibs,openpyxl 3.1.5).xls(24 个)、.xlsx(5 个)、.et(1 个,WPS)| 编号 | 用例(输入) | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| TC01 | 格式探测.py --month 2026-07 全量扫描 27 个源文件 |
27 个文件全部给出:数据工作表、表头行、数据起止行、项目行数、字段列位 | 27/27 输出完整,无异常报错 | ✅ 通过 |
| TC02 | 多工作表工作簿(林区 27 张表、潜江 27 张表、襄阳 .et 7 张分月表) | 选中**本期**(2026-07)数据表 | 林区选中 2026.7(表头日期 2026.07.24)、潜江选中 潜江传化2022.3(表头日期 2026.07.22)、襄阳选中 2026年7月 |
✅ 通过 |
| TC03 | 无序号列布局(随州物流,名称在 A 列、B 列为空列) | 能识别 2 个项目行,名称列 = A | 数据 5~6、项目行 2、名称列 A | ✅ 通过 |
| TC04 | 缺序号行(十堰客运 4 行中 2 行无序号;黄石物流 8 行中 1 行无序号) | 无序号行也要算作项目行 | 十堰客运 12~15 / 4 行;黄石物流 9~18 / 8 行 | ✅ 通过 |
| TC05 | 列位右移(襄阳客运 .et 多「建设规模」列) | 识别为 建设性质=E…自开始建设累计=I、自年初累计=K | 输出 建设性质=E 总投资=H 自开始建设累计=I 本年计划投资=J 自年初累计=K 本月完成=L 建设阶段=M 形象进度=N |
✅ 通过 |
| TC06 | 数据区混排的「市州汇总行 / 分类行 / 小计行 / 合计行 / 签字栏」不得被当成项目行 | 不计入项目行 | 孝感/黄石/随州/十堰等表的市州行、一、二、三、分类行、小计、统计负责人:「投资完成率」签字行均被排除;十堰物流仅统计出 38 行(含武汉历史区块)并在报告中标记 |
✅ 通过 |
| TC07 | 空模板工作表不得被选中(随州首个表「月2」、林区/潜江的 Sheet2/Sheet3) |
选中真正含数据的工作表 | 随州选中 Sheet2;林区/潜江按表头日期选表 |
✅ 通过 |
| TC08 | 目标表与投资系统项目表的列位采集 | 6 张目标表 + 1 个系统表字段列正确 | 客运明细表 B/H/J/K/L/M、物流明细表 B/H/J/K/L/M、汇总表 D/I/W/X、十五五 B/G/H/I/J、亿元 C/F…W、经济强县 B/E/G/H/I/J、系统表 B=单位 G=自年初累计 | ✅ 通过 |
| TC09 | 生成的 字段映射表_草案_2026-07.xlsx 可正常打开 |
7 个 sheet、内容完整 | openpyxl 复读通过:1.说明与口径 / 2.源文件标准列位 / 3.逐市州列位映射 / 4.明细表到目标表映射 / 5.投资系统项目表 / 6.差异与待确认清单 / 7.输出命名与格式建议 |
✅ 通过 |
| TC10 | 报告结论与人工核对一致 | 差异清单可复现 | 对 7 个重点文件(十堰物流、潜江/林区、襄阳客运、恩施/黄石物流、随州物流、武汉南山汉口)逐个打开源文件人工复核,报告描述与源文件一致 | ✅ 通过 |
| TC11 | 重复运行幂等(脚本只读) | 源文件哈希不变 | 重新运行后源文件未变化(脚本仅 open 读取) | ✅ 通过 |
| # | 问题 | 根因 | 处置 |
|---|---|---|---|
| 1 | 部分文件字段标签全为空 | 早期探针脚本用闭包 lambda 延迟绑定工作表对象,循环结束后指向了最后一张空表 |
改为默认参数绑定 lambda r, c, _s=sh: ... |
| 2 | 大量 .xls 报 IndexError: tuple index out of range |
pick_sheet 里误写 score > best[2](best 只有 2 个元素) |
改为 best[1] |
| 3 | 首次运行全部 .xls 打开失败 |
探测脚本未把项目自带 _pylibs(xlrd)加入 sys.path |
脚本自动向上查找并注入 _pylibs |
| 4 | 随州物流、林区物流项目行数识别为 0 | 项目行判定只认「A 列是序号 + B 列有名称」,遇到「无序号列」「缺序号」即漏判 | 判定规则改为:名称列非空 + 非小计/合计/分类行 + 数值锚点存在;随州(名称在 A)、林区(A 空)均可识别 |
| 5 | 多工作表工作簿取到历史月数据 | 只按字段命中数打分,未考虑月份 | 增加「表头区年月标记」(文本日期 + Excel 日期序列号)优先加分 |
用户打开源文件逐表核对后反馈「我把输入的客运站和物流园区都看了,**没有你说的情况**」。复核结论:**用户没有看错**——那些内容是被**隐藏**了(隐藏行 / 隐藏工作表),Excel 默认不显示,但程序读单元格时读得到。为此新增只读探测工具与清单,并订正本报告的措辞。
| # | 原文(不准确) | 更正后(准确) |
|---|---|---|
| 1 | 十堰物流「同一工作表混入『武汉』历史区块」 | 十堰物流第 11—63 行是隐藏行,内容是「武汉」历史区块(2013—2016 年项目 + 小计/合计);第 64 行才是市州行「十堰」 |
| 2 | 潜江 / 林区「工作表名与实际月份不符」 | 潜江 26/27 张表、林区 26/45 张表被**隐藏**;可见表只剩 1 张(潜江)/ 19 张(林区) |
| 3 | 襄阳客运「整表右移 1 列」 | 用户口径:**不做处理**;程序按表头文字定位列,只取本次要更新的字段 |
| 4 | 恩施 / 黄石物流「建设阶段与形象进度未分列」 | 用户口径:**其实已分列,只是表头没写**;且我方**不更新「建设阶段」列** → 问题关闭 |
| 5 | 黄石物流「8 个项目行中有 1 行没有序号(金山口物流园项目)」 | 该行是**隐藏行 R10**,正确名称为「**阳新县焦山物流仓储中心**」,且**必须取**(已计入黄石市州合计) |
| 6 | TC06 实际结果「十堰物流仅统计出 38 行(含武汉历史区块)」 | 这是**缺陷不是预期**:未按市州分段,会把 31 条武汉历史项目算进十堰。已在本轮修复(见 TC13),修正后为 7 行 |
| 编号 | 用例(输入) | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| TC12 | 新增只读工具 隐藏项探测.py --month 2026-07,扫描 26 个可读源文件(襄阳客运 .et 读不了) |
逐文件输出:工作表总数/可见数/隐藏数、隐藏表名与内容、隐藏行区间与内容、隐藏列 | 26/26 文件输出完整;命中 15 个文件含隐藏项;十堰物流 R11–R63(53 行)、黄石物流 R10、荆州物流 R10、十堰客运 R5 全部正确列出 | ✅ 通过 |
| TC13 | 格式探测.py 加入**市州分段**(CITIES + city_segments())后全量复跑 |
十堰物流只取十堰段 7 个项目行;其余文件结果不变 | 十堰物流 13~76(38行) → 70~76(7行);与旧结果逐文件 diff,其余 26 个文件 零变化(无回归) |
✅ 通过 |
| TC14 | 隐藏行边界("隐藏行不能当过滤条件"):黄石物流 | 隐藏行 R10 必须被取到,项目行数 = 8 | 项目行 8(含 R10);第 5 行「黄石」市州合计 计划总投资 564,991.69 / 自开始建设累计 59,500.20 / 自年初累计 34,978.15 / 本月完成 7,088.90 与 8 行项目之和**逐项相等** | ✅ 通过 |
| TC15 | 隐藏项清单可被人工复现 | 清单里每条隐藏项,用户在 Excel 里「取消隐藏」后都能看到 | 十堰物流取消隐藏 R11–R63 → 出现 53 行武汉历史项目;潜江取消隐藏 → 出现 26 张 2018—2022 历史月表 | ✅ 通过(操作步骤见清单第二节,用户可自行复现) |
docs\投资\工具\隐藏项探测.py(只读,不修改源文件)docs\投资\输出\隐藏数据核实清单_2026-07.md、隐藏项探测_2026-07.md / .txtdocs\投资\工具\格式探测.py(+市州分段);格式探测_2026-07.md / .tsv 同步更新docs\投资\输出\市州月报格式差异报告_2026-07.md(订正措辞、新增 H5 风险项、新增「七、更正记录」)~$ 锁文件;订正脚本 _qa_out\patch_map.py 已备好,关闭文件后重跑即可)。.et 可读性 + 工作区文件核对)| 编号 | 用例(输入) | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| TC16 | .et 到底能不能只读读?(原判断:xlrd/openpyxl 都读不了,必须 Excel COM) |
结论可复现 | 实测文件头 = D0CF11E0A1B11AE1(**OLE2 复合文档 / BIFF8**,即 WPS 存成的 BIFF8),**xlrd 能正常打开**:读出 7 张分月表 2026年1月—2026年7月,尺寸 24×20 / 26×18。→ 原判断是错的,已订正 |
✅ 通过(订正) |
| TC17 | 加上 .et 后,隐藏项探测的覆盖面 |
27/27 个源文件全覆盖 | .et 结果:7 张表**全部可见**、无隐藏行/列;隐藏项探测由 26 个文件扩到 27/27 |
✅ 通过 |
| TC18 | 工作区里 4 个显示「已修改未提交」的文件,是否有数据被改动 | 逐单元格比对旧(HEAD)与新 | 4 个文件全部 0 处差异: · 2026年7月站场固投(南山、汉口站).xlsx 10×15 → 10×15,差异 0· 襄阳市…投资 (1).et 7 张表 逐张差异 0· 模板_全省预安排计划进度情况汇总.xls 272×28 → 272×28,差异 0· 模板_经济强县投资统计报表.xls 45×17 → 45×17,差异 0字节差异仅来自 Excel/WPS 重新保存的格式重写 |
✅ 通过(数据无风险) |
docs\投资\工具\格式探测.py(订正 .et 摘读说明)、docs\投资\工具\隐藏项探测.py(.et 走 xlrd)docs\投资\输出\市州月报格式差异报告_2026-07.md(襄阳 .et 订正 + 更正记录第 7 条)docs\投资\输出\隐藏数据核实清单_2026-07.md(覆盖 27/27、3.4 节改写)docs\投资\输出\字段映射表_草案_2026-07.xlsx(Sheet1 A17、Sheet3 O13/P13、Sheet6 D6/E6)docs\投资\输出\待确认清单_2026-09-17.md(勾选版,13 条)