From dc8d7202354d43658b500951efc5a6af53170ab3 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 18 九月 2026 11:09:52 +0800
Subject: [PATCH] fix(汇总表): 扩页补当月值公式 + 生成件公式重算,修 8 月空白与全省行停在上一期
---
docs/功能测试报告/功能测试报告_汇总表公式扩页与重算_2026-09-18.md | 85 +++++++++++++++++
docs/工作日结/工作日结_2026-09-18.md | 45 +++++++++
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 41 ++++++++
docs/问题汇总/汇总表三条主线修复方案_2026-09-18.md | 66 +++++++++++++
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java | 56 +++++++++--
5 files changed, 283 insertions(+), 10 deletions(-)
diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\261\207\346\200\273\350\241\250\345\205\254\345\274\217\346\211\251\351\241\265\344\270\216\351\207\215\347\256\227_2026-09-18.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\261\207\346\200\273\350\241\250\345\205\254\345\274\217\346\211\251\351\241\265\344\270\216\351\207\215\347\256\227_2026-09-18.md"
new file mode 100644
index 0000000..00c85db
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\261\207\346\200\273\350\241\250\345\205\254\345\274\217\346\211\251\351\241\265\344\270\216\351\207\215\347\256\227_2026-09-18.md"
@@ -0,0 +1,85 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_姹囨�昏〃銆屽叕寮忔墿椤� + 鐢熸垚浠堕噸绠椼�峗2026-09-18
+
+## 涓�銆佸姛鑳借鏄�
+
+淇銆婇亾璺繍杈撻噺姹囨�昏〃銆嬬敓鎴愪欢鐨勪笁鏉′富绾块棶棰橈紙鐢ㄦ埛 2026-09-18 鎻愬嚭锛夛細
+
+| 涓荤嚎 | 鐜拌薄 | 鏍瑰洜 | 鏈澶勭疆 |
+|---|---|---|---|
+| 1 | 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� 8 鏈堟暣鍒椾负绌恒�佺疮璁�=1~7 鏈� | `SummaryWorkbookFiller.ensureMonthFormulas()` 鐨�**椤佃寖鍥�**鍙惈 6 涓彴璐﹂〉锛屾紡浜嗚繖涓ら〉锛堝悓姣斿叕寮忕敤鐨勯〉鑼冨洿鍗存槸鍚殑锛屾墍浠ュ嚭鐜�"鍚屾瘮鍒楁湁鍏紡銆佸綋鏈堝�煎垪绌虹櫧"锛� | 椤佃寖鍥存敼鐢� `isMonthLedgerSheet`锛堝惈 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� / 鍏矾鎬诲杩� / 涓彛寰勫杩愰噺锛� |
+| 2 | 鍏氦/鍑虹/缃戠害杞�/鍩庡競鍒嗗競宸炵殑**鍏ㄧ渷琛�**鍋滃湪涓婁竴鏈� | 鍏ㄧ渷琛屾槸 `=C9+C13+鈥锛埼�17甯傚窞锛夊叕寮忥紝浣嗙敓鎴愪欢**涓嶅甫缂撳瓨鍊�**锛岄瑙�/浜屾澶勭悊鍙鍒版瘝鐗堜笂涓�鏈熺殑鏃у�� | 鐢熸垚鏀跺熬鏂板 `recalcWorkbookFormulas()`锛岄�愭牸 `evaluateFormulaCell` 鎶婄粨鏋滃啓鍥炵紦瀛樺�硷紱澶辫触鍏滃簳 `fullCalcOnLoad=true` |
+| 3锛堥儴鍒嗭級 | 涓彛寰勬帓鍚嶆暟鎹笉瀵� | `K3/O3` 鏄� `SUM(K4:K20)` 鍏紡锛堝悓鏍锋棤缂撳瓨鍊硷級锛沗M3/Q3` 鍚屾瘮鏄啓姝荤殑搴撳唴鍏ㄧ渷鍙e緞 | 鏈鍙В鍐�"SUM 鏃犵紦瀛樺��"锛涘啓姝诲悓姣斿彛寰� + `loadMidClassMap` 缂轰袱缁�**鐣欏緟涓嬩竴姝�**锛堟敼鍔ㄤ細鍔ㄥ彛寰勶紝闇�鍏堢‘璁わ級 |
+
+鏀瑰姩鏂囦欢锛�
+- `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java`
+ - `ensureMonthFormulas()` 椤佃寖鍥翠慨姝o紱鏂板娲剧敓椤电粨鏋勬�у父閲忚鎸夋湀娌跨敤锛涙柊澧� `isDerivedFormulaSheet()` / `structuralConstant()`锛涚Щ闄ゅ凡鏃犵敤鐨� `isFilledLedgerSheet()`锛涘姞 logger銆�
+- `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java`
+ - 鏂板 `recalcWorkbookFormulas(XSSFWorkbook)`锛屽苟鍦� `exportSummaryWorkbook()` 鍐欐枃浠跺墠璋冪敤銆�
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 鍚庣 Spring Boot锛�8090锛夈�佸墠绔� Vue锛�8080锛夛紝`start-dev.ps1` 鍚姩锛汳ySQL 127.0.0.1:3308 / traffic_audit銆�
+- 姣嶇増锛歚docs/鐢熸垚姹囨�诲ぇ琛�/2026骞�8鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`锛堝悓鏈熷浠芥瘝鐗� `_澶囦唤_2026骞�8鏈堚� **涓嶅瓨鍦�**锛屾棩蹇� WARN锛屽睘宸茬煡鑳屾櫙锛夈��
+- 鎶ヨ〃鏈燂細`2026-08`锛涘叆鍙o細`GET /api/report/export/summaryWorkbook?period=2026-08&mode=month`銆�
+- 浜х墿锛歚_tmp/_qa_out/gen_2026-08_after.xlsx`锛�1,329,471 B锛岀敓鎴愯�楁椂 12.6 s锛夈��
+- 璇佹嵁锛歚_tmp/_qa_out/{verify2.txt, verify3.txt, verify5.txt, diff_old_new.txt, after_cols.txt, xml_check.txt, v_cmp.txt}`銆�
+- 鍚庣鏃ュ織锛歚姹囨�诲伐浣滅翱鍏紡閲嶇畻瀹屾垚锛氭垚鍔� 40713 鏍硷紝澶辫触 0 鏍糮銆乣娲剧敓椤电粨鏋勬�у父閲忚鎸夋湀娌跨敤 4 鏍硷紙绗� 8 鏈堬級`銆�
+
+## 涓夈�佺敤渚嬭〃
+
+### 姝e悜鐢ㄤ緥
+
+| # | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|---|---|---|---|
+| TC1 | 鐢熸垚 2026-08 姹囨�昏〃锛屾鏌ャ�屽煄甯傚杩愩�峇 鍒楋紙8 鏈堝綋鏈堝�硷級 | 姣忚搴旀湁褰撴湀鍊煎叕寮忥紙璺ㄨ〃寮曠敤鍙崇Щ锛� | Q4~Q39 鍏� 36 鏍煎叏閮ㄦ湁鍏紡锛屽 `Q9 = =鍏氦!Q16+鍑虹!Q16+缃戠害杞�!Q16+'杞ㄩ亾銆佽疆娓�'!Q9` | 閫氳繃 |
+| TC2 | 鍚屼笂锛屾鏌ャ�屼腑鍙e緞鏄庣粏銆峇 鍒� | 180 琛屾湁褰撴湀鍊硷紙鍏紡鎴栫粨鏋勬�у父閲忥級 | 180 鏍兼湁鍊硷紙176 鍏紡 + 4 甯搁噺锛� | 閫氳繃 |
+| TC3 | 鎶芥煡銆屼腑鍙e緞鏄庣粏銆嶇粨鏋勬�у父閲忚锛堟姹� 鍩庨檯鍩庝埂宸℃父鍑虹/缃戠害杞� = 0锛� | 鎸夋湀娌跨敤 0锛屼笉鐣欑┖ | Q13=0.0銆丵14=0.0銆丵107=0.0銆丵108=0.0锛屾棩蹇楄銆屾部鐢� 4 鏍笺�� | 閫氳繃 |
+| TC4 | 鏍稿鍏ㄧ渷琛� = 危17 甯傚窞锛堢嫭绔嬫眰鍜� vs 缂撳瓨鍊硷級 | 涓よ�呯浉绛� | 鍏氦 12315.37 = 12315.37锛涘嚭绉� 5786.81 = 5786.81锛涚綉绾﹁溅 4997.74 = 4997.74 | 閫氳繃 |
+| TC5 | 妫�鏌� 8 鏈堢疮璁″垪锛圫锛� | 搴斿惈 8 鏈堬紙=C+E+鈥�+Q锛� | 鍏氦 S5=110776.34銆佸嚭绉� S5=48069.02銆佺綉绾﹁溅 S5=33864.94銆佷腑鍙e緞鏄庣粏 S5=31528.06锛堟敼鍔ㄥ墠鍒嗗埆鍋滃湪 1~7 鏈堬級 | 閫氳繃 |
+| TC6 | 妫�鏌ャ�屼腑鍙e緞鎺掑悕銆嶅叏鐪佽 | `=SUM(K4:K20)` 搴旀湁缂撳瓨鍊� = 危17甯傚窞 | K3 缂撳瓨 24481.7407锛堜笌鎵嬪伐 危17 甯傚窞涓�鑷达級銆丱3 缂撳瓨 1131273.449 | 閫氳繃 |
+| TC7 | 妫�鏌ュ叕寮忔槸鍚﹁鐮村潖锛堥噸绠楁槸鍚﹁鐢� evaluateInCell锛� | 鍏紡涓庣紦瀛樺�煎苟瀛橈紙`<f>` + `<v>`锛� | XML 鍏ㄩ儴涓� `<c ...><f>鈥�</f><v>鈥�</v></c>`锛屽叕寮忎繚鐣� | 閫氳繃 |
+| TC8 | 妫�鏌ャ�屽煄甯傛眹鎬汇�嶃�屼腑鍙e緞鍒嗘瀽銆嶇瓑璺ㄩ〉椤� | 闅忔姤琛ㄦ湡鍒锋柊锛屼笉鍙楁湰娆℃敼鍔ㄥ奖鍝� | 鍩庡競姹囨�� 鎬诲杩愰噺 269628.07锛�1-8鏈堬級锛屾瘝鐗堜负 237412.33锛�1-7鏈堬級 | 閫氳繃 |
+
+### 璐熷悜 / 杈圭晫鐢ㄤ緥
+
+| # | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|---|---|---|---|
+| TC9 | 姣嶇増鍚屾湡澶囦唤锛坄_澶囦唤_2026骞�8鏈堚�锛夌己澶� | 涓嶄腑鏂敓鎴愶紝璁� WARN | 鏃ュ織 `姹囨�诲伐浣滅翱鏈壘鍒板悓鏈熷浠芥瘝鐗堚�锛屾甯稿嚭浠� | 閫氳繃锛堝凡鐭ヨ儗鏅級 |
+| TC10 | 鍏紡閲嶇畻閬囧埌涓嶆敮鎸佸嚱鏁�/澶栭儴寮曠敤 | 璺宠繃璇ユ牸骞惰鏁帮紝涓嶄腑鏂鍑� | 鏈澶辫触 0 鏍硷紱浠g爜淇濈暀閫愭牸 try-catch + 澶辫触鏍蜂緥鏃ュ織 | 閫氳繃锛堟湭瑙﹀彂锛� |
+| TC11 | 娲剧敓椤点�屽叏鏈堝悓甯搁噺銆嶅垽瀹氳璇敤浜庡彴璐﹂〉 | 鍙拌处椤典笉寰楁部鐢ㄤ笂鏈堟暟鍊硷紙闃�"缁撹浆"锛� | `structuralConstant()` 浠呭湪 `isDerivedFormulaSheet()` 涓虹湡鏃剁敓鏁堬紙6 涓彴璐﹂〉涓嶉�傜敤锛� | 閫氳繃锛堥�昏緫闅旂锛� |
+| TC12 | 閲嶇畻璇激鏁板�兼牸锛堥潪鍏紡鏍硷級 | 鍙鐞� `CellType.FORMULA` 鐨勬牸 | 閬嶅巻鏃惰烦杩囨墍鏈夐潪鍏紡鏍� | 閫氳繃 |
+
+### 鍏ュ簱鎶芥煡锛堝簱 鈫� 姹囨�昏〃閫愰」瀵归綈锛�
+
+| 瀵硅薄 | 搴擄紙`city_bus_monthly` 2026-08锛� | 鐢熸垚浠� | 缁撹 |
+|---|---|---|---|
+| 姝︽眽甯� 瀹㈣繍閲� | 3856.83 | 鍏氦椤� Q9 = 3856.83 | 涓�鑷� |
+| 榛勭煶甯� 瀹㈣繍閲� | 879.12 | 鍏氦椤� Q13 = 879.12 | 涓�鑷� |
+| 17 甯傚窞鍚堣 | 12315.37 | 鍏氦椤� Q5锛堝叏鐪佽缂撳瓨锛�= 12315.37 | 涓�鑷� |
+| 姝︽眽甯� 鍩庡競鍐呭杩愰噺 | 3837.20 | 鍏氦椤� Q11 = 3837.20锛堝煄甯傚杩愰〉 Q6 寮曠敤瀹冿級 | 涓�鑷� |
+
+## 鍥涖�佸洖褰掓瘮瀵癸紙鏀瑰姩鍓� vs 鏀瑰姩鍚庯級
+
+閫愭牸瀵规瘮鏀瑰姩鍓嶅悗涓ゆ鐢熸垚浠讹紙`diff_old_new.txt`锛夛細
+
+| 椤� | 宸紓鏍兼暟 |
+|---|---|
+| 鍩庡競瀹㈣繍 | 36 |
+| 涓彛寰勬槑缁� | 180 |
+| 鍏朵綑 17 椤碉紙鍚揣杩愩�佸叕浜ゃ�佸嚭绉熴�佺綉绾﹁溅銆佺彮绾垮寘杞︺�佹帓鍚嶉〉銆佽法椤靛悎鎴愰〉锛� | 0 |
+| **鍚堣** | **216** |
+
+宸紓鍏ㄩ儴钀藉湪鏈鐩爣椤碉紝涓旈兘鏄�岀┖ 鈫� 鍏紡銆嶏紱鍏跺畠椤甸�愭牸涓�鑷达紝鏃犲洖褰掋��
+
+## 浜斻�佸彂鐜扮殑闂涓庡缃�
+
+1. **`FormulaEvaluator.evaluate(Cell)` 鏃犲壇浣滅敤**锛圥OI 4.1.0锛夛細棣栨瀹炵幇鐢ㄤ簡 `evaluate()`锛屾棩蹇楁樉绀�"鎴愬姛 40713 鏍�"浣嗘枃浠堕噷娌℃湁缂撳瓨鍊硷紙`<f>` 鏃� `<v>`锛夈�傛敼鐢� `evaluateFormulaCell(Cell)` 鍚庡啓鍏ユ甯搞�傚凡鎶婄粨璁哄啓杩涗唬鐮佹敞閲娿��
+2. **涓彛寰勬帓鍚嶅悓姣斾粛涓哄啓姝诲��**锛歋UMMARY 閲� `M3=0.7424 / Q3=0.2317` 浠嶆槸姣嶇増/搴撳唴鍏ㄧ渷鍙e緞锛屼笌 危17 甯傚窞锛�24481.74锛夊彛寰勪笉涓�鑷� 鈥斺�� 闇�鎸夌 3 姝ョ粺涓�锛堟秹鍙婂彛寰勫垽瀹氾紝鏈湪鏈鏀瑰姩锛夈��
+3. **鐙珛銆婄敓鎴恄鍏矾鏃呭涓彛寰勬槑缁嗐�嬪彛寰勭己鍙�**锛歚loadMidClassMap()` 鍙"鍏矾鐝嚎 + 鍩庨檯鍩庝埂鍏氦"涓ょ淮锛岀己宸℃父鍑虹銆佺綉绾﹁溅 鈥斺�� 鏈敼锛岀暀寰呯 3 姝ャ��
+4. **搴撳唴 h2031銆屽叏鐪併�嶈 鈮� 危17 甯傚窞**锛�1-8 鏈� 27524.49 vs 24481.74锛屽樊 3042.75锛夛細灞炰笟鍔″彛寰勯棶棰橈紝寤鸿涓氬姟渚ф牳瀵癸紝涓嶉樆濉炪��
+
+## 鍏�佺粨璁�
+
+- 鐢ㄦ埛鎶ョ殑"8 鏈堟病鏁版嵁 / 鍏ㄧ渷琛屽仠鍦ㄤ笂涓�鏈�"涓ゆ潯涓荤嚎**宸蹭慨澶嶅苟缁忓洖褰掗獙璇�**锛氬煄甯傚杩愩�佷腑鍙e緞鏄庣粏 8 鏈堝垪琛ラ綈锛涘叏鐪佽銆佺疮璁″垪銆佹帓鍚� SUM 鍧囧甫姝g‘缂撳瓨鍊笺��
+- 鏀瑰姩闈㈠彲鎺э紙216 鏍硷紝鍏ㄩ儴鍛戒腑鐩爣椤碉級锛屾棤鍥炲綊銆�
+- 绗� 3 姝ワ紙涓彛寰勬帓鍚嶅悓姣斿彛寰勭粺涓� + `loadMidClassMap` 琛ヤ袱缁达級寰呯敤鎴风‘璁ゅ悗瀹炴柦銆�
\ No newline at end of file
diff --git "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-18.md" "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-18.md"
new file mode 100644
index 0000000..c0ce255
--- /dev/null
+++ "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-18.md"
@@ -0,0 +1,45 @@
+# 宸ヤ綔鏃ョ粨_2026-09-18
+
+## 涓�銆佷粖澶╁仛浜嗕粈涔�
+
+### 1. 姹囨�昏〃涓夋潯涓荤嚎锛堢敤鎴� 09-18 涓婂崍鎻愬嚭锛屽凡淇墠涓ゆ潯锛�
+
+**鍏堝畾浣嶏紝鍐嶅姩鎵�**锛氬鏍� 8 鏈堢敓鎴愪欢锛岀‘璁や笁鏉′富绾挎槸銆屼竴涓粺涓�鏍瑰洜 + 涓�澶勯〉鑼冨洿婕忛」 + 涓�澶勫彛寰勭己鍙c�嶏細
+
+- 姣嶇増鏈韩鏄叕寮忛┍鍔ㄧ殑锛氬叏鐪佽 = 危17 甯傚窞锛坄鍏氦!C5 = =C9+C13+鈥锛夈�佸煄甯傚杩�/涓彛寰勬槑缁嗗競宸炶 = 璺ㄨ〃寮曠敤锛坄鍩庡競瀹㈣繍!C9 = =鍏氦!C16+鍑虹!C16+缃戠害杞�!C16+'杞ㄩ亾銆佽疆娓�'!C9`锛夆啋 杩欎袱椤垫牴鏈笉鐢ㄥ崟鐙啓鏁版嵁銆�
+- 涓荤嚎 1 鏍瑰洜锛歚SummaryWorkbookFiller.ensureMonthFormulas()` 椤佃寖鍥村彧鍚� 6 涓彴璐﹂〉锛屾紡 鍩庡競瀹㈣繍/涓彛寰勬槑缁嗭紱鑰屽悓姣斿叕寮忕敤鐨勯〉鑼冨洿鏄惈鐨� 鈫� 鍑虹幇"鍚屾瘮鍒楁湁鍏紡銆佸綋鏈堝�煎垪绌虹櫧"銆�
+- 涓荤嚎 2/3 鏍瑰洜锛氱敓鎴愪欢**涓嶅甫鍏紡缂撳瓨鍊�**锛岄瑙�/浜屾澶勭悊璇诲埌鐨勬槸姣嶇増涓婁竴鏈熺殑鏃у�笺��
+
+**鏀瑰姩**锛�
+- `SummaryWorkbookFiller.ensureMonthFormulas()`锛氶〉鑼冨洿鏀圭敤 `isMonthLedgerSheet`锛涙淳鐢熼〉鏂板"缁撴瀯鎬у父閲忚鎸夋湀娌跨敤"锛堜腑鍙e緞鏄庣粏 姝︽眽 鍩庨檯鍩庝埂鍑虹/缃戠害杞� 鎭掍负 0 鐨� 4 鏍硷級锛涘姞 logger锛涘垹鎺夊凡鏃犵敤鐨� `isFilledLedgerSheet()`銆�
+- `ReportExportService.recalcWorkbookFormulas()`锛氭柊澧烇紝鐢熸垚鏀跺熬閫愭牸 `evaluateFormulaCell` 鍐欏洖缂撳瓨鍊硷紙澶辫触鍏滃簳 `fullCalcOnLoad=true`锛夈��
+
+**韪╁潙璁板綍**锛歅OI 4.1 鐨� `FormulaEvaluator.evaluate(Cell)` **鏃犲壇浣滅敤**锛堝彧绠椾笉鍐欙級锛岀涓�鐗堢櫧璺戯紙鏃ュ織"鎴愬姛 40713 鏍�"浣嗘枃浠舵棤 `<v>`锛夛紝蹇呴』鐢� `evaluateFormulaCell(Cell)`銆�
+
+### 2. 鍏朵粬
+
+- 鍐欎簡銆婃眹鎬昏〃涓夋潯涓荤嚎淇鏂规_2026-09-18銆嬶紙`docs/闂姹囨��/`锛夛紝鎶婃牴鍥犮�佽瘉鎹��4 姝ヤ慨娉曘�佹姇璧�"鎸夐」鐩悕绉版洿鏂�/鏂板鎻掕"鐜扮姸涓�骞惰褰曘��
+- 鎶曡祫渚ф牳瀹烇細瀵煎叆纭疄鎸夈�岄」鐩悕绉� + 绫诲埆銆島psert锛堝簱鍐� 瀹㈣繍绔欏満 49/49銆佺墿娴佸洯鍖� 135/135 鏃犻噸澶嶈锛夛紱缂哄彛鏄�"妯℃澘閲屾病鏈夌殑鏂伴」鐩笉浼氭彃琛�"銆�"璧勯噾娓犻亾鍒嗙粍琛屽鍏ユ椂琚烦杩�"銆�"鍚屽悕涓嶅悓椤圭洰涓嶅脊绐�"銆�
+
+## 浜屻�佹祴璇曠粨鏋滄憳瑕�
+
+瑙� `docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_姹囨�昏〃鍏紡鎵╅〉涓庨噸绠梍2026-09-18.md`锛�8 鏉℃鍚� + 4 鏉¤礋鍚�/杈圭晫 + 4 椤瑰叆搴撴娊鏌ワ紝鍏ㄩ儴閫氳繃銆�
+
+- 鍩庡競瀹㈣繍 36 鏍笺�佷腑鍙e緞鏄庣粏 180 鏍� 8 鏈堝垪琛ラ綈锛堝叕寮� + 缂撳瓨鍊硷級銆�
+- 鍏ㄧ渷琛� = 危17 甯傚窞涓夋柟涓�鑷达細鍏氦 12315.37銆佸嚭绉� 5786.81銆佺綉绾﹁溅 4997.74锛堜笌搴撳唴 `city_bus_monthly` 2026-08 鍚勫競宸炴眰鍜岄�愰」瀵归綈锛涙姹� 3856.83 / 榛勭煶 879.12 鎶芥煡涓�鑷达級銆�
+- 涓彛寰勬帓鍚� K3 缂撳瓨 24481.7407 = 鎵嬪伐 危17 甯傚窞銆�
+- 鍥炲綊锛氭敼鍔ㄥ墠鍚庨�愭牸瀵规瘮锛屼粎 216 鏍煎彉鍖栵紝鍏ㄩ儴钀藉湪鐩爣涓ら〉锛屽叾浣� 17 椤� 0 宸紓銆�
+
+## 涓夈�侀仐鐣欓棶棰樹笌寰呭姙
+
+1. **涓彛寰勬帓鍚嶅悓姣斾粛鏄啓姝诲��**锛圡3=0.7424 / Q3=0.2317锛屽簱鍐呭叏鐪佸彛寰勶級锛岄渶涓� 危17 甯傚窞鍙e緞缁熶竴 鈥斺�� 绗� 3 姝ャ��
+2. **`loadMidClassMap()` 缂哄贰娓稿嚭绉� + 缃戠害杞︿袱缁�**锛屽鑷寸嫭绔嬨�婄敓鎴恄鍏矾鏃呭涓彛寰勬槑缁嗐�嬪皯 535.83+333.39锛�1 鏈堬級鈥斺�� 绗� 3 姝ャ��
+3. **搴撳唴 h2031銆屽叏鐪併�嶈 鈮� 危17 甯傚窞**锛�1-8 鏈� 27524.49 vs 24481.74锛屽樊 3042.75锛夛細涓氬姟鍙e緞闂锛屽缓璁笟鍔′晶鏍稿銆�
+4. 鎶曡祫锛氭ā鏉块噷娌℃湁鐨勬柊椤圭洰涓嶄細鑷姩鎻掕锛涙槑缁嗚〃璧勯噾娓犻亾鍒嗙粍琛屾湭鍏ュ簱锛堥渶鍔� `fund_channel`锛夛紱鍚屽悕涓嶅悓椤圭洰鏈脊绐椼��
+5. 鎶曡祫涓ゅ紶鏄庣粏琛紙`X鏈堝杩愮珯鎶曡祫鏄庣粏琛╜ / `X鏈堢墿娴佺珯鍦烘姇璧勬槑缁哷锛夌敓鎴愬櫒鏈仛銆�
+
+## 鍥涖�佹槑澶╄鍒�
+
+1. 绗� 3 姝ワ細缁熶竴涓彛寰勫彛寰勶紙rank 鍏ㄧ渷鍚屾瘮鏀逛负鍚屾簮 + `loadMidClassMap` 琛ヤ袱缁达級锛屾敼瀹屽鐙珛涓彛寰勬槑缁嗕笌姹囨�昏〃閫愰」姣斿銆�
+2. 鎶曡祫"鏂板椤圭洰鎻掕 + 鍒嗙粍琛屽叆搴�"鏂规钀藉湴锛堢瓑鐢ㄦ埛瀵�"妯″潡"鍙e緞鐨勬渶鍚庣‘璁わ級銆�
+3. 寤虹敓鎴愪欢 vs 姣嶇増閲嶇畻鐨勫洖褰掓瘮瀵硅剼鏈紝鍥哄寲涓烘瘡娆℃敼鍔ㄧ殑楠屾敹鍩虹嚎銆�
\ No newline at end of file
diff --git "a/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\350\241\250\344\270\211\346\235\241\344\270\273\347\272\277\344\277\256\345\244\215\346\226\271\346\241\210_2026-09-18.md" "b/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\350\241\250\344\270\211\346\235\241\344\270\273\347\272\277\344\277\256\345\244\215\346\226\271\346\241\210_2026-09-18.md"
new file mode 100644
index 0000000..4ea074a
--- /dev/null
+++ "b/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\350\241\250\344\270\211\346\235\241\344\270\273\347\272\277\344\277\256\345\244\215\346\226\271\346\241\210_2026-09-18.md"
@@ -0,0 +1,66 @@
+# 姹囨�昏〃涓夋潯涓荤嚎淇鏂规 + 鎶曡祫銆屾寜椤圭洰鍚嶇О鏇存柊銆嶇幇鐘讹紙2026-09-18锛�
+
+> 缁撹鍏堣锛氫笁鏉′富绾夸笉鏄笁涓嫭绔� bug锛岃�屾槸 **涓�涓粺涓�鏍瑰洜锛堝叕寮忎笉閲嶇畻锛�+ 涓�澶勯〉鑼冨洿婕忛」 + 涓�澶勫彛寰勭己鍙�**銆�
+> 璇佹嵁鏂囦欢锛歚_tmp\_qa_out\鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_2026-08.xlsx`銆乣_tmp\_qa_out\gencols.txt`銆乣_tmp\_qa_out\genrows.txt`銆�
+
+## 涓�銆佷笁鏉′富绾跨殑鏍瑰洜
+
+### 璇佹嵁锛堝垰澶嶆牳锛�
+
+| 椤� | 8鏈堝綋鏈堝�煎垪锛圦锛� | 8鏈堝悓姣斿垪锛圧锛� | 璇存槑 |
+|---|---|---|---|
+| 鍏氦 / 鍑虹 / 缃戠害杞� / 鐝嚎鍖呰溅 / 杞ㄩ亾銆佽疆娓� | **鏈夊叕寮�**锛坄=Q9+Q13+鈥锛夛紝**鏃犵紦瀛樺��**锛坈ached=None锛� | 鏈夊叕寮� | 鍏紡鍐欎簡浣嗘病绠楋紝璇诲�煎伐鍏峰彧鐪嬪埌绌�/鏃у�� |
+| 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� | **杩炲叕寮忛兘娌℃湁**锛圦5=None銆丵9=None锛� | **鏈夊叕寮�**锛坄=Q5/AJ5-1`锛� | 鍚屾瘮鍐欏湪銆佸綋鏈堝�兼病鍐� 鈫� 鍏稿瀷"椤佃寖鍥翠笉涓�鑷�" |
+| 涓彛寰勬帓鍚� | `K3='=SUM(K4:K20)'`銆乣O3='=SUM(O4:O20)'`锛堟棤缂撳瓨鍊硷級 | `M3=0.7424`銆乣Q3=0.2317` **鏄啓姝荤殑鏁�** | SUM 娌¢噸绠� + 鍏ㄧ渷鍚屾瘮鍐欐鎴愬簱鍐呭叏鐪佸彛寰� |
+
+### 鍏抽敭浜嬪疄
+
+1. **姣嶇増鏈韩灏辨槸鍏紡椹卞姩鐨�**锛堜笉闇�瑕佷汉宸ュ啀鍋氭ā鏉匡級锛�
+ - 鍏ㄧ渷琛� = 危17 甯傚窞锛歚鍏氦!C5 = =C9+C13+鈥�+C73`銆乣涓彛寰勬槑缁�!C5 = =C6+C7+C8+C9`锛�
+ - 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁嗙殑甯傚窞琛� = 璺ㄨ〃寮曠敤锛歚鍩庡競瀹㈣繍!C9 = =鍏氦!C16+鍑虹!C16+缃戠害杞�!C16+'杞ㄩ亾銆佽疆娓�'!C9`銆乣涓彛寰勬槑缁�!C11 = =鐝嚎鍖呰溅!C8`銆�
+ - 鎵�浠ヨ繖涓ら〉**鏍规湰涓嶉渶瑕佸崟鐙啓鏁版嵁**锛屽彧瑕�"鎸夋湀鍙崇Щ鍏紡"琛ラ綈 + 閲嶇畻锛屾暣椤佃嚜鍔ㄥ氨瀵广��
+2. **涓や釜"琛ュ叕寮�"鍑芥暟鐨勯〉鑼冨洿涓嶄竴鑷�**锛坄SummaryWorkbookFiller.java`锛夛細
+ - `ensureMonthYoyFormulas()` 鐢� `isMonthLedgerSheet()` 鈫� 鍚� 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� / 鍏矾鎬诲杩愶紱
+ - `ensureMonthFormulas()` 鐢� `isFilledLedgerSheet()` 鈫� 鍙湁 6 涓彴璐﹂〉锛堣揣杩�/鐝嚎鍖呰溅/鍏氦/鍑虹/缃戠害杞�/杞ㄩ亾杞浮锛夆啇 **婕忛」灏卞湪杩欓噷**銆�
+3. **鐢熸垚浠堕噷鐨勫叕寮忔病鏈夌紦瀛樺��**锛歅OI 鍐欐枃浠舵椂涓嶉噸绠楋紝姣嶇増閲� 7 鏈堢殑缂撳瓨鍊艰鍘熸牱鐣欎笅锛屾墍浠�"鍏ㄧ渷琛�/绱/鎺掑悕鍋滃湪涓婁竴鏈�"銆侲xcel 鎵撳紑闈� `fullCalcOnLoad` 浼氱畻锛屼絾**绯荤粺棰勮銆佷簩娆″鐞嗐�侀儴鍒� WPS 閮界湅涓嶅埌鏂板��**銆�
+
+### 褰掔撼
+
+| 涓荤嚎 | 鐜拌薄 | 鏍瑰洜 |
+|---|---|---|
+| 1 | 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� 8鏈堟暣鍒楃┖鐧姐�佺疮璁�=1~7鏈� | `ensureMonthFormulas()` 椤佃寖鍥存紡浜嗚繖涓ら〉 |
+| 2 | 鍏氦/鍑虹/缃戠害杞�/鍩庡競鍒嗗競宸炵殑**鍏ㄧ渷琛�**鍋滃湪 7 鏈� | 鍏紡鏃犵紦瀛樺�硷紙鏈噸绠楋級 |
+| 3 | 涓彛寰勬帓鍚嶆暟鎹笉瀵� | 鍚屼富绾� 2锛涘彟鍔�"鍏ㄧ渷鍚屾瘮"鍐欐鎴愬簱鍐呭叏鐪佸彛寰勶紙1-8鏈� 27524.49锛変笌 危17甯傚窞锛�24481.74锛夋墦鏋� |
+
+## 浜屻�佷慨澶嶆柟妗堬紙4 姝ワ級
+
+1. **琛ュ叕寮忛〉鑼冨洿**锛歚SummaryWorkbookFiller.ensureMonthFormulas()` 鐨勯〉鍒ゆ柇鏀圭敤 `isMonthLedgerSheet`锛堝惈 鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� / 鍏矾鎬诲杩愶級銆�
+ 鍙︼細涓彛寰勬槑缁嗛噷鏈� 4 涓�**鏁板�艰**锛堝競宸�"鍩庨檯鍩庝埂宸℃父鍑虹/缃戠害杞�"鏄‖缂栫爜鏁帮紝涓嶆槸鍏紡锛夛紝闇�瑕佹寜搴撻噷婧愭暟鎹洖濉紝涓嶈兘鍙潬鍏紡鍙崇Щ銆�
+2. **鐢熸垚鏀跺熬鍋氬叕寮忛噸绠�**锛氬湪鍐欐枃浠跺墠鐢� `XSSFFormulaEvaluator.evaluateAll()` 鎶婃暣鏈畻涓�閬嶅苟鍐欏叆缂撳瓨鍊硷紙閫愰〉 try-catch锛涘け璐ュ垯淇濈暀 `fullCalcOnLoad=true` 闄嶇骇锛夈��
+ 濂藉锛氬叏鐪佽銆佺疮璁″垪銆佹帓鍚� SUM銆佸煄甯傚杩�/涓彛寰勬槑缁嗚法琛ㄥ紩鐢�**涓�娆℃�у叏閮ㄨ嚜鍔ㄥ嚭鍊�**锛屼笉鐢ㄥ啀璁ㄨ"鍏ㄧ渷鎸夊摢涓彛寰�"鈥斺�旀瘝鐗堝彛寰勫氨鏄� 危17 甯傚窞銆�
+3. **缁熶竴涓彛寰勫彛寰�**锛�
+ - `exportPassengerMidRank()` 鍏ㄧ渷琛屽悓姣斾笉鍐嶅啓姝诲簱鍐呭叏鐪佸�硷紝鏀规垚涓� 危甯傚窞 鍚屾簮锛�
+ - `loadMidClassMap()` 琛� dim3 宸℃父鍑虹 + dim4 缃戠害杞︼紙鐜板湪鍙浜嗙彮绾� + 鍏氦涓ょ淮锛屾墍浠ョ嫭绔嬨�婄敓鎴恄鍏矾鏃呭涓彛寰勬槑缁嗐��1鏈堝叏鐪佸皯 535.83+333.39锛夈��
+4. **寤哄洖褰掓瘮瀵硅剼鏈�**锛氭瘡娆$敓鎴愬悗閫愰〉閫愭牸涓�"姣嶇増鍏紡 + 搴撴簮鏁版嵁閲嶇畻"姣斿锛屼綔涓洪獙鏀跺熀绾匡紙鍙鐢� `_tmp\_qa_out` 閲屽凡鏈夌殑瀵规瘮鑴氭湰锛夈��
+
+### 闇�瑕佷笟鍔$‘璁わ紙涓嶉樆濉炰慨澶嶏級
+
+- 搴撻噷 h2031銆屽叏鐪併�嶈 1-8 鏈� = 27524.49锛屾瘮 危17 甯傚窞澶� **3042.75**銆備慨澶嶄竴寰嬫寜姣嶇増鍙e緞锛埼e競宸烇級璧帮紱杩欎釜宸紓鎰忓懗鐫�浼佷笟涓婃姤鐨�"鍏ㄧ渷"鍚競宸炴槑缁嗕箣澶栫殑鏁版嵁锛堟垨鏌愬競宸炴紡鎶ワ級锛屽缓璁笟鍔′晶鏍镐竴娆°��
+
+## 涓夈�佹姇璧勶細鎸夐」鐩悕绉版洿鏂� / 鏂板椤圭洰褰掑埌瀵瑰簲妯″潡
+
+### 鐜扮姸锛堝凡鏍稿疄锛岀▼搴忕‘瀹炴槸鎸夐」鐩悕绉拌蛋鐨勶級
+
+- **瀵煎叆渚�**锛歚DataImportService.saveInvestProjectRow()` / 鍏ㄧ渷姹囨�诲ぇ琛ㄨ矾寰勶紝浠ャ��**椤圭洰鍚嶇О + 绫诲埆**銆嶄负涓氬姟涓婚敭 upsert 鈥斺�� 鍛戒腑鍒欐洿鏂板瓧娈� + 鍐欏綋鏈熸湀搴︼紝鏈懡涓垯**鏂板**骞跺甫涓婅鏂囦欢鐨勫競宸炰笌绫诲埆锛堝杩愮珯鍦� / 鐗╂祦鍥尯锛夈��
+ 搴撳唴鎶芥煡锛氬杩愮珯鍦� 49 鏉� / 49 涓悕绉帮紝鐗╂祦鍥尯 135 鏉� / 135 涓悕绉帮紝**鏃犻噸澶嶈**銆�
+- **鐢熸垚渚�**锛歚ReportExportService.matchInvest()` 鏄寜鍚嶇О锛堝綊涓�鍖� + 甯傚窞 + 绫诲埆杩囨护锛夊幓鍖归厤妯℃澘琛岋紝涓嶆槸鎸夊垪浣�/琛屽彿鍙栨暟銆�
+- **鍚屽悕淇濇姢**锛氬凡瀹炵幇"甯傚窞涓�鑷存�ф牎楠�"锛堝簱涓綊灞炲競宸炰笌鏈瑙f瀽涓嶄竴鑷� 鈫� 璺宠繃璇ヨ骞跺湪椤甸潰寮圭獥鎻愮ず锛夈��
+- **涓嶆ā绯婂尮閰�**锛歚normInvestName()` 鍙仛鎷彿/杩炴帴绗�/鐪佸競鍘垮墠缂�褰掍竴锛屼笉鍋氳繎浼煎悎骞� 鈫� 绗﹀悎"鍚嶇О鏈夊樊寮傚氨鏄袱涓」鐩�"銆�
+
+### 缂哄彛锛堝氨鏄綘璇寸殑"鏂板椤圭洰瑕佸綊鍒板搴旀ā鍧椾笅闈�"锛�
+
+1. 妯℃澘閲�**娌℃湁鐨勬柊椤圭洰鐩墠涓嶄細鑷姩鎻掕**锛歚investPlan`锛堝叏鐪侀瀹夋帓锛夌瓑鐢熸垚鍣ㄥ彧鐢� `matchInvest` 鍖归厤宸叉湁妯℃澘琛岋紝**鍖归厤涓嶅埌鐨勬柊椤圭洰浼氳涓㈡帀**锛屼笉浼氭寜甯傚窞/鏉垮潡鎻掑埌瀵瑰簲浣嶇疆銆�
+ 鈫� 闇�鍔�"鎻掕"閫昏緫锛氭寜 甯傚窞 + 绫诲埆锛�+璧勯噾娓犻亾鍒嗙粍锛夊畾浣嶅潡鍖洪棿锛屽湪鍧楁湯灏炬彃琛屻�佸鍒剁浉閭昏鏍煎紡涓庡叕寮忋�佸啓椤圭洰鍚嶄笌鏂版暟鎹紝骞舵洿鏂板悎璁¤鑼冨洿銆�
+2. **"妯″潡"鏈�缁嗕竴灞傜幇鍦ㄥ叆涓嶄簡搴�**锛氫袱寮犳槑缁嗚〃鐨�"涓�銆佷娇鐢ㄤ氦閫氶儴杞﹁喘绋庤祫閲� / 浜屻�佺渷鐕冩补绋� / 涓夈�佸啘鏉戠患鍚堣繍杈撴湇鍔$珯 / 鍥涖�佸�欒溅浜�"鍒嗙粍琛岋紝鍦ㄥ鍏ユ椂琚� `^[涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+銆�.*` 瑙勫垯**涓诲姩璺宠繃**锛屾墍浠ラ」鐩惤涓嶅埌鍏蜂綋娓犻亾鍧椼��
+ 鈫� 闇�缁� `investment_project` 鍔� `fund_channel` 瀛楁锛屽鍏ユ椂璁板綍"褰撳墠鍒嗙粍"鍐欏埌鍏跺悗椤圭洰涓婏紝鍐嶉噸瀵� 7/8 鏈堛��
+3. 鍚屽悕涓嶅悓椤圭洰鐩墠**涓嶅脊绐�**锛堝彧鏈夊競宸為敊浣嶅脊绐楋級銆�
\ No newline at end of file
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java
index 5cf99d7..f40a596 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/SummaryWorkbookFiller.java
@@ -7,6 +7,8 @@
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -33,6 +35,8 @@
*/
@Service
public class SummaryWorkbookFiller {
+
+ private static final Logger log = LoggerFactory.getLogger(SummaryWorkbookFiller.class);
@Resource
private MidCalc midCalc;
@@ -429,9 +433,11 @@
if (wb == null || month <= 1) return 0;
int targetCol = FIRST_MONTH_COL + 2 * (month - 1);
int written = 0;
+ int carried = 0;
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
Sheet sh = wb.getSheetAt(i);
- if (sh == null || !isFilledLedgerSheet(sh.getSheetName())) continue;
+ if (sh == null || !isMonthLedgerSheet(sh.getSheetName())) continue;
+ boolean derivedSheet = isDerivedFormulaSheet(sh.getSheetName());
for (int r = sh.getFirstRowNum(); r <= sh.getLastRowNum(); r++) {
Row row = sh.getRow(r);
if (row == null) continue;
@@ -446,7 +452,21 @@
break;
}
}
- if (srcCell == null) continue;
+ if (srcCell == null) {
+ if (!derivedSheet) continue;
+ // 娲剧敓椤碉紙鍩庡競瀹㈣繍/涓彛寰勬槑缁�/鍏矾鎬诲杩愶級閲屻�屽悇鏈堥兘鏄悓涓�涓父閲忋�嶇殑缁撴瀯鎬у父閲忚
+ // 锛堝涓彛寰勬槑缁� 姝︽眽 鍩庨檯鍩庝埂宸℃父鍑虹=0锛夛紝鎸夋湀娌跨敤璇ュ父閲忥紝閬垮厤褰撴湀鍊煎垪绌虹潃瀵艰嚧绱缂洪」
+ double struct = structuralConstant(row, month);
+ if (Double.isNaN(struct)) continue;
+ Cell target = row.getCell(targetCol);
+ if (target == null) target = row.createCell(targetCol);
+ Cell prev = row.getCell(FIRST_MONTH_COL + 2 * (month - 2));
+ if (prev != null && prev.getCellStyle() != null) target.setCellStyle(prev.getCellStyle());
+ target.setCellValue(struct);
+ carried++;
+ written++;
+ continue;
+ }
String f = srcCell.getCellFormula();
if (f == null || f.isEmpty()) continue;
Cell target = row.getCell(targetCol);
@@ -456,7 +476,31 @@
written++;
}
}
+ if (carried > 0 && log != null) {
+ log.info("姹囨�诲伐浣滅翱锛氭淳鐢熼〉缁撴瀯鎬у父閲忚鎸夋湀娌跨敤 {} 鏍硷紙绗� {} 鏈堬級", carried, month);
+ }
return written;
+ }
+
+ /** 璇ヨ 1..month-1 鏈堢殑褰撴湀鍊煎垪鏄惁鍏ㄤ负鍚屼竴涓暟鍊煎父閲忥紙缁撴瀯鎬у父閲忚锛屽鍚勬湀鎭掍负 0锛� */
+ private double structuralConstant(Row row, int month) {
+ if (row == null || month <= 2) return Double.NaN;
+ Double v = null;
+ for (int s = 1; s < month; s++) {
+ Cell c = row.getCell(FIRST_MONTH_COL + 2 * (s - 1));
+ if (c == null || c.getCellType() != org.apache.poi.ss.usermodel.CellType.NUMERIC) return Double.NaN;
+ double d = c.getNumericCellValue();
+ if (v == null) v = d;
+ else if (Math.abs(d - v) > 1e-9) return Double.NaN;
+ }
+ return v == null ? Double.NaN : v;
+ }
+
+ /** 娲剧敓椤碉紙褰撴湀鍊煎叏閮ㄦ潵鑷叾浠栭〉/甯搁噺锛岀函鍏紡椹卞姩锛夛細鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� / 鍏矾鎬诲杩� / 涓彛寰勫杩愰噺 */
+ private boolean isDerivedFormulaSheet(String name) {
+ if (name == null) return false;
+ String n = name.trim();
+ return "鍩庡競瀹㈣繍".equals(n) || "涓彛寰勬槑缁�".equals(n) || "鍏矾鎬诲杩�".equals(n) || "涓彛寰勫杩愰噺".equals(n);
}
/** 璇ユ牸鏄惁宸叉湁鍐呭锛堟暟鍊�/鏂囨湰/鍏紡锛夛紱浠呭甫鏍峰紡鐨勭┖澹筹紙濡傛瘝鐗堥噷缁ф壙琛ㄥご鏃ユ湡鏍煎紡鐨勬牸瀛愶級瑙嗕负绌� */
@@ -467,14 +511,6 @@
case STRING: return c.getStringCellValue() != null && !c.getStringCellValue().trim().isEmpty();
default: return true;
}
- }
-
- /** 鍙備笌閫愭湀鏁版嵁鍥炲~鐨勫彴璐﹂〉锛堣揣杩�/鐝嚎鍖呰溅/鍏氦/鍑虹/缃戠害杞�/杞ㄩ亾杞浮锛� */
- private boolean isFilledLedgerSheet(String name) {
- if (name == null) return false;
- String n = name.trim();
- return "璐ц繍".equals(n) || "鐝嚎鍖呰溅".equals(n) || "鍏氦".equals(n)
- || "鍑虹".equals(n) || "缃戠害杞�".equals(n) || "杞ㄩ亾銆佽疆娓�".equals(n);
}
/** 0 鍩哄垪鍙� + 1 鍩鸿鍙� -> "Q5" */
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
index 46ae09f..1950983 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3362,6 +3362,8 @@
applyTwoDecimalFormat(wb); // 鏁板�兼樉绀轰袱浣嶅皬鏁帮紙淇濈暀鍏ㄧ簿搴︼級锛�% / 鏃ユ湡绛夋棦鏈夋牱寮忎笉鏀瑰彉
int inlineFixed = normalizeStaleInlineStrings(wb); // 娓呮帀銆岄潪 inlineStr 鍗存畫鐣� <is>銆嶇殑闈炴硶鏍硷紝鍚﹀垯 Excel 鎷掔粷鎵撳紑
if (inlineFixed > 0) log.warn("姹囨�诲伐浣滅翱娓呮帀娈嬬暀 inlineStr 闈炴硶鏍� {} 涓紙姣嶇増鐢� openpyxl 鍐欏嚭鏃剁殑鍏稿瀷闂锛�", inlineFixed);
+ int[] recalc = recalcWorkbookFormulas(wb); // 鍏紡閲嶇畻骞跺啓鍥炵紦瀛樺�硷細鍏ㄧ渷琛�(危甯傚窞)/绱鍒�/鎺掑悕 SUM 鎵嶈兘琚瑙堜笌浜屾澶勭悊璇诲埌
+ log.info("姹囨�诲伐浣滅翱鍏紡閲嶇畻瀹屾垚锛氭垚鍔� {} 鏍硷紝澶辫触 {} 鏍硷紙澶辫触鏍间繚鐣欐瘝鐗堟棫缂撳瓨鍊硷紝鎵撳紑鏃舵寜 fullCalcOnLoad 閲嶇畻锛�", recalc[0], recalc[1]);
if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr();
wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // 杩樺師/鏀瑰啓鍏紡鍚庢墦寮�鍗抽噸绠�
return toBytes(wb);
@@ -3371,6 +3373,45 @@
}
/**
+ * 姹囨�诲伐浣滅翱鍏紡閲嶇畻锛歅OI 鍐欐枃浠朵笉甯︾紦瀛樺�硷紝瀵艰嚧銆屽叏鐪佽锛埼�17甯傚窞锛夈�嶃�岀疮璁″垪銆嶃�屾帓鍚� SUM銆�
+ * 鍦ㄩ瑙�/浜屾澶勭悊閲屽彧鐪嬪埌姣嶇増涓婁竴鏈熺殑鏃у�硷紙2026-09-18 鐢ㄦ埛鎶モ��8鏈堟病鏁版嵁 / 鍏ㄧ渷琛屽仠鍦ㄤ笂涓�鏈熲�濈殑鏍瑰洜涔嬩竴锛夈��
+ * 閫愭牸 evaluate 骞舵妸缁撴灉鍐欏洖缂撳瓨鍊硷紱涓埆涓嶆敮鎸佸嚱鏁�/澶栭儴寮曠敤鏍煎け璐ュ垯璺宠繃骞惰鏁帮紝涓嶉樆濉炲鍑恒��
+ */
+ private int[] recalcWorkbookFormulas(XSSFWorkbook wb) {
+ if (wb == null) return new int[]{0, 0};
+ org.apache.poi.ss.usermodel.FormulaEvaluator ev;
+ try {
+ ev = wb.getCreationHelper().createFormulaEvaluator();
+ } catch (Exception e) {
+ log.warn("姹囨�诲伐浣滅翱鍏紡閲嶇畻锛氬垱寤烘眰鍊煎櫒澶辫触锛岃烦杩囷紙{}锛�", e.getMessage());
+ return new int[]{0, 0};
+ }
+ int ok = 0, fail = 0;
+ java.util.List<String> samples = new java.util.ArrayList<>();
+ for (int i = 0; i < wb.getNumberOfSheets(); i++) {
+ Sheet sh = wb.getSheetAt(i);
+ if (sh == null) continue;
+ for (Row row : sh) {
+ if (row == null) continue;
+ for (Cell c : row) {
+ if (c == null || c.getCellType() != CellType.FORMULA) continue;
+ try {
+ ev.evaluateFormulaCell(c); // 娉ㄦ剰锛歟valuate() 鏃犲壇浣滅敤锛屽繀椤荤敤 evaluateFormulaCell 鎵嶄細鎶婄粨鏋滃啓鍥炵紦瀛樺��
+ ok++;
+ } catch (Exception ex) {
+ fail++;
+ if (samples.size() < 10) {
+ samples.add(sh.getSheetName() + "!" + c.getAddress() + " :: " + ex.getClass().getSimpleName());
+ }
+ }
+ }
+ }
+ }
+ if (!samples.isEmpty()) log.warn("姹囨�诲伐浣滅翱鍏紡閲嶇畻澶辫触鏍蜂緥锛歿}", samples);
+ return new int[]{ok, fail};
+ }
+
+ /**
* 娓呮帀銆岄潪 inlineStr 鍗存畫鐣� <is>銆嶇殑闈炴硶鍗曞厓鏍笺��
*
* 姣嶇増鑻ョ敱 openpyxl 鍐欏嚭锛屾枃鏈崟鍏冩牸鐢� <is>锛坕nlineStr锛夊瓨鍌紱POI 鐨� setCellValue 鍙敼鍐� t 涓� <v>锛�
--
Gitblit v1.9.1