| docs/功能测试报告/功能测试报告_2026-07母版补齐与导出件打不开修复_2026-09-16.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-16.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/2026年7月道路运输量汇总表.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/问题汇总/问题与注意事项汇总_2026-09-16.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_2026-07ĸ°æ²¹ÆëÓëµ¼³ö¼þ´ò²»¿ªÐÞ¸´_2026-09-16.md
New file @@ -0,0 +1,86 @@ # åè½æµè¯æ¥å â 2026-07 æ¯çè¡¥é½ & 导åºä»¶ãExcel æä¸å¼ãä¿®å¤ - æ¥æï¼2026-09-16 - èå´ï¼æ±æ»å¤§è¡¨ï¼`/api/report/export/summaryWorkbook`ï¼2026-07 / 2026-08 导åºï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` æ¯çè¡¥é½ - å ³èï¼`docs/é®é¢æ±æ»/é®é¢ä¸æ³¨æäºé¡¹æ±æ»_2026-09-16.md` 第åä¸è ## ä¸ãèæ¯ ã è´§è¿ã页ã累计ãåå£å¾å¨ 2026-09-16 å·²å¨ **8 ææ¯ç** è½å°ï¼è§ç¬¬åäºèï¼ãç¨æ·ç¡®è®¤ãå¯ä»¥è¡¥é½ãï¼è¦æ±æåä¸å£å¾è¡¥å° **7 ææ¯ç**ï¼å¹¶è§£å³ 7 æå¯¼åºä»¶æ æ³ç¨ Excel æå¼çé®é¢ã ## äºãæµè¯ç¯å¢ | 项 | å¼ | |---|---| | å端 | Spring Bootï¼8090ï¼ä¿®å¤åå·²éå¯ï¼ | | å端 | Vueï¼8080 | | æ°æ®åº | MySQL 127.0.0.1:3308 / traffic_audit | | Excel 夿® | Excel COM `Workbooks.Open`ï¼æ¯ä¾ç¬ç«å®ä¾ï¼æµå强æå¤å¿è¿ç¨ï¼ | | ç»æå¤æ® | Python `zipfile` + `xml.etree` éé¨ä»¶æ ¡éªãéæ ¼ `<c>` è§£æ | ## ä¸ãåç°çæ ¹å ï¼ä¸¤å¤ï¼åä¸ºæ¬æ¬¡ä¿®å¤å¯¹è±¡ï¼ ### 3.1 导åºä»¶æä¸å¼ï¼æ®ç `<is>` çéæ³åå æ ¼ åä»¶éåå¨ 19 个**模å¼éæ³**çæ ¼åï¼ ``` <c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c> ``` `<is>`ï¼inlineStrï¼åªå 许åºç°å¨ `t="inlineStr"` çæ ¼éï¼`t="n"` å´å¸¦ `<is>` å±äºéæ³ï¼Excel ç´æ¥å¤å®ãæ æ³è¯»åçå 容ãæç»æå¼ï¼COM 表ç°ä¸ºãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼è¿ä¿®å¤æ¨¡å¼ `CorruptLoad=1` 乿ä¸å¼ï¼ã **æå **ï¼7 ææ¯çç± **openpyxl** ååºï¼`docProps/app.xml` = `Microsoft Excel Compatible / Openpyxl 3.1.5`ï¼ææ¬ç¨ `<is>` åå¨ï¼ãå¯¼åºæ¶å«çåå ¥è·¯å¾åªæ¹ `t`/`<v>`ï¼**䏿¸ æ§ `<is>`**ï¼è 8 ææ¯çæ¯ Excel åçï¼ææ¬èµ° sharedStringsï¼ï¼æä»¥åæ ·ä»£ç ä¸ 8 æä»¶æ£å¸¸ã7 æä»¶åã **为ä»ä¹åªæ 7 æå**ï¼7 æåå¨åæå¤ä»½æ¯ç `_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx`ï¼`restoreSummaryMonthlyBlocks` 伿´æ ¼åå¡«ï¼åå¡«åå ¥ inlineStr æ¯çæ ¼æ¶ç䏿§ `<is>`ã8 ææ²¡æè¯¥ `_å¤ä»½_*` æä»¶ï¼ä¸èµ°åå¡«ï¼å æ¤ä¸è§¦åã **å®ä½æ¹æ³**ï¼å¯å¤ç¨ï¼ï¼åä»¶ä¸å¥½ä»¶é¤ worksheets/styles/sharedStrings å¤**å ¨é¨é¨ä»¶éåèç¸å** â ç¨ zip æäº¤ + Excel éä¸å¼æ¡£å leave-one-outï¼å®ä½å° **sheet9ãå ¬äº¤ã(17 æ ¼) + sheet12ã轨éã轮渡ã(2 æ ¼)**ã ### 3.2 æ¯çè¡¥é½è¢«å¤ä»½æ¯çãçæå夿´»ã 补好 7 ææ¯çå导åºï¼`è´§è¿` 页 2022/2021 累计**åå忧忻叏é** ââ å 为 `restoreSummaryMonthlyBlocks` æå¤ä»½æ¯çï¼æ¸ çåã仿¯æ§å¸¸éï¼æ´æ ¼åå¡«è¦çäºæ¯ççæ°å ¬å¼ã ## åãä¿®å¤å 容 | # | ä½ç½® | æ¹å¨ | |---|---|---| | 1 | `ReportExportService.exportSummaryWorkbook` | è½çåæ°å¢ `normalizeStaleInlineStrings(wb)`ï¼æææãé inlineStr å´æ®ç `<is>`ãçæ ¼åæ¸ æï¼å¹çï¼ï¼å¹¶æ warn æ¥å¿ | | 2 | `ReportExportService.restoreSummaryMonthlyBlocks` | æ°å¢ `skipFreightHistoryBlocks`ï¼ã è´§è¿ã页 **T åå以å**ï¼2025/2024/2023/2022/2021 年度å + å年累计/ç´¯è®¡åæ¯åï¼æ°¸ä¸ä»å¤ä»½æ¯çåå¡«ï¼é¿å âçæå夿´»âï¼ä¸æ¢æãä¸å£å¾æåãå·¦åä¿æ¤åä¸æè·¯ï¼ | | 3 | `docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` | Excel COM è¡¥é½ï¼2025/2024/2023/2022/2021 äºä¸ªå¹´åº¦åå ± **360** 个åå æ ¼ï¼`r7/r9/r8/r10 = SUM(17 å¸å·)`ã`r5=r7+r9`ã`r6=r8+r10`ï¼+ **324** ä¸ªç´¯è®¡æ ¼ï¼`DX=SUM(DK:DV)`ã`EM=SUM(EA:EL)`ã`DY=IFERROR(DX/SUM(EA:EL)-1,"")`ï¼ï¼`CalculateFullRebuild` åä¿å | > å¤ä»½ï¼`docs/çææ±æ»å¤§è¡¨/_bak_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_è¡¥é½å_20260916.xlsx`ï¼**æ æä¸ç¨ `_å¤ä»½_` åç¼**ï¼å¦åä¼è¢« `resolveSummaryDonor` 彿 donor åå¡«ï¼ã ## äºãç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | åä»¶å¤ç° | 2026-07 导åºï¼ä¿®å¤åï¼ | å¯æå¼ | Excel æ¥ãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼éè¯ 2 次ä»å¤±è´¥ | å¤ç° | | 2 | ç¯å¢æé¤ | 10KB å°ä»¶ / 8 ææ¯ç / 7 ææ¯ç / 09-08 æ§ 7 æå¯¼åº | â | å ¨é¨å¯æå¼ï¼ä» æ° 7 æå¯¼åºå¤±è´¥ | 确认éç¯å¢é®é¢ | | 3 | è·¯å¾æé¤ | åä»¶å¤å¶å°å¦ä¸ç®å½æ¹å | ä»å¤±è´¥ | ä»å¤±è´¥ | ç¡®è®¤æ¯æä»¶å 容é®é¢ | | 4 | é¨ä»¶çº§æäº¤ | åä»¶ + 好件ç styles/sharedStrings/worksheets | å®ä½åé¨ä»¶ | åä»¶ styles + åä»¶ sst + **å¥½ä»¶å ¨é¨ sheets** â å¯æå¼ | å®ä½å° worksheets | | 5 | leave-one-out | 19 个 sheet éä¸ªæ¢æåä»¶ç | æ¾åºå sheet | ä» **sheet9ãå ¬äº¤ã/ sheet12ã轨éã轮渡ã** 失败 | å®ä½å° 2 页 | | 6 | è´åï¼éæ³æ ¼è®¡æ° | ä¿®å¤å导åºä»¶ | â | 19 个 `t="n"` 带 `<is>` | å½ä¸æ ¹å | | 7 | æ£åï¼ä¿®å¤å 2026-07 | éå¯å端åå¯¼åº | 坿å¼ã19 页ã累计对 | OK sheets=19ï¼`DX5=144979.2825`ï¼`=SUM(DK5:DV5)`ï¼ã`DY5=-0.101235487797891`ã`EM5=161309.53162`ã`CU5=173045.296428512` | éè¿ | | 8 | æ£åï¼ä¿®å¤å 2026-08 | åä¸ | 坿å¼ã累计ä¸å | OK sheets=19ï¼`DZ5=144979.2825`ã`EO5=161309.53162`ã`CW5=173045.296428512`ã`S5=130311.892698249` | éè¿ | | 9 | è·¨æä¸è´æ§ | 7 æ vs 8 æåå£å¾æ ¼å | å®å ¨ç¸ç | 2022 累计 / 2021 累计 / 2023 累计 ä¸ä¸ªæåº¦ â ä¸ä¸ªå¼**å®å ¨ç¸ç** | éè¿ | | 10 | éæ³æ ¼å¤æ« | ä¿®å¤å 7 æå¯¼åº | 0 个 | 0 个 | éè¿ | | 11 | æ¯çå¯æå¼ | è¡¥é½åç¨ Excel æå¼ 7 ææ¯ç | å¯æå¼ | å¯æå¼ | éè¿ | | 12 | æ®çæ°æ®å¤æ ¸ | `2026-09` äºå¼ è¡¨è®¡æ° | å ¨ 0 | å ¨ 0ï¼h204 / investment_monthly / h2032 / audit_result / import_batchï¼ | éè¿ | ## å ãåç°çé®é¢ä¸å¤ç½® 1. **7 æå¯¼åºä»¶æä¸å¼**ï¼P0ï¼ï¼`normalizeStaleInlineStrings` æ ¹æ²»ï¼å¯¼åºä»¶ä» 941,960 åèï¼åï¼â 1,310,693 åèï¼å¥½ï¼ã 2. **å¤ä»½æ¯çå填让补é½å¤±æ**ï¼P0ï¼ï¼`skipFreightHistoryBlocks` ä¿æ¤ `è´§è¿` T åå以åã 3. **Excel COM ä¼çå¤å¿è¿ç¨**ï¼æ¯ä¾æµå®å¿ é¡»å¼ºææ¬æ¬¡æ°å»ºç `EXCEL` è¿ç¨ï¼å¦ååç» `Workbooks.Open` ä¼**é´ææ§åæ¥**åæ ·çéï¼æ¬æ¬¡ææ¥åæè¢«æ¤å¹²æ°è¿ï¼ã屿æ¥å·¥å ·åï¼å·²è®°å ¥é®é¢æ±æ»ã 4. **注æ**ï¼æ¬æ¬¡**æª**æ¹å¨ 8 ææ¯çä¸ä»»ä½å ¥åºæ°æ®ã ## ä¸ãç»è®º - 2026-07 / 2026-08 两个导åºä»¶åå¯è¢« Excel æ£å¸¸æå¼ï¼å 19 页ï¼ï¼ä¸ã è´§è¿ã页 2021/2022/2023 累计åå£å¾**å®å ¨ä¸è´**ã - 7 ææ¯çå·²æ 8 ææ¯çå£å¾è¡¥é½ï¼å¹´åº¦å 360 æ ¼ + 累计 324 æ ¼ï¼ï¼å¹¶ä» openpyxl è¡ç¼è½¬ä¸º Excel åçã - ç¨æ·è¦æ±çãæ®çæ°æ®å ¨é¨æ¸ é¤ãç»å¤æ ¸ä¸º 0 æ®çã ## å «ãéç - 2026-06 / 2026-09 æ æ¯ç â é¢è§è¿å `ready=False`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼éæ°å»ºæ¯çæè½åºæ°ï¼ç¨æ·ç¬¬ 5 é®ç延伸ï¼ã - ä»åºæ ¹ç®å½ `_*.*` ä¸´æ¶ææ¥æä»¶ï¼å«æ¬æ¬¡ `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*`ï¼æªå ï¼å¾ ç¨æ·åæã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-16.md
@@ -309,3 +309,66 @@ - 2026-07 æå¯¼åºä»¶ã è´§è¿ã页为 118x145ï¼æ¯ 8 æå° 2 åï¼ï¼å 7 ææ¯çæ¯ã1-4 æéª¨æ¶ãã 详è§ãåè½æµè¯æ¥å/åè½æµè¯æ¥å_è´§è¿é¡µç¾ç´¯è®¡åä¿®å¤ä¸èææ¸ ç_2026-09-16.mdãã --- ## äºåä¸ã2026-07 æ¯çè¡¥é½ + 导åºä»¶ãExcel æä¸å¼ãæ ¹å ä¿®å¤ æ¥æï¼2026-09-16ï¼ç¬¬ 9 è½®ï¼æ¥äºåèï¼ ### 21.1 ä»å¤©åäºä»ä¹ | # | äºé¡¹ | ç»æ | |---|---|---| | 1 | æ¸ ç 2026-09 æ®çæ°æ®ï¼ç¨æ·ç¬¬ 1 æ¡ï¼ | **宿**ï¼h204_vehicle_quarterly 1284 / investment_monthly 31 / audit_result 2061 / audit_run 3 / import_batch 5 / h2032 636ï¼å ¨é¨å¤æ ¸ä¸º 0 æ®çï¼å·²çå¯è¿å SQL å¤ä»½ `_backup_2026-09_residual_all_20260916.sql` | | 2 | ä¿® 2026-07 导åºä»¶ãExcel æä¸å¼ã | **宿**ï¼P0ï¼è§ 21.2ï¼ | | 3 | è¡¥é½ 2026-07 æ¯çï¼ç¨æ·ç¬¬ 3 æ¡ãå¯ä»¥è¡¥é½ãï¼ | **宿**ï¼è§ 21.3ï¼ | | 4 | ä¿®å¤ä»½æ¯çåå¡«æè¡¥é½ãæååå½¢ã | **宿**ï¼è§ 21.4ï¼ | ### 21.2 æ ¹å ï¼openpyxl æ¯ç + å¤ä»½åå¡« â æ®ç <is> éæ³æ ¼ - åä»¶é 19 ä¸ªæ ¼åå½¢å¦ `<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>`ï¼`t="n"` å´å¸¦ `<is>`ï¼æ¨¡å¼éæ³ï¼Excel ç´æ¥æå¼ï¼COM æ¥ãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼è¿ä¿®å¤æ¨¡å¼ `CorruptLoad=1` 乿ä¸å¼ï¼ã - 7 ææ¯çæ¯ **openpyxl ååº**ï¼ææ¬å `<is>`ï¼ï¼8 ææ¯çæ¯ **Excel åç**ï¼ææ¬èµ° sharedStringsï¼â å代ç ä¸åªæ 7 æåã - 触åè æ¯ `restoreSummaryMonthlyBlocks`ï¼7 ææ `_å¤ä»½_2026å¹´7æâ¦æ¸ çåâ¦xlsx`ï¼æ´æ ¼åå¡«æ¶å¾ inlineStr æ ¼éåå¼ï¼ç䏿§ `<is>`ï¼8 ææ²¡æ `_å¤ä»½_*`ï¼ä¸èµ°åå¡«ï¼æä»¥ä¸ç´æ¯å¥½çã - å®ä½ææ³ï¼å¼å¾è®°ä½ï¼ï¼åä»¶/好件**é¤ worksheets/styles/sharedStrings å¤å ¨é¨é¨ä»¶éåèç¸å** â zip æäº¤ + Excel éä¸å¼æ¡£ leave-one-out â éå® **sheet9ãå ¬äº¤ã17 æ ¼ + sheet12ã轨éã轮渡ã2 æ ¼**ã ### 21.3 ä¿®å¤ 1. `ReportExportService.exportSummaryWorkbook`ï¼è½çåæ°å¢ `normalizeStaleInlineStrings(wb)`ï¼æ¸ æææãé inlineStr å´æ®ç `<is>`ãçæ ¼åï¼å¹ç + warn æ¥å¿ï¼ã 2. `ReportExportService.restoreSummaryMonthlyBlocks`ï¼æ°å¢ `skipFreightHistoryBlocks`ï¼ã è´§è¿ã页 **T åå以å**ï¼2025..2021 äºä¸ªå¹´åº¦å + å年累计åï¼æ°¸ä¸ä»å¤ä»½æ¯çåå¡« ââ 䏿¢æãä¸å£å¾æåå·¦åãä¿æ¤åä¸æè·¯ï¼é²ãçæå夿´»ãã ### 21.4 7 ææ¯çè¡¥é½ï¼Excel COMï¼360 + 324 æ ¼ï¼ æ `_fix_mother.ps1`ï¼8 ææ¯çé£çï¼**æ´ä½å·¦ç§» 2 å**æ¹åï¼ - 年度åï¼2025 `T,V,X,Z,AB,AD,AF,AH,AJ,AL,AN,AP`ï¼2024 `AV..BR` éåï¼2023 `BW..CS` éåï¼2022 `DK..DV` è¿ç»ï¼2021 `EA..EL` è¿ç»ï¼æ¯åå `r7/r9/r8/r10 = SUM(17 å¸å·)`ã`r5=r7+r9`ã`r6=r8+r10` â **360 æ ¼**ï¼ - 累计åï¼`DX=SUM(DK:DV)`ã`EM=SUM(EA:EL)`ã`DY=IFERROR(DX/SUM(EA:EL)-1,"")`ï¼è¡ 5..112 â **324 æ ¼**ï¼ - `CalculateFullRebuild` åä¿åãæ¯ç 921,559 â 1,440,038 åèï¼è½¬ Excel åçï¼ã ### 21.5 æµè¯ç»ææè¦ | ç¨ä¾ | ç»æ | |---|---| | 2026-07 导åºï¼ä¿®å¤åï¼ | FAILï¼å¤ç°ï¼ | | ç¯å¢/è·¯å¾æé¤ï¼å°ä»¶ãä¸¤æ¬æ¯çã09-08 æ§å¯¼åºãæ¹åå¤å¶ï¼ | å ¨é¨ OKï¼ç¡®è®¤éç¯å¢é®é¢ | | ä¿®å¤å 2026-07 å¯¼åº | **OK sheets=19**ï¼`DX5=144979.2825`ã`DY5=-0.101235487797891`ã`EM5=161309.53162`ã`CU5=173045.296428512` | | ä¿®å¤å 2026-08 å¯¼åº | **OK sheets=19**ï¼`DZ5=144979.2825`ã`EO5=161309.53162`ã`CW5=173045.296428512` | | è·¨æä¸è´æ§ | 7 æä¸ 8 æç 2022/2021/2023 累计**å®å ¨ç¸ç** | | éæ³æ ¼å¤æ« | 0 个 | | 2026-09 æ®ç夿 ¸ | 5 å¼ è¡¨å ¨ 0 | > 注ï¼8 ææ¯ç计ç®å `DZ5` ç±æ§ç忻叏é `144979.285376043` å为 `144979.2825`ï¼å·® 0.0029 ââ æ£æ¯ç¬¬åäºèè®°å½çãå ¨çè§ä¸å¸¸é â 17 å¸å·ä¹åãé£ç¬å·®é¢ï¼å±**ä¿®æ£**èéåéã ### 21.6 踩å 1. **Excel COM å¤å¿è¿ç¨ä¼è®© `Workbooks.Open` é´ææ§åæ¥åä¸ä¸ªé**ï¼æ¯ä¾æµå®å¿ é¡»å¼ºææ¬æ¬¡æ°å»ºç `EXCEL` è¿ç¨ãææ¥åæå°±å å¤å¿è¿ç¨è¯¯å¤ã8 æä»¶ä¹æä¸å¼ãï¼æµªè´¹äºä¸è½®ã 2. `CTWorksheet` **没æ** `isSetSheetData()`ï¼sheetData æ¯å¿ å¡«ï¼ï¼è¦ç¨ `getSheetData() != null`ã 3. æ¯çè¡¥é½çå¤ä»½æä»¶**ä¸è½**ç¨ `_å¤ä»½_` åç¼ï¼ä¼è¢« `resolveSummaryDonor` å½ donor åå¡«ï¼ï¼æ¬æ¬¡ç¨ `_bak_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_è¡¥é½å_20260916.xlsx`ã ### 21.7 éç - 2026-06 / 2026-09 æ æ¯ç â é¢è§ `ready=False`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼éå 建æ¯çã - 第 8 æ£éçæªå¨ï¼`h2031` 缺 2025-01ã`passenger_individual_monthly` 2026-08 缺é»åã`PASSENGER_AUTH` 11 æå ¨ 0ã - ä»åºæ ¹ `_*.*`ï¼å«æ¬æ¬¡ `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`ï¼æªå ï¼å¾ ç¨æ·åæã 详è§ãåè½æµè¯æ¥å/åè½æµè¯æ¥å_2026-07æ¯çè¡¥é½ä¸å¯¼åºä»¶æä¸å¼ä¿®å¤_2026-09-16.mdãã docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/ÎÊÌâ»ã×Ü/ÎÊÌâÓë×¢ÒâÊÂÏî»ã×Ü_2026-09-16.md
@@ -243,3 +243,47 @@ | 12 | æ¯çç» Excel éååä½ç§¯ 959,706 -> 1,492,121 åèï¼å¯¼åºä»¶ 950,186 -> 1,331,599ï¼ | çº¯æ ¼å¼å¼éï¼æ°æ®æ å½±å | è®°å½ | 详è§ãåè½æµè¯æ¥å/åè½æµè¯æ¥å_è´§è¿é¡µç¾ç´¯è®¡åä¿®å¤ä¸èææ¸ ç_2026-09-16.mdãã --- ## åä¸ã2026-09-16 è¡¥å ï¼2026-07 æ¯çè¡¥é½ & 导åºä»¶ãExcel æä¸å¼ãæ ¹å ï¼P0ï¼ ### 13.1 çç¶ä¸æ ¹å | 项 | å 容 | |---|---| | çç¶ | `GET /api/report/export/summaryWorkbook?period=2026-07&mode=month` çæç xlsxï¼**Excel æä¸å¼**ï¼COM æ¥ãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼`CorruptLoad=1` ä¿®å¤æ¨¡å¼åæ ·æä¸å¼ï¼ï¼2026-08 忥壿£å¸¸ | | ç´æ¥åå | 导åºä»¶éæ **19 个模å¼éæ³æ ¼**ï¼`<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>` ââ `t="n"` ä¸å 许带 `<is>`ï¼inlineStr ä¸ç¨ï¼ | | æ·±å±åå | 7 ææ¯çç± **openpyxl** ååºï¼`docProps/app.xml` = `Microsoft Excel Compatible / Openpyxl 3.1.5`ï¼ææ¬å `<is>`ï¼ï¼8 ææ¯çæ¯ **Excel åç**ï¼ææ¬èµ° sharedStringsï¼ãPOI çé¨ååå ¥è·¯å¾åªæ¹ `t`/`<v>`ã䏿¸ æ§ `<is>` | | 触åè·¯å¾ | 7 æåå¨ `_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx` â `restoreSummaryMonthlyBlocks` æ´æ ¼åå¡« â å¾ inlineStr æ ¼éåå¼ç䏿§ `<is>`ã8 ææ `_å¤ä»½_*`ï¼ä¸èµ°åå¡«ï¼æ æ£å¸¸ | | å½ä¸ä½ç½® | leave-one-out å®ä½å° **sheet9ãå ¬äº¤ã17 æ ¼ + sheet12ã轨éã轮渡ã2 æ ¼** | ### 13.2 ä¿®å¤ï¼`traffic-audit-server`ï¼ 1. **`exportSummaryWorkbook` æ°å¢ `normalizeStaleInlineStrings(wb)`**ï¼è½ç忏 æææãé `inlineStr` å´æ®ç `<is>`ãçæ ¼åï¼å¹çï¼ï¼å½ä¸å³æ warn æ¥å¿ã 2. **`restoreSummaryMonthlyBlocks` æ°å¢ `skipFreightHistoryBlocks`**ï¼ã è´§è¿ã页 **T åå以å**ï¼2025/2024/2023/2022/2021 年度å + å年累计/ç´¯è®¡åæ¯åï¼**æ°¸ä¸ä»å¤ä»½æ¯çåå¡«** ââ 䏿¢æãä¸å£å¾æå左忰¸ä¸åå¡«ãåä¸æè·¯ï¼é¿å è¡¥é½è¢«ãçæå夿´»ãã ### 13.3 2026-07 æ¯çè¡¥é½ï¼å£å¾ä¸ 8 ææ¯ç对é½ï¼ - 年度åï¼æ¯åï¼ï¼`r7/r9/r8/r10 = SUM(17 å¸å·å¯¹åºè¡)`ã`r5 = r7+r9`ã`r6 = r8+r10` â 360 æ ¼ï¼ - 累计åï¼`DX = SUM(DK:DV)`ï¼2022ï¼ã`EM = SUM(EA:EL)`ï¼2021ï¼å**æ´å为空**ï¼ã`DY = IFERROR(DX/SUM(EA:EL)-1,"")`ï¼2022 ç´¯è®¡åæ¯ï¼å为**忻叏é**ï¼â 324 æ ¼ï¼ - 2023 累计 `CU = BW+BY+â¦+CS` æ¬æ¥å°±æ£ç¡®ï¼æªæ¹ï¼`EN`ï¼2021 ç´¯è®¡åæ¯ï¼æå£å¾ä¿æä¸ºç©ºã - ä¸æè¯æ®ï¼æ¯ç `DX5=144979.2825`ï¼æ§å¸¸é `144979.285376043`ï¼å·® 0.0029 = å ¨çè§ä¸å¸¸éä¸ 17 å¸å·ä¹åçå·®ï¼ã`EM5=161309.53162`ã`CU5=173045.296428512`ï¼ä¸ 8 ææ¯ç `DZ5/EO5/CW5` **å®å ¨ç¸ç**ã - å¤ä»½ï¼`docs/çææ±æ»å¤§è¡¨/_bak_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_è¡¥é½å_20260916.xlsx`ã**åå¿æ¹å为 `_å¤ä»½_` å¼å¤´**ï¼å¦åä¼è¢« `resolveSummaryDonor` å½ donor åå¡«ã ### 13.4 æ¬æ¬¡æ°å¢çææ¥å | é®é¢ | åå | å¤ç½® | |---|---|---| | Excel COM **é´ææ§**æ¥åä¸ä¸ªéï¼å¯¼è´è¯¯å¤ã8 æä»¶ä¹æä¸å¼ã | æ¯æ¬¡ `New-Object -ComObject Excel.Application` çä¸ç**å¤å¿ EXCEL è¿ç¨**伿±¡æåç»å®ä¾ | æ¯ä¾æµå®æãæ¬æ¬¡æ°å»ºç EXCEL è¿ç¨ã强æåæµä¸ä¸ä¾ï¼`Quit()`+`ReleaseComObject` å¹¶ä¸å¤ | | ç¼è¯æ¥ãæ¾ä¸å° isSetSheetData()ã | `CTWorksheet.sheetData` æ¯ XSD **å¿ å¡«**å ç´ ï¼ä¸çæ `isSetXxx` | æ¹ç¨ `ctw.getSheetData() != null` | | é¨ä»¶çº§ diff 太大è·ä¸å¨ | 对 519KB ç `styles.xml` ç´æ¥ `difflib` æ¯ O(n²) | å æé¨ä»¶æ¯åè尺寸/æ¯å¦ç¸çï¼åªå¨å¿ è¦çå°é¨ä»¶ä¸å diff | ### 13.5 éçé®é¢å¢é | # | é®é¢ | å½±å | ç¶æ | |---|---|---|---| | 13 | 2026-06 / 2026-09 æ æ¯ç | é¢è§ `ready=False`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼æ æ³åºæ° | éå 建æ¯çï¼ç¨æ·ç¬¬ 5 é®çå»¶ä¼¸ï¼ | | 14 | ä»åºæ ¹ `_*.*` ä¸´æ¶æä»¶ç»§ç»å¢å¤ï¼`_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`ï¼ | ä½ç§¯/å¯è¯»æ§ | ç»ç¨æ·åæå忏 ç | > 第 10 项ï¼2026-07 导åºä»¶å° 2 å / 7 ææ¯çæ¯ã1-4 æéª¨æ¶ãï¼æ¬èå·²å¤çï¼å¯¼åºç«¯ä¼**èªå¨è¡¥åº 5/6/7 æè¡¨å¤´ä¸å ¬å¼**å¹¶éç®ç´¯è®¡å ¬å¼ï¼æ¯çå·²è¡¥é½ 2021/2022/2023 累计åï¼æ å ³é该项ã traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3360,12 +3360,41 @@ + "æãçæ_éè·¯è¿è¾éæ±æ»è¡¨ã对é½å宽忰={}ï¼ç¼ºæ°æç¤º={}", dbFilled, yoyFilled, monthFormulaFilled, rankRefreshed, cumulativeRefreshed, widthApplied, dbProblems); applyTwoDecimalFormat(wb); // æ°å¼æ¾ç¤ºä¸¤ä½å°æ°ï¼ä¿çå ¨ç²¾åº¦ï¼ï¼% / æ¥æçæ¢ææ ·å¼ä¸æ¹å int inlineFixed = normalizeStaleInlineStrings(wb); // æ¸ æãé inlineStr å´æ®ç <is>ãçéæ³æ ¼ï¼å¦å Excel æç»æå¼ if (inlineFixed > 0) log.warn("æ±æ»å·¥ä½ç°¿æ¸ ææ®ç inlineStr éæ³æ ¼ {} ä¸ªï¼æ¯çç± openpyxl ååºæ¶çå ¸åé®é¢ï¼", inlineFixed); if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr(); wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿å/æ¹åå ¬å¼åæå¼å³éç® return toBytes(wb); } finally { ZipSecureFile.setMinInflateRatio(savedZipRatio); } } /** * æ¸ æãé inlineStr å´æ®ç <is>ãçéæ³åå æ ¼ã * * æ¯çè¥ç± openpyxl ååºï¼ææ¬åå æ ¼ç¨ <is>ï¼inlineStrï¼åå¨ï¼POI ç setCellValue åªæ¹å t ä¸ <v>ï¼ * ä¸ä¼æ¸ ææ§ <is>ï¼äºæ¯äº§åº <c t="n"><v>67.0</v><is><t>67.00</t></is></c> è¿ç§éæ³æ ¼ï¼ * Excel å¤å®ä¸ºãæ æ³è¯»åçå 容ãèç´æ¥æç»æå¼ï¼COM 表ç°ä¸ºãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼ã * 2026-07 导åºä»¶å³å æ¤æä¸å¼ï¼ãå ¬äº¤ã17 æ ¼ +ã轨éã轮渡ã2 æ ¼ï¼ãè½çåç»ä¸æ¸ çï¼å¹çã */ private int normalizeStaleInlineStrings(XSSFWorkbook wb) { int fixed = 0; for (int i = 0; i < wb.getNumberOfSheets(); i++) { org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet ctw = wb.getSheetAt(i).getCTWorksheet(); if (ctw == null || ctw.getSheetData() == null) continue; for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow row : ctw.getSheetData().getRowArray()) { for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell c : row.getCArray()) { if (!c.isSetIs()) continue; STCellType.Enum t = c.getT(); if (t == null || !STCellType.INLINE_STR.equals(t)) { c.unsetIs(); fixed++; } } } } return fixed; } /** @@ -4454,6 +4483,9 @@ if (bs == null) continue; // ä¸å£å¾æå页 A..H éæ§å·¦åå·²äº 2026-09-09 ææ¿æ´åå é¤ï¼è¯¥åºåæ°¸ä¸ä»å¤ä»½æ¯çåå¡«ï¼é¿å âçæå夿´»â boolean skipMidRankLeftBlock = "ä¸å£å¾æå".equals(ds.getSheetName()); // ã è´§è¿ã页 2025..2021 年度åï¼T åèµ·ï¼å«å年累计/ç´¯è®¡åæ¯åï¼å¨æ¯ç鿝ãå¸å·æ´¾çå ¬å¼ãï¼ // å¤ä»½æ¯çååºä»æ¯æ§ç忻叏éï¼å ¨çè§ä¸çï¼ï¼åå¡«ä¼è®© 2021/2022/2023 累计å对ä¸ä¸ï¼âçæå夿´»âï¼ï¼æ 该åºä¸åå¡«ã boolean skipFreightHistoryBlocks = " è´§è¿".equals(ds.getSheetName()); for (int r = ds.getFirstRowNum(); r <= ds.getLastRowNum(); r++) { Row dr = ds.getRow(r); if (dr == null) continue; @@ -4461,6 +4493,7 @@ for (Cell dc : dr) { if (dc == null) continue; if (skipMidRankLeftBlock && dc.getColumnIndex() < 8) continue; if (skipFreightHistoryBlocks && dc.getColumnIndex() >= 19) continue; // T åå以å = 2025..2021 年度å CellType t = dc.getCellType(); if (t == CellType.BLANK) continue; String dtx = summaryCellText(dc);