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(汇总大表): 《货运周转量排名》按「全省」行锚点对齐并加全省行自检(待验收)

---
 traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java |  436 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 310 insertions(+), 126 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
index 19191bd..23d340e 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -1808,6 +1808,72 @@
         }
     }
 
+    /** 鍙牎楠屻�屽繀闇�鍒楁寜鍚嶅瓨鍦ㄣ�嶏紙涓嶆牎楠屽垪浣嶏級锛氱敤浜庡吋瀹瑰悓浜嬬増妯℃澘鐨勫垪浣嶅樊寮� */
+    private void requireHeaderColsByName(Sheet sheet, String typeLabel, String templateHint, String[] keywords) {
+        Row header = sheet == null ? null : sheet.getRow(0);
+        if (header == null) {
+            throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨��" + typeLabel + "銆戞枃浠惰〃澶寸己澶憋紝璇蜂娇鐢ㄧ郴缁熸ā鏉裤��" + templateHint + "銆嬫暣鐞嗗悗鍐嶅鍏�");
+        }
+        List<String> missing = new ArrayList<>();
+        for (String keyword : keywords) {
+            if (findColByKeywords(header, keyword) < 0) missing.add(keyword);
+        }
+        if (!missing.isEmpty()) {
+            throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨��" + typeLabel + "銆戜笌鏂囦欢鍐呭涓嶇锛氳〃澶寸己灏戝繀闇�鍒椼��"
+                + String.join("銆戙��", missing) + "銆戯紝璇风‘璁ゆ槸鍚﹂�夐敊浜嗘暟鎹被鍨嬶紙妯℃澘锛�" + templateHint + "锛�");
+        }
+    }
+
+    /** 琛ㄥご鍚� 鈫� 鍒楀彿锛堥娆″嚭鐜帮級锛涙湭鍛戒腑鏃跺洖閫� fallback锛屼繚鎸佸鏃фā鏉垮吋瀹� */
+    private int colByName(Row header, int fallback, String name) {
+        return colByName(header, fallback, name, 1);
+    }
+
+    /** 琛ㄥご鍚� 鈫� 鍒楀彿锛堢 occurrence 娆″嚭鐜帮級锛涙湭鍛戒腑鏃跺洖閫� fallback */
+    private int colByName(Row header, int fallback, String name, int occurrence) {
+        if (header == null) return fallback;
+        int hit = 0;
+        for (int c = 0; c <= header.getLastCellNum(); c++) {
+            Cell cell = header.getCell(c);
+            if (cell == null) continue;
+            String v = FORMATTER.formatCellValue(cell).trim();
+            if (v.contains(name)) {
+                hit++;
+                if (hit == occurrence) return c;
+            }
+        }
+        return fallback;
+    }
+
+    /** 鎸夎〃澶村叧閿瓧瀹氫綅鍒楀彿锛氫粠绗� 1 鍒楀悜鍙虫壂锛屽懡涓换涓�鍏抽敭瀛楀嵆杩斿洖璇ュ垪锛涙湭鍛戒腑杩斿洖 -1 */
+    private int findColByKeywords(Row header, String... keywords) {
+        if (header == null) return -1;
+        for (int c = 0; c <= header.getLastCellNum(); c++) {
+            Cell cell = header.getCell(c);
+            if (cell == null) continue;
+            String h = FORMATTER.formatCellValue(cell).trim();
+            if (h.isEmpty()) continue;
+            for (String k : keywords) {
+                if (h.contains(k)) return c;
+            }
+        }
+        return -1;
+    }
+
+    /** 琛ㄥご琛屾枃鏈紙鎶ラ敊鎻愮ず鐢級锛屾渶澶氬彇 12 鍒� */
+    private String headerText(Row header) {
+        if (header == null) return "绌�";
+        StringBuilder sb = new StringBuilder();
+        for (int c = 0; c < Math.min(header.getLastCellNum(), 12); c++) {
+            Cell cell = header.getCell(c);
+            String h = cell == null ? "" : FORMATTER.formatCellValue(cell).trim();
+            if (h.isEmpty()) continue;
+            if (sb.length() > 0) sb.append(" | ");
+            sb.append(h);
+        }
+        return sb.length() == 0 ? "绌�" : sb.toString();
+    }
+
     /** 鎸夎〃澶村悕绉板缓绔嬪垪鍙锋槧灏勶紝鍏煎鏂版棫妯℃澘鍒椾綅宸紓 */
     private Map<String, Integer> buildHeaderMap(Row header) {
         Map<String, Integer> colMap = new HashMap<>();
@@ -2413,6 +2479,41 @@
             || normDash.contains(period) || normDash.contains(period.replace("-0", "-"));
     }
 
