From 64f64662b602e107038773d589fcee437cb2838c Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期一, 12 十月 2026 14:05:50 +0800
Subject: [PATCH] fix(汇总大表): 城市分市州当月标题行号差一行(45/67→44/66)并恢复被覆盖的单位行 待验收

---
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java |   38 ++++++++++++++++++++++++++++++++++----
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java
index 2f98afa..20c94ff 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/layout/SummaryLayoutExpander.java
@@ -208,8 +208,8 @@
             if (headerRows.contains(r)) continue;
             Row row = sh.getRow(r);
             if (row == null) continue;
-            cloneDataCell(row, srcVal, insertCol, shiftable, insertCol);
-            cloneDataCell(row, srcYoy, insertCol + 1, shiftable, insertCol);
+            cloneDataCell(row, srcVal, insertCol, shiftable);
+            cloneYoyCell(row, srcYoy, insertCol + 1, insertCol, lastYearSameMonth + 2);
         }
         // 5) 绱鍒楄ˉ褰撴湀椤癸紱绱鍚屾瘮鍒嗘瘝琛ュ幓骞村悓鏈堝垪
         int cumCol = insertCol + 2, cumYoyCol = insertCol + 3;
@@ -348,17 +348,47 @@
         }
     }
 
-    private void cloneDataCell(Row row, int srcCol, int dstCol, Set<String> shiftable, int insertCol) {
+    private void cloneDataCell(Row row, int srcCol, int dstCol, Set<String> shiftable) {
         Cell s = row.getCell(srcCol);
         if (s == null) return;
         Cell d = getOrCreate(row, dstCol);
         d.setBlank();
         d.setCellStyle(s.getCellStyle());
         if (s.getCellType() == CellType.FORMULA) {
-            d.setCellFormula(shiftRefs(s.getCellFormula(), insertCol, shiftable));
+            d.setCellFormula(shiftRefsAll(s.getCellFormula(), shiftable));
         }
     }
 
+    /** 褰撴湀鍚屾瘮鍒楋細涓嶅厠闅嗕笂鏈堝叕寮忥紝鐩存帴鎸夈�屾湰鏈堝�� / 鍘诲勾鍚屾湀 鈭� 1銆嶉噸鍐欙紙鍘诲勾鍚屾湀鍒楀凡鎸夎〃澶村畾浣嶏級 */
+    private void cloneYoyCell(Row row, int srcCol, int dstCol, int valCol0, int denCol0) {
+        Cell s = row.getCell(srcCol);
+        if (s == null) return;
+        Cell d = getOrCreate(row, dstCol);
+        d.setBlank();
+        d.setCellStyle(s.getCellStyle());
+        if (s.getCellType() == CellType.FORMULA) {
+            int excelRow = row.getRowNum() + 1;
+            d.setCellFormula(colLetter(valCol0) + excelRow + "/" + colLetter(denCol0) + excelRow + "-1");
+        }
+    }
+
+    /** 鐩稿澶嶅埗鐢ㄧ殑骞崇Щ锛氭妸鏈〉/宸叉墿鍒楅〉鐨勫紩鐢ㄦ暣浣� +2锛堜笉鍋氬垪鍙烽槇鍊煎垽鏂級 */
+    private String shiftRefsAll(String formula, Set<String> shiftable) {
+        Matcher m = REF.matcher(formula);
+        StringBuffer sb = new StringBuffer();
+        while (m.find()) {
+            String sheet = m.group(2) != null ? m.group(2) : m.group(3);
+            if ((sheet != null && !shiftable.contains(sheet)) || isFunctionName(formula, m)) {
+                m.appendReplacement(sb, Matcher.quoteReplacement(m.group(0)));
+                continue;
+            }
+            int colIdx = colIndex(m.group(5));
+            m.appendReplacement(sb, Matcher.quoteReplacement(rebuild(m, sheet, colIdx + 2)));
+        }
+        m.appendTail(sb);
+        return sb.toString();
+    }
+
     private void shiftAllRefs(Sheet sh, int insertCol, Set<String> shiftable) {
         for (int r = 0; r <= sh.getLastRowNum(); r++) {
             Row row = sh.getRow(r);

--
Gitblit v1.9.1