先定位,再动手:复核 8 月生成件,确认三条主线是「一个统一根因 + 一处页范围漏项 + 一处口径缺口」:
公交!C5 = =C9+C13+…)、城市客运/中口径明细市州行 = 跨表引用(城市客运!C9 = =公交!C16+出租!C16+网约车!C16+'轨道、轮渡'!C9)→ 这两页根本不用单独写数据。SummaryWorkbookFiller.ensureMonthFormulas() 页范围只含 6 个台账页,漏 城市客运/中口径明细;而同比公式用的页范围是含的 → 出现"同比列有公式、当月值列空白"。改动:
- SummaryWorkbookFiller.ensureMonthFormulas():页范围改用 isMonthLedgerSheet;派生页新增"结构性常量行按月沿用"(中口径明细 武汉 城际城乡出租/网约车 恒为 0 的 4 格);加 logger;删掉已无用的 isFilledLedgerSheet()。
- ReportExportService.recalcWorkbookFormulas():新增,生成收尾逐格 evaluateFormulaCell 写回缓存值(失败兜底 fullCalcOnLoad=true)。
踩坑记录:POI 4.1 的 FormulaEvaluator.evaluate(Cell) 无副作用(只算不写),第一版白跑(日志"成功 40713 格"但文件无 <v>),必须用 evaluateFormulaCell(Cell)。
docs/问题汇总/),把根因、证据、4 步修法、投资"按项目名称更新/新增插行"现状一并记录。口径定死(写进《功能测试报告_中口径四维口径统一_2026-09-18》):1 公路班线(h2031+个体)= 2 城际城乡公交(city_bus)= 3 城际城乡巡游出租(city_taxi:总量−城市内)= 4 城际城乡网约车(WycSplitCalc 拆分);总量 = 四维之和;**全省行一律 Σ17 市州**。
改动(ReportExportService.java):
- loadMidClassMap() 补维度 3、维度 4(新增 midPeriodKey());
- fillMidCell() 去掉「出租/网约车写死 0」旁路;fillMidYoyCell()/fillMidCumYoyColumn() 同比改四维齐全;
- exportPassengerMidDetail() 由「只遍历公式格」改为「按列遍历」(扩列出的 7~12 月空格才填得上);
- 扩列月份的总行值列改由库内四维合计直接写入(模板本无此列,克隆后既无公式也无缓存值);
- 该函数重算改用逐格容错的 recalcWorkbookFormulas()——evaluateAll() 会在跨簿公式(Sheet2 的 [1]xx!A1)处整本中断,累计列就永远拿不到新缓存值。
验证:独立《生成_中口径明细》8 月全省总行 4003.5701、7 月 4028.3213(原为空),18 个地区总行 = Σ4 维、累计列 = Σ1-8 月;与汇总大表「中口径明细」页逐格一致;回归 = 汇总表 17 页 0 差异、排名件 0 差异、明细件仅 36 格(18 地区 × 2 个月总行)变化。
顺带查清两个老问题:
- 《生成_中口径排名》全省累计 29464.6108 / 同比 0.638,比中口径明细少 2063.45,差值正好是 2026 年 1-6 月维度 4(网约车)→ 排名件是 Java 现算、明细页走母版公式链,两套口径打架(第 3 步的真正收口点)。
- 母版「中口径明细」城市级「城际城乡巡游出租/网约车」行公式引错页(=公交!C13-公交!C15,应指向 出租!/网约车!),城市级恒 0、全省行靠缓存值 → 需修母版公式一次。
用户反馈「独立《生成_中口径明细》8 月没问题了,但 1~6 月反而被清空」后,追出**真正根因**:
exportPassengerMidDetail() 对扩列月份(>6 月)的总行值列是「直接写库内四维合计、写 0 就 setBlank」;keepCached() 把公式清成空格 → 表面上 7/8 月修好了,实际上把母版的定稿链路掐断了。fillMidCell() 同样「库内取值为 0 → setBlank」,于是 2026-01~06 网约车城乡(库内该 6 个月无订单、维度 4 无源)被整片清空,改动(ReportExportService.java,4 处):
exportPassengerMidDetail() 总行值列:删掉「扩列月份手写库内合计」与 keepCached 清公式两条旁路,**一律保留模板公式**,由收尾重算写回缓存值。fillMidCell():库内取值为 0(该月该维无源)时**直接 return,保留母版/定稿原值**——绝不写空、也绝不写 0。recalcWorkbookFormulas():新增 ev.setIgnoreMissingWorkbooks(true)。跨簿公式([1]出租!C13)在外部工作簿缺失时默认抛异常,blankFutureMonthColumns():报表期之后的月份列(8 月报表里的 9~12 月)**清数据格、留表头**,避免克隆公式算出「9~12 月全是 0」的假数据。重要纠正(写进测试报告,也在此留痕):早前判断「母版中口径明细城市级公式引错页(=公交!C13-公交!C15)」是**误判**——
那是控制台中文乱码造成的误读;母版/模板真实公式是正确的 =[1]出租!C13-[1]出租!C15 / =[1]网约车!C13-[1]网约车!C15,
台账页「总量−城市内」Σ17 市州 = 535.83 / 333.39,与母版定稿全省行完全一致。**母版公式不需要修,之前"待修母版"的结论作废。**
用户报障:《湖北网络预约出租汽车2025年09月分析报告.docx》放在桌面导不进去。
定位:该文件根本不是 docx —— 是 Word 2003 XML(WordML 平铺 XML) 被改名成 .docx(文件头 <?mso-application progid="Word.Document"?><w:wordDocument xmlns:w=".../word/2003/wordml">,3.1MB 纯 XML、不是 zip 包),POI 的 XWPFDocument 只能读 OPC(zip) 包 → 抛 File is not a zip file。监管平台/同事间流转的报告常是这种格式,会反复出现。
改动(DataImportService.java):
- importWycOrderReport() 入口按文件头嗅探格式分派:zip→docx;<w:wordDocument+wordml→**新增 WordML DOM 解析路径**;D0CF11E0→明确提示「.doc 请另存为 docx」;其它→「无法识别」;
- 新增 isWordPackage():zip 但无 word/document.xml(xlsx 改名)→ 中文提示,不再抛 XMLBeans 英文堆栈;
- 新增 parseXmlSafely():DOM 解析关闭外部实体/DTD(防 XXE);
- 表格匹配抽成与格式无关的 matchWycOrderTable(),docx 与 WordML 两条路径**共用同一套表头识别/17 市州取值/合计行逻辑**,不会口径分叉;
- 报表期识别抽成 periodOfParagraphs(),两种格式共用。
验证:8 条用例全部通过(见《功能测试报告_网约车订单报告WordML兼容导入_2026-09-18》)。2025-09 入库:订单合计 17,652,159;武汉 8,076,610 / 黄石 676,644 / 十堰 1,048,593 / 恩施 804,736 / 林区 1,424,与报告附件1 逐项一致;pin 从 wyc_total_monthly 同期复制。真 docx(2026-08)重导幂等无变化;.doc、xlsx 改名、非本报告 docx 三种负向均给出中文可操作提示。
数据缺口已补齐(重要):用户在 14:21~14:49 之间自行导入 2026-01~06(6 份)、2025-01、2025-10~12;2025-09 由本次修复后补入。现在 2025-01~12 + 2026-01~08 的订单与 pin 全部齐全。直接效果:中口径维度 4 的 1~6 月从「无源」变为「可算」,**中口径排名件与中口径明细件的累计口径自动归一**(两者 1-8 月累计均为 31528.0606,此前差 2063.45)。
见 docs/功能测试报告/功能测试报告_汇总表公式扩页与重算_2026-09-18.md:8 条正向 + 4 条负向/边界 + 4 项入库抽查,全部通过。
city_bus_monthly 2026-08 各市州求和逐项对齐;武汉 3856.83 / 黄石 879.12 抽查一致)。见 docs/功能测试报告/功能测试报告_中口径四维口径统一_2026-09-18.md:6 条正向 + 3 条回归 + 3 条负向边界,全部通过。
.doc/xlsx 改名/非本报告 docx 均给出中文提示。loadMidClassMap() 缺巡游出租 + 网约车两维~~ → 已补(维度 3、4),独立中口径明细四维齐全。fund_channel);同名不同项目未弹窗。X月客运站投资明细表 / X月物流站场投资明细)生成器未做。不再让 Java 各算一套,改为**一条链路出数**:母版公式链(全省行 = Σ17 市州、累计 = Σ各月、派生页跨页引用)+ 台账页写数 + 生成收尾重算。
fund_channel)"方案落地(等用户对"模块"口径的最后确认)。X月客运站投资明细表 / X月物流站场投资明细)。用户要求:把货运月报「持续在规企业」分市州 1-8 月累计运距及同比情况整理成 Excel,生成到桌面。
数据源:traffic_audit.h2032_enterprise_monthly(2025-01 ~ 2026-08,13,056 条企业级记录)。
产出:C:\Users\郑玉洁\Desktop\货运月报_持续在规企业_分市州1-8月累计运距及同比_2026-09-18.xlsx(5 页签:说明与口径 / 分市州汇总 / 分市州分月 / 企业明细 636 行 / 口径校验),生成脚本 docs\工具\持续在规企业累计运距生成.py。
| 市州 | 持续在规(家) | 1-8月累计平均运距(公里) | 同比 | 市州 | 持续在规(家) | 1-8月累计平均运距(公里) | 同比 |
|---|---|---|---|---|---|---|---|
| 武汉市 | 199 | 162.11 | +13.5% | 黄冈市 | 71 | 135.14 | +1.1% |
| 黄石市 | 20 | 117.63 | +20.2% | 咸宁市 | 17 | 113.33 | −24.1% |
| 十堰市 | 13 | 321.13 | −2.9% | 随州市 | 26 | 187.28 | −17.1% |
| 宜昌市 | 65 | 88.55 | +2.6% | 恩施州 | 4 | 130.11 | +10.3% |
| 襄阳市 | 81 | 274.50 | +8.4% | 仙桃市 | 2 | 65.61 | 不适用 |
| 鄂州市 | 6 | 38.15 | −59.0% | 潜江市 | 13 | 394.20 | +10.9% |
| 荆门市 | 40 | 281.41 | −4.7% | 天门市 | 4 | 61.02 | −54.6% |
| 孝感市 | 21 | 164.00 | −7.4% | 神农架林区 | 2 | 57.68 | −49.1% |
| 荆州市 | 52 | 324.47 | −4.7% | 全省 | 636 | 156.92 | +2.9% |
《功能测试报告_货运月报持续在规企业分市州累计运距_2026-09-18.md》:14 条用例(8 正向 / 3 边界 / 3 负向)全部通过;2026-01~07 逐月规上货运量、周转量与汇总表「 货运」页 14 项比对 0 差异。
用户反馈「1-8 月累计运距同比不对」。核查后确认:**v1 的同比基期取错了**。
=S7/SUM(V7,X7,Z7,AB7,AD7,AF7,AH7,AJ7)-1,基期是 2025 年 1-8 月全部规上企业(全省 664 家);v1 用的是「两年均持续在规的 545 家」,导致同比系统性偏小。| 指标 | v1(545 家) | v2(官方全口径) | 发布报告 |
|---|---|---|---|
| 累计货运量同比 | −7.96% | −7.63% | −7.63% |
| 累计周转量同比 | −5.30% | −3.44% | −3.44% |
| 全省 1-8 月累计平均运距 | 158.18 / 153.73 = +2.90% | 156.92 / 150.10 = +4.54% | — |
分市州汇总 改为「2026 全口径 / 2025 全口径 / 同比」三段列;新增 口径对比 页并列两种口径,标出差异超 10 个百分点的市州。