+    /**
+     * 鎶ヨ〃鏈熷崟鍏冩牸鍛戒腑锛氭壂鎻� sheet 鍓� 8 琛岋紝鎵惧舰濡� 2026.08 / 2026骞�8鏈� / 2026-08-24 鐨勬姤琛ㄦ湡鏂囧瓧鎴栨棩鏈熷崟鍏冩牸銆�
+     * 鑳屾櫙锛�2026-09-22锛夛細娼滄睙鍗曡〃鍚� 20 涓巻鍙� sheet锛堟綔姹燂紙1鏈堬級鈥︽綔姹燂紙8鏈堬級鈥︼級锛屾棫閫昏緫鍙寜銆�8鏈堛�嶅尮閰� sheet 鍚嶏紝
+     * 浼氭妸 2018 骞寸殑銆屾綔姹燂紙8鏈堬級銆嶅綋鎴� 2026-08锛屽鍏ユ垚 2018 骞存暟鎹紱褰撴湡 sheet 鍚嶆槸銆屾綔姹燂紙2022.3锛夈�嶏紝
+     * 鍙兘闈犺〃鍐呮姤琛ㄦ湡锛�2026.08.24锛夎瘑鍒��
+     */
+    private boolean investSheetPeriodCellHit(Sheet sh, String period) {
+        if (sh == null || period == null || !period.matches("\\d{4}-\\d{2}")) return false;
+        String year = period.substring(0, 4);
+        int month = Integer.parseInt(period.substring(5, 7));
+        int last = Math.min(sh.getLastRowNum(), 7);
+        for (int r = 0; r <= last; r++) {
+            Row row = sh.getRow(r);
+            if (row == null) continue;
+            int lastCell = Math.max(1, row.getLastCellNum());
+            for (int c = 0; c < Math.min(lastCell, 12); c++) {
+                Cell cell = row.getCell(c);
+                if (cell == null) continue;
+                if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
+                    java.time.LocalDate d = cell.getLocalDateTimeCellValue().toLocalDate();
+                    if (d.getYear() == Integer.parseInt(year) && d.getMonthValue() == month) return true;
+                    continue;
+                }
+                String v = cellStr(row, c);
+                if (v == null) continue;
+                String t = v.trim().replace(" ", "");
+                if (t.isEmpty() || t.length() > 30) continue;
+                java.util.regex.Matcher mm = java.util.regex.Pattern
+                        .compile("(\\d{4})\\s*[骞�.\\-/]\\s*(\\d{1,2})").matcher(t);
+                if (mm.find() && year.equals(mm.group(1)) && month == Integer.parseInt(mm.group(2))) return true;
+            }
+        }
+        return false;
+    }
+
     /** 瑙f瀽鍗曚釜甯傚窞鎶ヨ〃锛氶�� sheet锛堟姤琛ㄦ湡鍚嶄紭鍏� + 鏁版嵁琛屾暟锛夛紝鎸夊垪鍚嶆槧灏勬彁鍙栭」鐩 */
     private void parseInvestCityWorkbook(Workbook wb, String fileName, String category, String period,
                                          Set<String> fiveYearNames, List<InvestCityRow> rows, Map<String, Object> fr) {
@@ -2424,7 +2525,10 @@
             Map<String, Integer> col = findInvestHeader(sh);
             if (col == null) continue;
             int cnt = countInvestRows(sh, col);
-            int score = cnt + (cnt > 0 && investSheetMatchesPeriod(sh, period) ? 1000000 : 0);
+            // 2026-09-22锛氳〃鍐呮姤琛ㄦ湡锛堝崟鍏冩牸锛夊懡涓潈閲嶆渶楂樷�斺�斿巻鍙插悓鏈� sheet锛堝娼滄睙锛�8鏈堬級锛変笉鑳界洊杩囧綋鏈� sheet
+            boolean cellHit = cnt > 0 && investSheetPeriodCellHit(sh, period);
+            int score = cnt + (cnt > 0 && investSheetMatchesPeriod(sh, period) ? 1000000 : 0)
+                    + (cellHit ? 2000000 : 0);
             if (cnt > 0 && investSheetMatchesPeriod(sh, period)) {
                 // 褰撴湡鐪熷疄鎶ヨ〃 sheet 鍚嶉�氬父甯﹀勾浠斤紙濡� 2026.8/2026骞�8鏈堬級锛屽巻鍙瞫heet澶氫负绾湀浠藉悕锛�8鏈堬級锛氬甫骞翠唤鐨勪紭鍏�
                 String norm = sh.getSheetName() == null ? "" : sh.getSheetName().replace(" ", "");
@@ -2465,10 +2569,10 @@
             }
             if (name == null || name.trim().isEmpty()) continue;
             String nt = name.trim().replaceAll("[\r\n]+", "");
-            if (nt.contains("鍚堣") || nt.contains("鎬昏")) continue;
+            String ntFlat = nt.replaceAll("\\s+", "");
+            if (ntFlat.contains("鍚堣") || ntFlat.contains("鎬昏") || ntFlat.contains("灏忚")) continue;
             if (nt.matches("^[涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+銆�.*")) continue;
             if (nt.matches("^锛圼涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+锛�.*")) continue;
-            if (nt.replace(" ", "").matches(".*灏廫\s*璁�.*")) continue;
             if (nt.startsWith("濉姤") || nt.startsWith("鍗曚綅璐熻矗浜�") || nt.matches("^\\d+銆�.*")) continue;
             if (hasSeq) {
                 if (seq == null || seq.trim().isEmpty()) {
@@ -2489,6 +2593,8 @@
             project.setProjectName(nt);
             project.setCategory(category);
             project.setCity(currentCity);
+            String countyCell = cellStr(row, col.get("county"));
+            if (countyCell != null && !countyCell.trim().isEmpty()) project.setCounty(countyCell.trim());
             project.setBuilderName(cellStr(row, col.get("builder")));
             project.setConstructNature(cellStr(row, col.get("nature")));
             project.setStartTime(investTime(cellStr(row, col.get("start"))));
@@ -2524,13 +2630,22 @@
             Row row = sh.getRow(r);
             if (row == null) continue;
             boolean hasName = false;
+            int headerCells = 0;
             for (int c = 0; c <= row.getLastCellNum(); c++) {
                 String v = cellStr(row, c);
-                if (v != null && v.contains("椤圭洰鍚嶇О")) { hasName = true; break; }
+                if (v == null) continue;
+                String t = v.trim();
+                if (t.isEmpty() || t.length() > 20) continue;   // 璇存槑鎬ч暱鍙ヤ笉绠楄〃澶村瓧娈�
+                String k = investHeaderKey(t);
+                if (k == null) continue;
+                headerCells++;
+                if ("name".equals(k)) hasName = true;
             }
-            if (!hasName) continue;
+            // 鐪熻〃澶磋鑷冲皯鏈� 2 涓煭琛ㄥご瀛楁锛涘彧鏈変竴鏍奸暱鍙ュ惈銆岄」鐩悕绉般�嶇殑璇存槑椤典細琚帓闄�
+            if (!hasName || headerCells < 2) continue;
             Map<Integer, String> colTexts = new HashMap<>();
-            for (int rr = r; rr <= Math.min(r + 3, sh.getLastRowNum()); rr++) {
+            int scanEnd = investHeaderScanEnd(sh, r, row);
+            for (int rr = r; rr <= scanEnd; rr++) {
                 Row rr2 = sh.getRow(rr);
                 if (rr2 == null) continue;
                 for (int c = 0; c <= rr2.getLastCellNum(); c++) {
@@ -2541,23 +2656,8 @@
             }
             Map<String, Integer> col = new HashMap<>();
             for (Map.Entry<Integer, String> e : colTexts.entrySet()) {
-                int c = e.getKey();
-                String v = e.getValue();
-                if (v.contains("椤圭洰鍚嶇О")) col.putIfAbsent("name", c);
-                else if (v.contains("鎶曡祫寤鸿") || v.contains("寤鸿鍗曚綅") || v.contains("椤圭洰涓氫富")) col.putIfAbsent("builder", c);
-                else if (v.contains("寤鸿鎬ц川")) col.putIfAbsent("nature", c);
-                else if (v.contains("寮�宸�")) col.putIfAbsent("start", c);
-                else if (v.contains("绔e伐") || v.contains("寤烘垚")) col.putIfAbsent("end", c);
-                else if ((v.contains("璁″垝鎬绘姇璧�") || v.contains("鎬绘姇璧�")) && !v.contains("绱")) col.putIfAbsent("total", c);
-                else if (v.contains("鑷紑濮嬪缓璁�")) col.putIfAbsent("startcum", c);
-                else if (v.contains("鏈勾璁″垝")) col.putIfAbsent("yearplan", c);
-                else if (v.contains("鑷勾鍒濈疮璁�")) col.putIfAbsent("yearcum", c);
-                else if (v.contains("鏈湀瀹屾垚")) col.putIfAbsent("monthdone", c);
-                else if (v.contains("寤鸿闃舵")) col.putIfAbsent("stage", c);
-                else if (v.contains("褰㈣薄杩涘害")) col.putIfAbsent("desc", c);
-                else if (v.contains("宸ュ彲") && !v.contains("椤圭洰鍚嶇О")) col.putIfAbsent("gk", c);
-                else if (v.contains("鍒濊") && !v.contains("椤圭洰鍚嶇О")) col.putIfAbsent("cs", c);
-                else if (v.contains("寤虹瓚闈㈢Н") && !v.contains("鏂板")) col.putIfAbsent("area", c);
+                String k = investHeaderKey(e.getValue());
+                if (k != null) col.putIfAbsent(k, e.getKey());
             }
             if (!col.containsKey("name")) continue;
             for (int c = 0; c <= row.getLastCellNum(); c++) {
@@ -2574,14 +2674,88 @@
                 int md = col.get("yearcum") + 1;
                 if (md <= row.getLastCellNum()) col.put("monthdone", md);
             }
+            // desc 缂哄け鏃舵寜 stage+1 鍏滃簳锛氱渷鏍囥�岄」鐩缓璁鹃樁娈点�佽繘搴︽儏鍐点�嶆槸 L/M 鍚堝苟琛ㄥご锛�
+            // 瀛濇劅/鎭╂柦/鏋楀尯/闅忓窞绛夊競宸炲彧鍦� L 鍐欍�屽缓璁鹃樁娈点�嶃�丮 鐩存帴鍐欒繘搴︽枃瀛楄�屼笉鍐欐爣棰�
+            if (!col.containsKey("desc") && col.containsKey("stage") && col.get("stage") >= 0) {
+                int dc = col.get("stage") + 1;
+                if (dc <= row.getLastCellNum()) col.put("desc", dc);
+            }
             for (String k : new String[]{"builder", "nature", "start", "end", "total", "startcum",
-                "yearplan", "yearcum", "monthdone", "stage", "desc", "gk", "cs", "area"}) {
+                "yearplan", "yearcum", "monthdone", "stage", "desc", "gk", "cs", "area", "county"}) {
                 col.putIfAbsent(k, -1);
             }
             col.put("headerRow", r);
             return col;
         }
         return null;
+    }
+
+    /** 鍗曚釜琛ㄥご鍗曞厓鏍� -> 瀛楁閿紙null 琛ㄧず涓嶆槸琛ㄥご瀛楁锛夛紱渚涜〃澶磋鍒ゅ畾涓庡垪鏄犲皠鍏辩敤 */
+    private String investHeaderKey(String v) {
+        if (v == null) return null;
+        // 2026-09-22锛氳〃澶村崟鍏冩牸甯稿甫鎹㈣/鍏ㄨ绌烘牸锛堝澶╅棬銆岃嚜寮�濮嬪缓\n璁剧疮璁″畬\n鎴愭姇璧刓n(涓囧厓)銆嶏級锛�
+        // 缁熶竴鍘绘帀鍏ㄩ儴绌虹櫧鍚庡啀鍒ゅ畾鍏抽敭璇嶏紱鍚﹀垯 H(鑷紑濮嬪缓璁剧疮璁�)/J(鑷勾鍒濈疮璁�)/K(鏈湀瀹屾垚) 浼氬尮閰嶅け璐ワ紝
+        // 鍒楁槧灏勮惤鍒� -1 鈫� 涓変釜鏁板�艰鍐欐垚 0锛堝ぉ闂� 2026-08 灏辨槸杩欐牱涓㈢殑 16677.7/16677.7/500锛夈��
+        String flat = v.replaceAll("[\\s\\u3000]+", "");
+        if (flat.contains("椤圭洰鍚嶇О")) return "name";
+        // 銆屽幙锛堝競銆佸尯锛夈�嶇殑鍚勭鍐欐硶锛氬崐/鍏ㄨ鎷彿銆侀】鍙�/閫楀彿銆佹湁鏃犳嫭鍙凤紝缁熶竴褰掍竴鍖栧悗鍐嶅垽瀹�
+        String flatCounty = flat.replace("锛�", "(").replace("锛�", ")").replace("銆�", "").replace("锛�", "").replace(",", "");
+        if (flatCounty.contains("鍘�(甯傚尯)") || flatCounty.contains("鍘垮競鍖�") || flatCounty.contains("鍖哄幙")) return "county";
+        if (flat.contains("鎶曡祫寤鸿") || flat.contains("寤鸿鍗曚綅") || flat.contains("椤圭洰涓氫富")) return "builder";
+        if (flat.contains("寤鸿鎬ц川")) return "nature";
+        if (flat.contains("寮�宸�")) return "start";
+        if (flat.contains("绔e伐") || flat.contains("寤烘垚")) return "end";
+        if ((flat.contains("璁″垝鎬绘姇璧�") || flat.contains("鎬绘姇璧�")) && !flat.contains("绱")) return "total";
+        if (flat.contains("鑷紑濮嬪缓璁�")) return "startcum";
+        if (flat.contains("鏈勾璁″垝")) return "yearplan";
+        if (flat.contains("鑷勾鍒濈疮璁�")) return "yearcum";
+        if (flat.contains("鏈湀瀹屾垚")) return "monthdone";
+        if (flat.contains("寤鸿闃舵")) return "stage";
+        if (flat.contains("褰㈣薄杩涘害") || flat.contains("寤鸿杩涘睍")) return "desc";
+        if (flat.contains("宸ュ彲") && !flat.contains("椤圭洰鍚嶇О")) return "gk";
+        if (flat.contains("鍒濊") && !flat.contains("椤圭洰鍚嶇О")) return "cs";
+        if (flat.contains("寤虹瓚闈㈢Н") && !flat.contains("鏂板")) return "area";
+        return null;
+    }
+
+    /** 琛ㄥご鏂囨湰鎵弿涓嬬晫锛氶粯璁よ〃澶磋 +3锛涜嫢銆岄」鐩悕绉般�嶅垪棣栦釜鏁版嵁琛屾洿闈犱笅锛屽垯鎵╁睍鍒版暟鎹鍓嶄竴琛岋紙涓婇檺 +12锛夈��
+     *  鑳屾櫙锛氬捀瀹�/鍗佸牥绛夊競宸炴妸銆屽缓璁鹃樁娈�/褰㈣薄杩涘害銆嶆爣绛惧啓鍦ㄨ〃澶翠笅绗� 4~8 琛岋紝鍥哄畾 +3 浼氭紡鍒楋紙褰㈣薄杩涘害璇讳笉鍒帮級銆� */
+    private int investHeaderScanEnd(Sheet sh, int headerRow, Row headerRowObj) {
+        int hardEnd = Math.min(headerRow + 12, sh.getLastRowNum());
+        int nameCol = -1;
+        if (headerRowObj != null) {
+            for (int c = 0; c <= headerRowObj.getLastCellNum(); c++) {
+                String v = cellStr(headerRowObj, c);
+                if (v != null && v.contains("椤圭洰鍚嶇О")) { nameCol = c; break; }
+            }
+        }
+        int firstData = findFirstInvestDataRow(sh, headerRow, nameCol);
+        int scanEnd = (firstData > headerRow)
+            ? Math.min(hardEnd, firstData - 1)
+            : Math.min(headerRow + 3, sh.getLastRowNum());
+        if (scanEnd < headerRow) scanEnd = headerRow;
+        return scanEnd;
+    }
+
+    /** 銆岄」鐩悕绉般�嶅垪棣栦釜鏁版嵁琛屼笅鏍囷紙璺宠繃琛ㄥご缁涓庣┖琛岋級锛涙壘涓嶅埌杩斿洖 -1 */
+    private int findFirstInvestDataRow(Sheet sh, int headerRow, int nameCol) {
+        if (nameCol < 0) return -1;
+        for (int r = headerRow + 1; r <= sh.getLastRowNum(); r++) {
+            Row row = sh.getRow(r);
+            if (row == null) continue;
+            String name = cellStr(row, nameCol);
+            if (name == null || name.trim().isEmpty()) continue;
+            String nt = name.trim().replaceAll("[\r\n]+", "");
+            if (nt.contains("椤圭洰鍚嶇О")) continue;
+            String flat = nt.replaceAll("\\s+", "");
+            if (flat.contains("鍚堣") || flat.contains("鎬昏") || flat.contains("灏忚")) continue;
+            if (nt.matches("^[涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+銆�.*")) continue;
+            if (nt.matches("^锛圼涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+锛�.*")) continue;
+            if (nt.startsWith("濉姤") || nt.startsWith("鍗曚綅璐熻矗浜�") || nt.matches("^\\d+銆�.*")) continue;
+            if (investmentCity(nt) != null) continue;
+            return r;
+        }
+        return -1;
     }
 
     /** 缁熻 sheet 鍐呴」鐩暟鎹鏁帮紙鐢ㄤ簬澶� sheet 鍘嗗彶鏂囦欢閫夊綋鏈� sheet锛� */
@@ -2596,9 +2770,9 @@
             String name = cellStr(row, nameCol);
             if (name == null || name.trim().isEmpty()) continue;
             String nt = name.trim().replaceAll("[\r\n]+", "");
-            if (nt.contains("鍚堣") || nt.contains("鎬昏")) continue;
+            String ntFlat = nt.replaceAll("\\s+", "");
+            if (ntFlat.contains("鍚堣") || ntFlat.contains("鎬昏") || ntFlat.contains("灏忚")) continue;
             if (nt.matches("^[涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+銆�.*")) continue;
-            if (nt.replace(" ", "").matches(".*灏廫\s*璁�.*")) continue;
             if (nt.startsWith("濉姤") || nt.startsWith("鍗曚綅璐熻矗浜�") || nt.matches("^\\d+銆�.*")) continue;
             if (!hasSeq) {
                 if (nt.length() > 4) count++;
@@ -2864,32 +3038,42 @@
             this.monthly = monthly;
         }
     }
-    /** 鎶曡祫绯荤粺瀵煎嚭瀵煎叆锛堝鏍告瘮瀵瑰熀鍑嗭級锛屽浐瀹�8鍒楋細琛屽彿/鍗曚綅/鏃舵湡/璁″垝鎬绘姇璧�/鑷紑濮嬬疮璁�/鏈勾璁″垝/鑷勾鍒濈疮璁�/褰撴湀瀹屾垚 */
-    private static final int[] INVEST_SYSTEM_HEADER_COLS = {0, 1, 2, 3, 4, 5, 6, 7};
-    private static final String[] INVEST_SYSTEM_HEADER_KEYWORDS =
-        {"琛屽彿", "鍗曚綅", "鏃舵湡", "璁″垝鎬绘姇璧�", "鑷紑濮嬪缓璁�", "鏈勾璁″垝鎶曡祫", "鑷勾鍒�", "褰撴湀瀹屾垚鎶曡祫"};
-
+    /** 鎶曡祫绯荤粺瀵煎嚭瀵煎叆锛堝鏍告瘮瀵瑰熀鍑嗭級銆�
+     *  鍒椾綅**鎸夎〃澶村叧閿瓧瀹氫綅**锛屽吋瀹逛袱绉嶆ā鏉匡細
+     *   - 鑰佹ā鏉裤�婃ā鏉縚鏌ヨ缁撴灉(鎶曡祫绯荤粺-瀹㈣繍+鐗╂祦 2026.7).xls銆嬶細琛屽彿/鍗曚綅/鏃舵湡/璁″垝鎬绘姇璧�/鑷紑濮嬪缓璁剧疮璁�/鏈勾璁″垝鎶曡祫/鑷勾鍒濈疮璁�/褰撴湀瀹屾垚鎶曡祫
+     *   - 鏂版ā鏉裤��2026骞碭鏈堟姇璧勭郴缁熼」鐩槑缁�.xls銆嬶紙鐢ㄦ埛 2026-09-21 鏇存崲锛夛細琛屽彿/鎶曡祫椤圭洰/鏃舵湡/椤圭洰鎵�澶勯樁娈�/璁″垝鎬绘姇璧�/鏈勾璁″垝鎶曡祫/鑷紑濮嬪缓璁捐嚦鏈勾锛堟湀锛夊簳-绱瀹屾垚鎶曡祫/褰撴湀瀹屾垚鎶曡祫
+     *  鏂版ā鏉�**娌℃湁銆岃嚜骞村垵绱銆嶅垪** 鈫� year_cum 鐣欑┖锛堝鏍告椂鎸夈�屽熀鍑嗙己澶便�嶈烦杩囷紝涓嶅啀褰撴垚 0 鍙備笌姣斿锛夈�� */
     public int importInvestmentSystem(MultipartFile file, String period) throws Exception {
         List<InvestmentSystem> list = new ArrayList<>();
         int failRows = 0;
         try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
             Sheet sheet = wb.getSheetAt(0);
-            requireHeaderKeyword(sheet, "鎶曡祫绯荤粺瀵煎嚭", "椤圭洰鍚嶇О", "璁″垝鎬绘姇璧�", "鍗曚綅");
-            requireHeaderLayout(sheet, "鎶曡祫绯荤粺瀵煎嚭", "妯℃澘_鏌ヨ缁撴灉(鎶曡祫绯荤粺-瀹㈣繍+鐗╂祦 2026.7).xls",
-                INVEST_SYSTEM_HEADER_COLS, INVEST_SYSTEM_HEADER_KEYWORDS);
+            requireHeaderKeyword(sheet, "鎶曡祫绯荤粺瀵煎嚭", "鎶曡祫椤圭洰", "椤圭洰鍚嶇О", "鍗曚綅", "璁″垝鎬绘姇璧�");
+            Row header = sheet.getRow(0);
+            int cName = findColByKeywords(header, "鎶曡祫椤圭洰", "椤圭洰鍚嶇О", "鍗曚綅");
+            int cTotal = findColByKeywords(header, "璁″垝鎬绘姇璧�");
+            int cYearPlan = findColByKeywords(header, "鏈勾璁″垝鎶曡祫");
+            int cStartCum = findColByKeywords(header, "鑷紑濮嬪缓璁�");
+            int cYearCum = findColByKeywords(header, "鑷勾鍒�");
+            int cMonthDone = findColByKeywords(header, "褰撴湀瀹屾垚鎶曡祫");
+            if (cName < 0 || cTotal < 0 || cYearPlan < 0 || cStartCum < 0 || cMonthDone < 0) {
+                throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨�愭姇璧勭郴缁熷鍑恒�戣〃澶村垪涓嶅畬鏁达細闇�瑕併�屾姇璧勯」鐩�(鎴栧崟浣�)銆佽鍒掓�绘姇璧勩�佹湰骞磋鍒掓姇璧勩��"
+                    + "鑷紑濮嬪缓璁锯�︾疮璁″畬鎴愭姇璧勩�佸綋鏈堝畬鎴愭姇璧勩�嶇瓑鍒楋紝瀹為檯琛ㄥご涓恒��" + headerText(header)
+                    + "銆嶃�傝浣跨敤绯荤粺妯℃澘銆�2026骞碭鏈堟姇璧勭郴缁熼」鐩槑缁嗐�嬫垨銆婃ā鏉縚鏌ヨ缁撴灉(鎶曡祫绯荤粺-瀹㈣繍+鐗╂祦)銆嬫暣鐞嗗悗鍐嶅鍏�");
+            }
             for (int r = 1; r <= sheet.getLastRowNum(); r++) {
                 Row row = sheet.getRow(r);
                 if (row == null) continue;
-                String name = getString(row, 1);
+                String name = getString(row, cName);
                 if (name == null || name.trim().isEmpty()) continue;
                 InvestmentSystem sys = new InvestmentSystem();
                 sys.setReportPeriod(period);
                 sys.setProjectName(name.trim());
-                sys.setTotalInvestment(getDecimal(row, 3));
-                sys.setStartCum(getDecimal(row, 4));
-                sys.setYearPlan(getDecimal(row, 5));
-                sys.setYearCum(getDecimal(row, 6));
-                sys.setMonthDone(getDecimal(row, 7));
+                sys.setTotalInvestment(getDecimal(row, cTotal));
+                sys.setStartCum(getDecimal(row, cStartCum));
+                sys.setYearPlan(getDecimal(row, cYearPlan));
+                sys.setYearCum(cYearCum < 0 ? null : getDecimal(row, cYearCum));
+                sys.setMonthDone(getDecimal(row, cMonthDone));
                 list.add(sys);
             }
         } catch (Exception e) {
@@ -2924,59 +3108,59 @@
         List<CityBusRow> rows = new ArrayList<>();
         try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
             Sheet sheet = wb.getSheetAt(0);
-            requireHeaderLayout(sheet, "鍩庡競鍏氦", "妯℃澘_浜や紒缁烾203琛╛鍩庡競鍏叡浜ら�氭湀搴﹁繍钀ユ儏鍐碉紙2026骞�7鏈堬級.xls",
-                CITY_BUS_HEADER_COLS, CITY_BUS_HEADER_KEYWORDS);
+            Row hdr = sheet.getRow(0);
+            requireHeaderColsByName(sheet, "鍩庡競鍏氦", "妯℃澘_浜や紒缁烾203琛╛鍩庡競鍏叡浜ら�氭湀搴﹁繍钀ユ儏鍐碉紙2026骞�7鏈堬級.xls", CITY_BUS_HEADER_KEYWORDS);
             for (int r = 1; r <= sheet.getLastRowNum(); r++) {
                 Row row = sheet.getRow(r);
                 if (row == null) continue;
-                String name = getString(row, 2);
+                String name = getString(row, colByName(hdr, 2, "浼佷笟鍚嶇О"));
                 if (name == null || name.trim().isEmpty()) continue;
                 CityBusMonthly item = new CityBusMonthly();
                 item.setReportPeriod(period);
-                item.setRegionCode(getString(row, 0));
-                item.setCity(RegionUtil.cityByCode(getString(row, 0)));
-                item.setEnterpriseCode(getString(row, 1));
+                item.setRegionCode(getString(row, colByName(hdr, 0, "鎵�灞炲湴鍖�")));
+                item.setCity(RegionUtil.cityByCode(getString(row, colByName(hdr, 0, "鎵�灞炲湴鍖�"))));
+                item.setEnterpriseCode(getString(row, colByName(hdr, 1, "浼佷笟浠g爜")));
                 item.setEnterpriseName(name.trim());
-                item.setOpVehicles(getDecimal(row, 5));
-                item.setStopTotal(getDecimal(row, 6));
-                item.setStopCity(getDecimal(row, 7));
-                item.setPassengerVolume(getDecimal(row, 8));
-                item.setPassengerCity(getDecimal(row, 9));
-                item.setTurnover(getDecimal(row, 10));
-                item.setTurnoverCity(getDecimal(row, 11));
-                item.setRailPassengerVolume(getDecimal(row, 13));
-                item.setRailTurnover(getDecimal(row, 14));
-                item.setFerryPassengerVolume(getDecimal(row, 17));
-                item.setFerryTurnover(getDecimal(row, 18));
-                item.setAvgDistance(getDecimal(row, 19));
-                item.setAvgDistanceCity(getDecimal(row, 20));
-                item.setContactPerson(getString(row, 24));
-                item.setContactPhone(getString(row, 25));
-                item.setReportDate(getDateString(row, 26));
-                item.setRateOpVehiclesMom(getDecimal(row, 29));
-                item.setRatePassengerMom(getDecimal(row, 30));
-                item.setRatePassengerCityMom(getDecimal(row, 31));
-                item.setRateChengxiangMom(getDecimal(row, 32));
-                item.setRateChengxiangTurnoverMom(getDecimal(row, 33));
-                item.setAvgDistanceMomChange(getDecimal(row, 34));
-                item.setAvgDistanceCityMomChange(getDecimal(row, 35));
-                item.setDailyPassengerPerVehicle(getDecimal(row, 36));
-                item.setRateOpVehiclesYoy(getDecimal(row, 39));
-                item.setRatePassengerYoy(getDecimal(row, 40));
-                item.setRatePassengerCityYoy(getDecimal(row, 41));
-                item.setRateChengxiangYoy(getDecimal(row, 42));
-                item.setRateChengxiangTurnoverYoy(getDecimal(row, 43));
-                item.setStopCityRatio(getDecimal(row, 44));
-                item.setPassengerCityRatio(getDecimal(row, 45));
-                item.setChengxiangRatio(getDecimal(row, 46));
-                item.setRateTurnoverYoy(getDecimal(row, 47));
-                item.setRateTurnoverMom(getDecimal(row, 48));
-                item.setPassengerChengxiang(getDecimal(row, 49));
-                item.setTurnoverChengxiang(getDecimal(row, 50));
-                item.setAvgDistanceChengxiang(getDecimal(row, 51));
-                item.setVerifyExplanation(getString(row, 65));
-                item.setReportNote(getString(row, 66));
-                item.setModifyRecord(getString(row, 67));
+                item.setOpVehicles(getDecimal(row, colByName(hdr, 5, "鍏叡姹界數杞杩愯惀杞︽暟")));
+                item.setStopTotal(getDecimal(row, colByName(hdr, 6, "杩愯惀绔欑偣鎬讳釜鏁�")));
+                item.setStopCity(getDecimal(row, colByName(hdr, 7, "鍏朵腑锛氬煄甯傚唴")));
+                item.setPassengerVolume(getDecimal(row, colByName(hdr, 8, "鍏叡姹界數杞瀹㈣繍閲�")));
+                item.setPassengerCity(getDecimal(row, colByName(hdr, 9, "鍏朵腑锛氬煄甯傚唴", 2)));
+                item.setTurnover(getDecimal(row, colByName(hdr, 10, "鏂板鍏叡姹界數杞︽梾瀹㈠懆杞噺")));
+                item.setTurnoverCity(getDecimal(row, colByName(hdr, 11, "鏂板鍏叡姹界數杞︽梾瀹㈠懆杞噺_鍏朵腑鍩庡競鍐�")));
+                item.setRailPassengerVolume(getDecimal(row, colByName(hdr, 13, "杞ㄩ亾浜ら�歘瀹㈣繍閲�")));
+                item.setRailTurnover(getDecimal(row, colByName(hdr, 14, "杞ㄩ亾浜ら�歘鏃呭鍛ㄨ浆閲�")));
+                item.setFerryPassengerVolume(getDecimal(row, colByName(hdr, 17, "鍩庡競瀹㈣繍杞浮_瀹㈣繍閲�")));
+                item.setFerryTurnover(getDecimal(row, colByName(hdr, 18, "鍩庡競瀹㈣繍杞浮鏃呭鍛ㄨ浆閲�")));
+                item.setAvgDistance(getDecimal(row, colByName(hdr, 19, "鍏叡姹界數杞﹀钩鍧囪繍璺�")));
+                item.setAvgDistanceCity(getDecimal(row, colByName(hdr, 20, "鍏叡姹界數杞﹀煄甯傚唴骞冲潎杩愯窛")));
+                item.setContactPerson(getString(row, colByName(hdr, 24, "濉〃浜�")));
+                item.setContactPhone(getString(row, colByName(hdr, 25, "鑱旂郴鐢佃瘽")));
+                item.setReportDate(getDateString(row, colByName(hdr, 26, "鎶ュ嚭鏃ユ湡")));
+                item.setRateOpVehiclesMom(getDecimal(row, colByName(hdr, 29, "鍏叡姹界數杞杩愯惀杞︽暟鐜瘮澧為��")));
+                item.setRatePassengerMom(getDecimal(row, colByName(hdr, 30, "鍏叡姹界數杞瀹㈣繍閲忕幆姣斿閫�")));
+                item.setRatePassengerCityMom(getDecimal(row, colByName(hdr, 31, "鍩庡競鍐呭杩愰噺鐜瘮")));
+                item.setRateChengxiangMom(getDecimal(row, colByName(hdr, 32, "鍩庨檯鍩庝埂瀹㈣繍閲忕幆姣斿閫�")));
+                item.setRateChengxiangTurnoverMom(getDecimal(row, colByName(hdr, 33, "鍩庨檯鍩庝埂鏃呭鍛ㄨ浆閲忕幆姣斿閫�")));
+                item.setAvgDistanceMomChange(getDecimal(row, colByName(hdr, 34, "骞冲潎杩愯窛鐜瘮澧炲噺锛堝叕閲岋級")));
+                item.setAvgDistanceCityMomChange(getDecimal(row, colByName(hdr, 35, "骞冲潎杩愯窛_鍩庡競鍐呯幆姣斿鍑忥紙鍏噷锛�")));
+                item.setDailyPassengerPerVehicle(getDecimal(row, colByName(hdr, 36, "鍏叡姹界數杞鍗曡溅鏃ュ潎瀹㈣繍閲�")));
+                item.setRateOpVehiclesYoy(getDecimal(row, colByName(hdr, 39, "鍏叡姹界數杞杩愯惀杞︽暟鍚屾瘮澧為��")));
+                item.setRatePassengerYoy(getDecimal(row, colByName(hdr, 40, "鍏叡姹界數杞瀹㈣繍閲忓悓姣斿閫�")));
+                item.setRatePassengerCityYoy(getDecimal(row, colByName(hdr, 41, "瀹㈣繍閲廮鍩庡競鍐呭悓姣斿閫�")));
+                item.setRateChengxiangYoy(getDecimal(row, colByName(hdr, 42, "鍩庨檯鍩庝埂瀹㈣繍閲忓悓姣斿閫�")));
+                item.setRateChengxiangTurnoverYoy(getDecimal(row, colByName(hdr, 43, "鍩庨檯鍩庝埂鏃呭鍛ㄨ浆閲忓悓姣斿閫�")));
+                item.setStopCityRatio(getDecimal(row, colByName(hdr, 44, "鍩庡競鍐呰繍钀ョ珯鐐瑰崰姣�")));
+                item.setPassengerCityRatio(getDecimal(row, colByName(hdr, 45, "鍩庡競鍐呭杩愰噺鍗犳瘮")));
+                item.setChengxiangRatio(getDecimal(row, colByName(hdr, 46, "鍩庨檯鍩庝埂瀹㈣繍閲忓崰姣�")));
+                item.setRateTurnoverYoy(getDecimal(row, colByName(hdr, 47, "鏃呭鍛ㄨ浆閲忓悓姣斿閫�")));
+                item.setRateTurnoverMom(getDecimal(row, colByName(hdr, 48, "鏃呭鍛ㄨ浆閲忕幆姣斿閫�")));
+                item.setPassengerChengxiang(getDecimal(row, colByName(hdr, 49, "鍩庨檯鍩庝埂瀹㈣繍閲�")));
+                item.setTurnoverChengxiang(getDecimal(row, colByName(hdr, 50, "鍩庨檯鍩庝埂鏃呭鍛ㄨ浆閲�")));
+                item.setAvgDistanceChengxiang(getDecimal(row, colByName(hdr, 51, "鍩庨檯鍩庝埂骞冲潎杩愯窛")));
+                item.setVerifyExplanation(getString(row, colByName(hdr, 65, "鏍稿疄鎬у師鍥犺В閲�")));
+                item.setReportNote(getString(row, colByName(hdr, 66, "涓婃姤璇存槑")));
+                item.setModifyRecord(getString(row, colByName(hdr, 67, "淇敼璁板綍")));
                 rows.add(new CityBusRow(r + 1, item));
             }
         } catch (Exception e) {
@@ -3039,52 +3223,52 @@
         List<TaxiRow> rows = new ArrayList<>();
         try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
             Sheet sheet = wb.getSheetAt(0);
-            requireHeaderLayout(sheet, "宸℃父鍑虹", "妯℃澘_浜よ缁烾402琛�-宸℃父鍑虹姹借溅杩愯惀鏈嶅姟鎯呭喌鏈堟姤(2026).xls",
-                CITY_TAXI_HEADER_COLS, CITY_TAXI_HEADER_KEYWORDS);
+            Row hdr = sheet.getRow(0);
+            requireHeaderColsByName(sheet, "宸℃父鍑虹", "妯℃澘_浜よ缁烾402琛�-宸℃父鍑虹姹借溅杩愯惀鏈嶅姟鎯呭喌鏈堟姤(2026).xls", CITY_TAXI_HEADER_KEYWORDS);
             for (int r = 1; r <= sheet.getLastRowNum(); r++) {
                 Row row = sheet.getRow(r);
                 if (row == null) continue;
-                String name = getString(row, 2);
+                String name = getString(row, colByName(hdr, 2, "浼佷笟鍚嶇О"));
                 if (name == null || name.trim().isEmpty()) continue;
                 CityTaxiMonthly item = new CityTaxiMonthly();
                 item.setReportPeriod(period);
-                item.setRegionCode(getString(row, 0));
-                item.setCity(cityOf(getString(row, 0), name));
-                item.setTripTotal(getDecimal(row, 4));
-                item.setTripCity(getDecimal(row, 5));
-                item.setPassengerVolume(getDecimal(row, 6));
-                item.setPassengerCity(getDecimal(row, 7));
-                item.setTurnover(getDecimal(row, 8));
-                item.setTurnoverCity(getDecimal(row, 9));
-                item.setOpVehicles(getDecimal(row, 10));
-                item.setAvgDistance(getDecimal(row, 11));
-                item.setAvgDistanceCity(getDecimal(row, 12));
-                item.setContactPerson(getString(row, 15));
-                item.setContactPhone(getString(row, 16));
-                item.setReportDate(getDateString(row, 17));
-                item.setDailyTripsPerVehicle(getDecimal(row, 18));
-                item.setDailyPassengerPerVehicle(getDecimal(row, 19));
-                item.setPassengersPerTrip(getDecimal(row, 20));
-                item.setRateOpVehiclesMom(getDecimal(row, 21));
-                item.setRateOpVehiclesYoy(getDecimal(row, 22));
-                item.setRateTripMom(getDecimal(row, 23));
-                item.setRateTripYoy(getDecimal(row, 24));
-                item.setRatePassengerMom(getDecimal(row, 25));
-                item.setRatePassengerYoy(getDecimal(row, 26));
-                item.setAvgDistanceMomChange(getDecimal(row, 27));
-                item.setPassengersPerTripCity(getDecimal(row, 28));
-                item.setRateTripCityMom(getDecimal(row, 29));
-                item.setRatePassengerCityMom(getDecimal(row, 30));
-                item.setAvgDistanceCityMomChange(getDecimal(row, 31));
-                item.setTripCityRatio(getDecimal(row, 32));
-                item.setPassengerCityRatio(getDecimal(row, 33));
-                item.setPassengersPerTripChengxiang(getDecimal(row, 34));
-                item.setRateTripChengxiangMom(getDecimal(row, 35));
-                item.setRatePassengerChengxiangMom(getDecimal(row, 36));
-                item.setAvgDistanceChengxiang(getDecimal(row, 37));
-                item.setVerifyExplanation(getString(row, 38));
-                item.setReportNote(getString(row, 39));
-                item.setModifyRecord(getString(row, 40));
+                item.setRegionCode(getString(row, colByName(hdr, 0, "鎵�灞炲湴鍖�")));
+                item.setCity(cityOf(getString(row, colByName(hdr, 0, "鎵�灞炲湴鍖�")), name));
+                item.setTripTotal(getDecimal(row, colByName(hdr, 4, "杞藉杞︽鎬绘暟")));
+                item.setTripCity(getDecimal(row, colByName(hdr, 5, "杞藉杞︽鎬绘暟_鍩庡競鍐�")));
+                item.setPassengerVolume(getDecimal(row, colByName(hdr, 6, "瀹㈣繍閲�")));
+                item.setPassengerCity(getDecimal(row, colByName(hdr, 7, "瀹㈣繍閲廮鍏朵腑鍩庡競鍐�")));
+                item.setTurnover(getDecimal(row, colByName(hdr, 8, "鏃呭鍛ㄨ浆閲�")));
+                item.setTurnoverCity(getDecimal(row, colByName(hdr, 9, "鏃呭鍛ㄨ浆閲廮鍩庡競鍐�")));
+                item.setOpVehicles(getDecimal(row, colByName(hdr, 10, "杩愯惀杞﹁締鏁�")));
+                item.setAvgDistance(getDecimal(row, colByName(hdr, 11, "宸℃父鍑虹姹借溅骞冲潎杩愯窛")));
+                item.setAvgDistanceCity(getDecimal(row, colByName(hdr, 12, "鍩庡競鍐呭钩鍧囪繍璺�")));
+                item.setContactPerson(getString(row, colByName(hdr, 15, "濉〃浜�")));
+                item.setContactPhone(getString(row, colByName(hdr, 16, "鑱旂郴鐢佃瘽")));
+                item.setReportDate(getDateString(row, colByName(hdr, 17, "鎶ュ嚭鏃ユ湡")));
+                item.setDailyTripsPerVehicle(getDecimal(row, colByName(hdr, 18, "鍗曡溅鏃ュ潎杞藉杞︽")));
+                item.setDailyPassengerPerVehicle(getDecimal(row, colByName(hdr, 19, "鍗曡溅鏃ュ潎瀹㈣繍閲�")));
+                item.setPassengersPerTrip(getDecimal(row, colByName(hdr, 20, "鍗曡溅娆¤浇瀹汉鏁�")));
+                item.setRateOpVehiclesMom(getDecimal(row, colByName(hdr, 21, "杩愯惀杞︽暟鐜瘮澧為��")));
+                item.setRateOpVehiclesYoy(getDecimal(row, colByName(hdr, 22, "杩愯惀杞︽暟鍚屾瘮澧為��")));
+                item.setRateTripMom(getDecimal(row, colByName(hdr, 23, "杞藉杞︽鎬绘暟鐜瘮澧為��")));
+                item.setRateTripYoy(getDecimal(row, colByName(hdr, 24, "杞藉杞︽鍚屾瘮澧為��")));
+                item.setRatePassengerMom(getDecimal(row, colByName(hdr, 25, "瀹㈣繍閲忕幆姣斿閫�")));
+                item.setRatePassengerYoy(getDecimal(row, colByName(hdr, 26, "瀹㈣繍閲忓悓姣斿閫�")));
+                item.setAvgDistanceMomChange(getDecimal(row, colByName(hdr, 27, "骞冲潎杩愯窛鐜瘮澧炲噺")));
+                item.setPassengersPerTripCity(getDecimal(row, colByName(hdr, 28, "鍗曡溅娆¤浇瀹汉鏁癬鍩庡競鍐�")));
+                item.setRateTripCityMom(getDecimal(row, colByName(hdr, 29, "杞藉杞︽鎬绘暟鐜瘮澧為�焈鍩庡競鍐�")));
+                item.setRatePassengerCityMom(getDecimal(row, colByName(hdr, 30, "瀹㈣繍閲忕幆姣斿閫焈鍩庡競鍐�")));
+                item.setAvgDistanceCityMomChange(getDecimal(row, colByName(hdr, 31, "骞冲潎杩愯窛_鍩庡競鍐呯幆姣斿鍑�")));
+                item.setTripCityRatio(getDecimal(row, colByName(hdr, 32, "杞藉杞︽鎬绘暟_鍩庡競鍐呭崰姣�")));
+                item.setPassengerCityRatio(getDecimal(row, colByName(hdr, 33, "瀹㈣繍閲廮鍩庡競鍐呭崰姣�")));
+                item.setPassengersPerTripChengxiang(getDecimal(row, colByName(hdr, 34, "鍗曡溅娆¤浇瀹汉鏁癬鍩庨檯鍩庝埂")));
+                item.setRateTripChengxiangMom(getDecimal(row, colByName(hdr, 35, "杞藉杞︽鎬绘暟_鍩庨檯鍩庝埂鐜瘮澧為��")));
+                item.setRatePassengerChengxiangMom(getDecimal(row, colByName(hdr, 36, "瀹㈣繍閲廮鍩庨檯鍩庝埂鐜瘮澧為��")));
+                item.setAvgDistanceChengxiang(getDecimal(row, colByName(hdr, 37, "骞冲潎杩愯窛_鍩庨檯鍩庝埂")));
+                item.setVerifyExplanation(getString(row, colByName(hdr, 38, "鏍稿疄鎬у師鍥犺В閲�")));
+                item.setReportNote(getString(row, colByName(hdr, 39, "涓婃姤璇存槑")));
+                item.setModifyRecord(getString(row, colByName(hdr, 40, "淇敼璁板綍")));
                 rows.add(new TaxiRow(r + 1, item));
             }
         } catch (Exception e) {

--
Gitblit v1.9.1