From 697891d3718a7461c00a334a988cee576d4180e0 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 13 十月 2026 20:10:53 +0800
Subject: [PATCH] fix(汇总大表): 《货运周转量排名》按「全省」行锚点对齐并加全省行自检(待验收)

---
 HANDOFF.md                                                                                        |   19 +++++++++
 docs/生成汇总大表/2026年9月道路运输量汇总表.xlsx                                                                  |    0 
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java |   78 +++++++++++++++++++++++++++++++++++---
 3 files changed, 90 insertions(+), 7 deletions(-)

diff --git a/HANDOFF.md b/HANDOFF.md
index 0de4f3c..6863ce3 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -4,6 +4,25 @@
 > **姣忓ぉ缁撴潫鏃�**锛氭妸褰撳ぉ杩涘睍銆佽俯杩囩殑鍧戙�佹柊闇�姹傘�佹湭瀹屾垚浜嬮」鏇存柊鍒版湰鏂囦欢锛岀劧鍚庡彲浠ユ斁蹇冨紑鏂板璇濄��
 > **鍗忎綔绾﹀畾锛�2026-08-31锛�**锛氳銆屾彁浜ゃ��= 鏈湴 commit + 鎺ㄩ�佸埌杩滅 git锛坥rigin main锛孏itblit锛夛紝涓嶅啀鍙仛鏈湴 commit銆�
 
