# 功能测试报告_投资月报格式探测与字段映射表_2026-09-17
## 一、功能说明
| 项 | 内容 |
| --- | --- |
| 需求来源 | 《投资月报数据处理与多表更新需求说明(最终汇总版)》第九节确认事项 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 个投资系统项目表 |
## 二、测试环境
- 操作系统:Windows;工作目录 `D:\文档\ChatGPT\traffic-audit`
- 运行时:Python 3.14(`xlrd 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 日期序列号)优先加分 |
## 五、结论
- 格式探测与字段映射表两项交付**已完成并通过测试**(TC01–TC11 全部通过)。
- 探测结论:27 个源文件中 20 个与目标明细表列位完全一致,解析风险集中在 4 类(多市州混排、工作表名与实际月份不符、列位右移 1 列、建设阶段/形象进度未分列),已在报告第四节按高/中/低分级并给出处置建议。
- 仍未闭环(需业务确认,见映射表 Sheet6):汇总表与亿元投资项目的更新列与需求文档列出的指标对不上;恩施/黄石物流「建设阶段/形象进度」合并列口径;1 月上年基数取哪一列;客运缺 7 个市州文件的处理方式。
- 本轮未改动任何业务程序代码(符合用户「先不改程序」的要求)。
---
## 六、补充与更正(2026-09-17 下午 · 用户核对源文件后)
### 6.1 背景
用户打开源文件逐表核对后反馈「我把输入的客运站和物流园区都看了,**没有你说的情况**」。复核结论:**用户没有看错**——那些内容是被**隐藏**了(隐藏行 / 隐藏工作表),Excel 默认不显示,但程序读单元格时读得到。为此新增只读探测工具与清单,并订正本报告的措辞。
### 6.2 订正(保留原记录,只更正结论)
| # | 原文(不准确) | 更正后(准确) |
| --- | --- | --- |
| 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 行** |
### 6.3 本轮新增用例
| 编号 | 用例(输入) | 预期 | 实际 | 结论 |
| --- | --- | --- | --- | --- |
| 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 历史月表 | ✅ 通过(操作步骤见清单第二节,用户可自行复现) |
### 6.4 本轮产出
- 新增 `docs\投资\工具\隐藏项探测.py`(只读,不修改源文件)
- 新增 `docs\投资\输出\隐藏数据核实清单_2026-07.md`、`隐藏项探测_2026-07.md` / `.txt`
- 修改 `docs\投资\工具\格式探测.py`(+市州分段);`格式探测_2026-07.md` / `.tsv` 同步更新
- 修改 `docs\投资\输出\市州月报格式差异报告_2026-07.md`(订正措辞、新增 H5 风险项、新增「七、更正记录」)
### 6.5 结论
- TC01–TC15 **全部通过**;本轮发现 **1 个取数缺陷**(十堰物流未按市州分段)并已修复,修复后无回归。
- 仍未闭环:**映射表 xlsx 的同步订正待补**(文件当时被 WPS 占用,存在 `~$` 锁文件;订正脚本 `_qa_out\patch_map.py` 已备好,关闭文件后重跑即可)。
- 本轮仍**未改动任何业务程序代码**、**未改动任何源文件**。
---
## 七、补充(2026-09-17 傍晚 · `.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 重新保存的格式重写 | ✅ 通过(数据无风险) |
### 7.1 本轮产出增量
- 修改 `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 条)