| | |
| | | return insertCol; |
| | | } |
| | | |
| | | /** 表头行(0 基):含「年+月」表头单元格的行;轨道、轮渡有两个块 → 两行。 */ |
| | | /** |
| | | * 表头行(0 基):轨道、轮渡这类一页两个块的有两行。 |
| | | * |
| | | * <p>2026-10-12 二次修正:先取「月份表头格最多的那一行」作基准,把它的月份列当作标准列, |
| | | * 只有这些列上大半是月份格的行才算表头行。前版只要求「整行 ≥2 个月份格」, |
| | | * 会把数据行里恰好落成日期序列的数值当成表头 → 扩列时把月份日期写进数据行 |
| | | * (2026-09 母版 ` 货运!S11`、`出租!S6` 等 13 格被写成 46266)。 |
| | | */ |
| | | private List<Integer> headerRowsOf(Sheet sh) { |
| | | List<Integer> rows = new ArrayList<>(); |
| | | int lastRow = Math.min(sh.getLastRowNum(), sh.getFirstRowNum() + HEADER_SCAN_ROWS); |
| | | for (int r = sh.getFirstRowNum(); r <= lastRow; r++) { |
| | | int first = sh.getFirstRowNum(); |
| | | int lastRow = Math.min(sh.getLastRowNum(), first + HEADER_SCAN_ROWS); |
| | | List<Integer> base = new ArrayList<>(); |
| | | for (int r = first; r <= lastRow; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | for (int c = row.getFirstCellNum(); c >= 0 && c < row.getLastCellNum(); c++) { |
| | | if (yearMonthOf(row.getCell(c)) != null) { |
| | | rows.add(r); |
| | | break; |
| | | List<Integer> cols = monthColsOf(row); |
| | | if (cols.size() > base.size()) base = cols; |
| | | } |
| | | List<Integer> rows = new ArrayList<>(); |
| | | if (base.size() < 2) return rows; |
| | | int need = Math.max(2, (base.size() + 1) / 2); |
| | | for (int r = first; r <= lastRow; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | int hit = 0; |
| | | for (int c : base) { |
| | | if (yearMonthOf(row.getCell(c)) != null) hit++; |
| | | } |
| | | if (hit >= need) rows.add(r); |
| | | } |
| | | return rows; |
| | | } |
| | | |
| | | /** 行内所有「年+月」表头格的列号(0 基) */ |
| | | private List<Integer> monthColsOf(Row row) { |
| | | List<Integer> cols = new ArrayList<>(); |
| | | for (int c = row.getFirstCellNum(); c >= 0 && c < row.getLastCellNum(); c++) { |
| | | if (yearMonthOf(row.getCell(c)) != null) cols.add(c); |
| | | } |
| | | return cols; |
| | | } |
| | | |
| | | private Map<Integer, Integer> monthCols(Sheet sh, int year) { |
| | | Map<Integer, Integer> cols = new LinkedHashMap<>(); |
| | | int lastRow = Math.min(sh.getLastRowNum(), sh.getFirstRowNum() + HEADER_SCAN_ROWS); |