先定位,再动手:复核 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、全省行靠缓存值 → 需修母版公式一次。
见 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 条负向边界,全部通过。
loadMidClassMap() 缺巡游出租 + 网约车两维~~ → 已补(维度 3、4),独立中口径明细四维齐全。公交!),城市级恒 0、全省行靠缓存值。order_* 全 NULL),模板《网约车订单及全省总量.xlsx》只有 2026-07 一行 → 维度 4 该 6 个月无源;需业务补数或确认不适用。fund_channel);同名不同项目未弹窗。X月客运站投资明细表 / X月物流站场投资明细)生成器未做。不再让 Java 各算一套,改为**一条链路出数**:母版公式链(全省行 = Σ17 市州、累计 = Σ各月、派生页跨页引用)+ 台账页写数 + 生成收尾重算。