+### 10-13锛�1锛夛細姹囨�诲ぇ琛ㄣ�婅揣杩愬懆杞噺鎺掑悕銆嬪潡閿欎綅淇锛堟瘝鐗堝垹澶氫綑鏍囬琛� + 浠g爜鎸夈�屽叏鐪併�嶈閿氱偣瀵归綈 + 鍐欏悗鑷锛夈�愬緟楠屾敹銆�
+
+- **鐜拌薄锛堢敤鎴锋姤鍛� + 鏍稿锛�**锛�9 鏈� 鈶♀憿 鍏ュ簱鍚庯紝鐢熸垚浠躲�婅揣杩愬懆杞噺鎺掑悕銆嬫暣鍧楅敊浣嶄竴琛屸�斺�斿叏鐪佸�艰惤鍒�**琛ㄥご琛�**锛堣鐩栥�岀疮璁″畬鎴�(涓囧惃鍏噷锛夈�嶆枃瀛楋級銆佸競宸炲�间笌甯傚窞鍚�**閿欏紑涓�琛�**锛堟姹夎瑁呴粍鐭崇殑鏁扳�︽灄鍖鸿鏄瘝鐗堟棫鍊硷級銆�**姝︽眽鐨勫�间涪澶�**锛沗RANK/鍗犳瘮/Q/R` 闅忛敊浣嶄竴骞堕敊銆�
+- **鏍瑰洜锛堜袱灞傦級**锛氣憼 姣嶇増璇ラ〉姣忓潡姣旀簮搴曠 `docs/璐ц繍/鐢熸垚_鍛ㄨ浆閲忔帓鍚�.xlsx` **澶� 1 琛�**锛堟爣棰樺悎骞跺崰涓よ锛歚A1:R2`銆乣A23:R24`锛涘叏鐪佽鍦ㄧ 5/27 琛岋級锛涒憽 `ReportExportService.copyRankValues` 鎸夈�屽潡鏍囬琛� + 婧愯鍋忕Щ銆嶉�愯鐓ф惉锛屼笖 `:4334` 閬囧埌鐩爣鏍兼槸鍏紡灏辫烦杩� 鈫� 褰㈡垚"鍊煎垪淇濈暀 SUM銆佹帓鍚嶅垪琚啓鎴愪笂涓�琛屽競宸�"鐨勫崐閿欎綅銆傝缂洪櫡**涓�鐩村瓨鍦�**锛�7/8/9 鏈堟瘝鐗堝悓缁撴瀯锛夛紝鍥犺繖椤垫鍓嶈蛋"鏁村潡缂烘暟鐣欑┖"鍒嗘敮锛堚憽鈶㈡湭瀵硷級鑰屾湭鏆撮湶銆�
+- **淇**锛�
+  1. **姣嶇増**锛堢敤鎴� 19:47 鎵ц锛夛細`docs/鐢熸垚姹囨�诲ぇ琛�/2026骞�9鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`銆婅揣杩愬懆杞噺鎺掑悕銆嬪垹鎺変袱鍧楀鍑虹殑鏍囬琛� 鈫� 鍏ㄧ渷琛屽洖鍒扮 **4/25** 琛岋紝涓庛�婅揣杩愰噺鎺掑悕銆嬪悓鏋勶紱Excel 宸茶嚜鍔ㄤ慨濂藉悎骞跺尯涓� `SUM(B5:B21)`/`SUM(B26:B42)` 绛夊叕寮忓尯闂淬��
+  2. **浠g爜**锛坄ReportExportService.copyRankValues` 鈫� 浼犲弬 `List<String> problems`锛夛細鏀规寜鐩爣鍧椼�屽叏鐪併�嶈鍋氶敋鐐癸紝`rowOff = 鐩爣鍏ㄧ渷琛� 鈭� 婧愬叏鐪佽`锛涜瘑鍒笉鍒伴敋鐐瑰洖閫�鏍囬琛屽亸绉诲苟 WARN锛涙柊澧�**鍐欏悗鑷**锛堢洰鏍囧叏鐪佽涓庢簮渚т笉涓�鑷� 鈮�2 鍒� 鈫� WARN + 鍐欏叆銆婃暟鎹己澶辨竻鍗曘�嬶級銆備笁涓帓鍚嶉〉锛堣揣杩愰噺/鍛ㄨ浆閲�/涓彛寰勶級缁熶竴鐢熸晥銆�
+- **楠岃瘉锛�20:06 閲嶆柊鐢熸垚 2026-09锛宒ev 8090/8080 宸查噸鍚姞杞芥柊浠g爜锛�**锛氥�婅揣杩愬懆杞噺鎺掑悕銆嬬疮璁″潡/褰撴湀鍧� 脳 鍏ㄧ渷 + 17 甯傚窞 脳 16 鍒楋紙瑙勪笂/瑙勪笅/鍚堣鍊笺�佸悕娆°�佸崰姣斻�佸悓姣斻�佸閫熷悕娆°�丵/R锛変笌搴撳唴 `scale_split_transport` 2026-09锛圕UMULATIVE/MONTH锛�**閫愭牸涓�鑷达紝0 澶勪笉涓�鑷�**锛涚己鏁版竻鍗� 4鈫�2 鏉★紙鈶♀憿宸插叆搴擄紝浠呭墿缃戠害杞� 2 鏉★級锛涢〉绛惧畾浣� 20 椤点�佺疮璁¢噸寤� 0 鏍笺�佸叕寮忛噸绠� 39969 鏍兼垚鍔熴��
+- **鎶ュ憡锛堟湰鍦般�佷笉鍏ュ簱锛�**锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_姹囨�诲ぇ琛ㄥ懆杞噺鎺掑悕閿氱偣瀵归綈_2026-10-13.md`銆備骇鐗╋細`_tmp/_fix_1013/鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_2026-09_楠岃瘉.xlsx`锛堟湭鍏ュ簱锛夈��
+- **銆愬緟楠屾敹/寰呭畾澶�/寰呭鐞嗐��**锛�
+  1. 銆愬緟楠屾敹銆戙�婅揣杩愬懆杞噺鎺掑悕銆嬫瘝鐗堝垹琛� + 浠g爜閿氱偣瀵归綈涓庤嚜妫�锛堥〉闈㈤噸鏂扮敓鎴愬嵆鍙鐜伴獙璇侊級銆�
+  2. 銆愬緟鐢ㄦ埛鎷嶆澘銆戙�婅揣杩愰噺鎺掑悕銆嬬疮璁″潡銆岃涓嬪閫� / 澧為�熸帓鍚嶃��**30 鏍�**鍙e緞锛氱敓鎴愪欢锛堝叏鐪� 0.052525锛塿s 妗岄潰銆�2026骞�9鏈堝杩愰噺銆佽揣杩愰噺棰勬祴.xlsx銆嬶紙鍏ㄧ渷 -0.224015锛夛紝闇�瀹氫互鍝竟涓哄噯銆�
+  3. 銆愬緟鐢ㄦ埛鎷嶆澘銆戠増寮忔湡鏈涳細鍧楅『搴忥紙鐢熸垚浠�=绱鍦ㄤ笂锛涢娴嬩欢=褰撴湀鍦ㄤ笂锛夈�佸競宸炲悕甯︿笉甯�"甯�"銆�
+  4. 銆愬緟澶勭悊銆�7/8 鏈堟瘝鐗堝悓涓�"澶� 1 琛�"缁撴瀯锛堝湪 `褰掓。/`锛夆�斺�旈敋鐐瑰榻愬悗姝g‘鎬у凡涓嶅彈褰卞搷锛屼笅娆″彇鍥炲嚭琛ㄦ椂纭鍗冲彲锛屾殏涓嶆敼褰掓。浠躲��
+  5. 銆�12 鏈堝墠銆戣法骞存瘝鐗堥渶鏂板紑涓�鏈紙鎵╁垪 `month>=12` 鏄庣‘鎷掔粷锛夛紱寤鸿鍋氭垚鍗婅嚜鍔紝瑙勫垯寰呭畾锛堜繚鐣欏嚑骞村巻鍙插潡 / 鏂颁竴骞存湀搴﹀垪甯冩斁 / 2027-01 姣嶇増鏄惁鐣欐。锛夈��
+  6. 銆愮己鏁�/缂鸿銆戠綉绾﹁溅 9 鏈堬紙璁㈠崟銆佸叏鐪� pin銆佹簮鏂囦欢锛夛紱鍏氦 9 鏈� 141 琛� vs 142 琛岋紙婧愭枃浠剁己 `闅忓窞甯偮峰箍姘村競瀹夐『鍏氦鏈夐檺鍏徃`锛夈��
+- **鐜**锛歞ev 鍓嶅悗绔� 20:00 閲嶅惎锛坄backend.log` 瑙� `Started TrafficAuditApplication`銆乣Tomcat started on port(s): 8090`锛夛紱鍚姩鏃ュ織鍙︽湁涓�鏉′笌鏈鏃犲叧鐨� `traffic_audit.holiday_calendar` 琛ㄤ笉瀛樺湪鍛婅銆�
+- **鏁版嵁杈圭晫**锛氭湰杞彧鍋氱敓鎴愪笌鍙鏍稿锛堝簱鍐呮煡璇㈠彧璇伙級锛�**鏈鍏ャ�佹湭瑕嗙洊浠讳綍涓氬姟鏁版嵁**銆�
+
 ### 10-12锛�14锛夛細姹囨�诲ぇ琛ㄣ�岀己鏁版竻鍗曞脊绐� + 鐢熸垚浠躲�婃暟鎹己澶辨竻鍗曘�嬮〉銆�+ 浣撴鍋囬槼鎬т慨澶� + 鍏氦 9鏈堢己琛屾牳鏌ャ�愬緟楠屾敹銆�
 
 - **鍔ㄥ洜**锛氱敤鎴疯姹傛妸缂烘暟鎽嗗埌鍙伴潰涓婏紙P0-3 鍓╀綑锛夛紝骞跺湪鐢熸垚浠堕噷缁欎竴椤点�婃暟鎹己澶辨竻鍗曘�嬨��
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2649\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2649\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
index dac7381..a8cc398 100644
--- "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2649\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2649\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
Binary files differ
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 1b9671a..c4476dd 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
@@ -3770,7 +3770,7 @@
             // 2026-10-13锛氱疮璁″垪 / 绱鍚屾瘮鍒嗘瘝鎸夎〃澶撮噸寤猴紙鏍规不鎵╁垪鍣ㄦ棭鏈熲�滅疮璁℃紡鏈堚�濈殑鍘嗗彶娆犺处锛�
             int cumRebuilt = summaryWorkbookFiller.repairCumulativeFormulas(wb, year, effMonth);
             reportProgress(progress, 45, "鍒锋柊鎺掑悕椤典笌璺ㄩ〉鍚堟垚椤�");
-            int rankRefreshed = refreshSummaryRankSheets(wb, effPeriod, "month");
+            int rankRefreshed = refreshSummaryRankSheets(wb, effPeriod, "month", dbProblems);
             int cumulativeRefreshed = refreshSummaryCumulativeSheets(wb, year, effMonth); // 鍥涘紶璺ㄩ〉鍚堟垚椤甸殢鎶ヨ〃鏈熷埛鏂�
             // 2026-10-12锛氬仠鐢ㄣ�屽鐢ㄥ閮ㄥ弬鐓т欢銆婄敓鎴恄閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx銆嬪垪瀹姐�嶁�斺�旂増寮忎竴寰嬩互褰撴湡姣嶇増涓哄噯锛�
             // 閬垮厤姣嶇増涓庡弬鐓т欢涓ゅ缁存姢锛堟瘝鐗堝凡骞跺叆鍙傜収浠剁殑鍒楀/闅愯棌锛夈��
@@ -4250,11 +4250,11 @@
      * 鐨勭粨鏋滃埛鏂版暟鍊硷紝閬垮厤姹囨�昏〃閲岀殑鎺掑悕椤靛仠鐣欏湪鏃ф湀浠姐��
      * 鏁板�兼牸鎼�笺�佸叕寮忔牸鎸夊亸绉诲钩绉诲叕寮忓悗鍐欏叆锛涚洰鏍囨牸鏈韩宸叉槸鍏紡鐨勶紙SUM/RANK/鍗犳瘮/琛ユ暟锛変繚鐣欎笉鍔紝鎵撳紑鏃舵寜鏂版暟鎹噸绠椼��
      */
-    private int refreshSummaryRankSheets(XSSFWorkbook wb, String period, String mode) throws Exception {
+    private int refreshSummaryRankSheets(XSSFWorkbook wb, String period, String mode, List<String> problems) throws Exception {
         int n = 0;
-        n += copyRankValues(wb, "璐ц繍閲忔帓鍚�", exportFreightRank(period, mode), new int[][]{{0, 0}, {22, 0}});
-        n += copyRankValues(wb, "璐ц繍鍛ㄨ浆閲忔帓鍚�", exportTurnoverRank(period, mode), new int[][]{{0, 0}, {22, 0}});
-        n += copyRankValues(wb, "涓彛寰勬帓鍚�", exportPassengerMidRank(period, mode, wb), new int[][]{{0, 0}, {0, 10}});
+        n += copyRankValues(wb, "璐ц繍閲忔帓鍚�", exportFreightRank(period, mode), new int[][]{{0, 0}, {22, 0}}, problems);
+        n += copyRankValues(wb, "璐ц繍鍛ㄨ浆閲忔帓鍚�", exportTurnoverRank(period, mode), new int[][]{{0, 0}, {22, 0}}, problems);
+        n += copyRankValues(wb, "涓彛寰勬帓鍚�", exportPassengerMidRank(period, mode, wb), new int[][]{{0, 0}, {0, 10}}, problems);
         return n;
     }
 
@@ -4263,13 +4263,15 @@
      * srcBlocks[i] = 婧愬潡 i 鐨勮捣濮� {琛�, 鍒梷锛�0 鍩猴級锛涚洰鏍囧潡鎸夋爣棰橀『搴忥紙绱鍧楀湪鍓嶃�佸綋鏈堝潡鍦ㄥ悗锛夊搴斻��
      * 鏁板�兼牸鐩存帴鎼�硷紱婧愪晶鏄叕寮忕殑锛堟帓鍚�/鍗犳瘮绛夛級鎸夌洰鏍囧潡鍋忕Щ鏁翠綋骞崇Щ鍚庡啓鍏ュ叕寮忥紝鎵撳紑鏃舵寜姹囨�昏〃鑷韩鏁版嵁閲嶇畻銆�
      */
-    private int copyRankValues(XSSFWorkbook dstWb, String dstSheetName, byte[] srcBytes, int[][] srcBlocks) throws Exception {
+    private int copyRankValues(XSSFWorkbook dstWb, String dstSheetName, byte[] srcBytes, int[][] srcBlocks,
+                              List<String> problems) throws Exception {
         XSSFSheet dst = dstWb.getSheet(dstSheetName);
         if (dst == null) return 0;
         List<XSSFCell> dstTitles = rankTitleCells(dst);
         if (dstTitles.isEmpty()) return 0;
         int copied = 0;
         FormulaEvaluator dstEv = dstWb.getCreationHelper().createFormulaEvaluator();
+        List<int[]> anchors = new ArrayList<>(); // {婧愬叏鐪佽, 鐩爣鍏ㄧ渷琛�, 鍧楅鍒�, 鍒楀亸绉�, 鍧楀}
         try (InputStream sin = new ByteArrayInputStream(srcBytes);
              XSSFWorkbook srcWb = new XSSFWorkbook(sin)) {
             XSSFSheet src = srcWb.getSheetAt(0);
@@ -4279,10 +4281,27 @@
                 int sr0 = srcBlocks[b][0];
                 int sc0 = srcBlocks[b][1];
                 XSSFCell dstTitle = dstTitles.get(b);
-                int rowOff = dstTitle.getRowIndex() - sr0;
                 int colOff = dstTitle.getColumnIndex() - sc0;
+                int rowOff = dstTitle.getRowIndex() - sr0;
+                // 2026-10-13锛氥�婅揣杩愬懆杞噺鎺掑悕銆嬫瘝鐗堝潡鏍囬鏇惧崰涓よ锛堝悎骞讹級锛�"鏍囬琛�+鍥哄畾鍋忕Щ"浼氭妸婧愯
+                // 鏁翠綋鍐欓敊浣嶄竴琛岋紙鍏ㄧ渷鍊艰惤鍒拌〃澶磋銆佸競宸炲�间笌甯傚窞鍚嶉敊寮�锛夈�傛敼涓虹敤銆屽叏鐪併�嶈鍋氶敋鐐瑰榻愶細
+                // rowOff = 鐩爣鍏ㄧ渷琛� - 婧愬叏鐪佽锛涜瘑鍒笉鍒伴敋鐐瑰啀鍥為��鏍囬琛屽亸绉诲苟鍛婅銆�
+                Integer srcAnchor = rankAnchorRow(src, sr0, sc0);
+                Integer dstAnchor = rankAnchorRow(dst, dstTitle.getRowIndex(), dstTitle.getColumnIndex());
+                if (srcAnchor != null && dstAnchor != null) {
+                    int anchored = dstAnchor - srcAnchor;
+                    if (anchored != rowOff) {
+                        log.info("鎺掑悕椤点�妠}銆嬬 {} 鍧楋細鏍囬琛屽亸绉� {} 涓庛�屽叏鐪併�嶉敋鐐瑰亸绉� {} 涓嶄竴鑷达紝鎸夐敋鐐瑰榻愶紙婧愬叏鐪佽={}锛岀洰鏍囧叏鐪佽={}锛�",
+                                dstSheetName, b + 1, rowOff, anchored, srcAnchor + 1, dstAnchor + 1);
+                    }
+                    rowOff = anchored;
+                } else {
+                    log.warn("鎺掑悕椤点�妠}銆嬬 {} 鍧楋細鏈瘑鍒埌銆屽叏鐪併�嶉敋鐐癸紙婧�={}锛岀洰鏍�={}锛夛紝鍥為��鎸夋爣棰樿鍋忕Щ {} 瀵归綈",
+                            dstSheetName, b + 1, srcAnchor, dstAnchor, rowOff);
+                }
                 int h = rankBlockHeight(src, sr0, sc0);
                 int w = rankBlockWidth(src, sr0, sc0);
+                anchors.add(new int[]{srcAnchor == null ? -1 : srcAnchor, dstAnchor == null ? -1 : dstAnchor, sc0, colOff, w});
                 // 2026-10-12锛氭暣鍧楃己鏁帮紙婧愪晶涓�涓暟鍊奸兘娌℃湁锛屽 9 鏈堢己鈶♀憿鏃剁殑鍛ㄨ浆閲忔帓鍚嶏級鈫� 鐩爣鍧楀彧鐣欐爣棰樹笌鏍囩锛�
                 // 鏁版嵁/鎺掑悕/鍗犳瘮涓�寰嬬暀绌猴紱鍚﹀垯姣嶇増鐨� RANK/鍗犳瘮鍏紡浼氬湪绌哄潡涓婄畻鍑恒�屽叏 1 + #DIV/0!銆嶃��
                 boolean blockHasData = false;
@@ -4361,6 +4380,34 @@
                     }
                 }
             }
+        // 2026-10-13 鑷锛氱洰鏍囥�屽叏鐪併�嶈搴斾笌婧愪晶涓�鑷达紙鍋忕Щ閿欎綅銆佹眹鎬诲尯闂翠笉瀵规椂鎶ヨ骞跺啓杩涚己鏁版竻鍗曪級
+        for (int[] an : anchors) {
+            if (an[0] < 0 || an[1] < 0) continue;
+            Row srr = src.getRow(an[0]);
+            Row drr = dst.getRow(an[1]);
+            if (srr == null || drr == null) continue;
+            int badCols = 0;
+            StringBuilder ex = new StringBuilder();
+            for (int c = 0; c < an[4]; c++) {
+                Cell sCell = srr.getCell(an[2] + c);
+                Cell dCell = drr.getCell(an[2] + c + an[3]);
+                Double sv = sCell == null ? null : rankNumeric(sCell, ev);
+                Double dv = dCell == null ? null : rankNumeric(dCell, dstEv);
+                if (sv == null && dv == null) continue;
+                if (sv == null || dv == null || Math.abs(sv - dv) > Math.max(1.0, Math.abs(sv) * 1e-4)) {
+                    badCols++;
+                    if (badCols <= 3) {
+                        if (ex.length() > 0) ex.append("锛�");
+                        ex.append(colLetter(an[2] + c)).append(" 婧�=").append(sv).append(" 鐩爣=").append(dv);
+                    }
+                }
+            }
+            if (badCols >= 2) {
+                String msg = "鎺掑悕椤点��" + dstSheetName + "銆嬨�屽叏鐪併�嶈涓庢簮渚т笉涓�鑷达紙" + badCols + " 鍒楋級锛�" + ex;
+                log.warn(msg);
+                if (problems != null) problems.add("鐢熸垚鏍¢獙锛�" + msg);
+            }
+        }
         }
         return copied;
     }
@@ -4427,6 +4474,23 @@
     }
 
     /** 鎺掑悕椤甸噷鐨勨�滃潡鏍囬鈥濆崟鍏冩牸锛堝惈鈥滃叏鐪佸垎甯傚窞鈥濈殑璇存槑鏂囧瓧锛夛紝鎸夎銆佸垪椤哄簭杩斿洖 */
+    /** 鍦� [fromRow, fromRow+40) 鑼冨洿鍐呫�佸潡璧峰涓ゅ垪閲屾壘鏁存牸鏂囨湰涓恒�屽叏鐪併�嶇殑琛屽彿锛�0 鍩猴級锛涙壘涓嶅埌杩斿洖 null銆�
+     *  2026-10-13锛氭帓鍚嶉〉鍧楃粨鏋勫彲鑳藉洜姣嶇増鐗堝紡涓嶅悓鑰屾暣浣撲笂/涓嬬Щ涓�琛岋紝鐢ㄣ�屽叏鐪併�嶈鍋氶敋鐐瑰彲鑷姩瀵归綈銆� */
+    private Integer rankAnchorRow(Sheet sh, int fromRow, int col0) {
+        int last = Math.min(sh.getLastRowNum(), fromRow + 40);
+        for (int r = fromRow; r <= last; r++) {
+            Row row = sh.getRow(r);
+            if (row == null) continue;
+            for (int c = Math.max(0, col0); c <= col0 + 1; c++) {
+                Cell cell = row.getCell(c);
+                if (cell == null || cell.getCellType() != CellType.STRING) continue;
+                String v = cell.getStringCellValue();
+                if (v != null && v.replace(" ", "").equals("鍏ㄧ渷")) return r;
+            }
+        }
+        return null;
+    }
+
     private List<XSSFCell> rankTitleCells(Sheet sh) {
         List<XSSFCell> out = new ArrayList<>();
         for (int r = sh.getFirstRowNum(); r <= sh.getLastRowNum(); r++) {

--
Gitblit v1.9.1