From b14fec1599277629e10b2bc686f02fd0c2e0bec1 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 18 九月 2026 16:46:30 +0800
Subject: [PATCH] fix(货运月报): 订正持续在规企业累计运距同比基期口径(v2)

---
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java |  198 +++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 164 insertions(+), 34 deletions(-)

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 46ae09f..a0a48f7 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
@@ -13,6 +13,7 @@
 import com.trafficaudit.dataimport.entity.PassengerEnterpriseMonthly;
 import com.trafficaudit.dataimport.entity.PassengerIndividualMonthly;
 import com.trafficaudit.dataimport.entity.ScaleSplitTransport;
+import com.trafficaudit.dataimport.entity.WycOrderMonthly;
 import com.trafficaudit.auditengine.entity.AuditResult;
 import com.trafficaudit.auditengine.entity.AuditRun;
 import com.trafficaudit.auditengine.mapper.AuditResultMapper;
@@ -29,9 +30,11 @@
 import com.trafficaudit.dataimport.mapper.PassengerEnterpriseMonthlyMapper;
 import com.trafficaudit.dataimport.mapper.PassengerIndividualMonthlyMapper;
 import com.trafficaudit.dataimport.mapper.ScaleSplitTransportMapper;
+import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper;
 import com.trafficaudit.reportexport.calc.MidCalc;
 import com.trafficaudit.reportexport.calc.PaxCalc;
 import com.trafficaudit.reportexport.calc.SummaryWorkbookFiller;
+import com.trafficaudit.reportexport.calc.WycSplitCalc;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
@@ -98,6 +101,10 @@
     private CityTaxiMonthlyMapper cityTaxiMapper;
     @Resource
     private SummaryWorkbookFiller summaryWorkbookFiller;
+    @Resource
+    private WycSplitCalc wycSplitCalc;
+    @Resource
+    private WycOrderMonthlyMapper wycOrderMapper;
     @Resource
     private AuditResultMapper auditResultMapper;
     @Resource
@@ -1179,17 +1186,16 @@
         return lv == 0.0 ? null : (v - lv) / lv;
     }
 
-    /** 涓彛寰勬湀鍚屾瘮锛歬=-1 琛ㄧず鎬昏锛堢彮绾�+鍏氦涔嬪拰锛屽嚭绉�/缃戠害杞︽棤婧愭暟鎹寜 0锛夛紱鏃犲幓骞存暟鎹暀绌� */
+    /** 涓彛寰勬湀鍚屾瘮锛歬=-1 琛ㄧず鎬昏锛堢彮绾�+鍏氦+鍑虹鍩庝埂+缃戠害杞﹀煄涔� 鍥涢」涔嬪拰锛夛紱鏃犲幓骞存暟鎹暀绌� */
     private void fillMidYoyCell(Cell c, Map<Integer, Map<String, double[][]>> mid, int year, int month,
                                 String area, int k, boolean volume) {
         double v = 0.0, lv = 0.0;
         if (k == -1) {
             for (int kk = 1; kk <= 4; kk++) {
-                if (kk >= 3) continue;
                 v += midClassVal(mid, year, month, area, kk, volume);
                 lv += midClassVal(mid, year - 1, month, area, kk, volume);
             }
-        } else if (k <= 2) {
+        } else {
             v = midClassVal(mid, year, month, area, k, volume);
             lv = midClassVal(mid, year - 1, month, area, k, volume);
         }
@@ -1197,7 +1203,7 @@
         if (v != 0.0 && lv != 0.0) c.setCellValue(round((v - lv) / lv, 4));
     }
 
-    /** 涓彛寰勭疮璁″悓姣斿垪锛�1..months 鏈堢疮璁★紱k=-1 鎬昏 = 鐝嚎+鍏氦锛� */
+    /** 涓彛寰勭疮璁″悓姣斿垪锛�1..months 鏈堢疮璁★紱鍥涚淮榻愬叏锛� */
     private void fillMidCumYoyColumn(Sheet sheet, Map<Integer, Map<String, double[][]>> mid, int year,
                                      int months, int colIdx) {
         List<String> areas = midTemplateAreas();
@@ -1217,7 +1223,7 @@
             String area = areas.get(blockOffset / 5);
             double v = 0.0, lv = 0.0;
             for (int m = 1; m <= months; m++) {
-                if (k <= 2) {
+                {
                     v += midClassVal(mid, year, m, area, k, volume);
                     lv += midClassVal(mid, year - 1, m, area, k, volume);
                 }
@@ -2181,20 +2187,15 @@
             boolean extended = fillMonths > 6;
             if (extended) extendMonthlyColumns(sheet, 2, currentYear, 4, sheet.getLastRowNum());
             List<String> areas = midTemplateAreas();
+            // 2026-09-18锛氭敼涓恒�屾寜鍗曞厓鏍肩被鍨嬫棤鍏炽�嶉亶鍘嗏�斺�旀墿鍒楋紙7~12 鏈堬級鍑烘潵鐨勫�煎垪鍦ㄦā鏉块噷鏄┖鏍硷紝
+            // 鏃у疄鐜板彧澶勭悊 CellType.FORMULA 鐨勬牸锛屽鑷� 7 鏈堝強浠ュ悗鏈堜唤姘歌繙濉笉涓婏紙8 鏈堟暣鍒� 0銆佺疮璁″彧鍒� 6 鏈堬級銆�
             for (Row row : sheet) {
                 if (row == null) continue;
-                for (Cell c : row) {
-                    if (c.getCellType() != CellType.FORMULA) continue;
-                    String f = c.getCellFormula();
-                    if (f == null) continue;
-                    boolean crossBook = f.contains("[");
-                    if (!crossBook && !isYoyMonthCol(c.getColumnIndex() + 1)) continue; // 鍐呴儴鍏紡锛堝悎璁�/绱锛変繚鐣欓噸绠楋紱鍚屾瘮鍒� #REF! 瑕嗗啓涓烘暟鍊�
-                    if (crossBook && !is2026MonthCol(c.getColumnIndex() + 1)) {
-                        keepCached(c); // 2025 骞村垪淇濈暀妯℃澘缂撳瓨鍊�
-                        continue;
-                    }
+                for (int c0 = 0; c0 < Math.max(row.getLastCellNum(), 0); c0++) {
+                    Cell c = row.getCell(c0);
+                    if (c == null) continue;
                     int r = c.getRowIndex() + 1;
-                    int col = c.getColumnIndex() + 1;
+                    int col = c0 + 1;
                     int blockOffset = -1;
                     boolean volume = false;
                     if (r >= 5 && r <= 94) {
@@ -2205,33 +2206,65 @@
                         volume = false;
                     }
                     if (blockOffset < 0) {
-                        keepCached(c); // r1/r2 澶囨敞绛�
+                        if (c.getCellType() == CellType.FORMULA) keepCached(c); // r1/r2 澶囨敞銆侀〉澶栬法绨垮紩鐢ㄧ瓑
                         continue;
                     }
-                    if (blockOffset % 5 == 0) {
-                        if (isYoyMonthCol(col)) {
-                            fillMidYoyCell(c, mid, currentYear, monthOfCol(col), areas.get(blockOffset / 5), -1, volume);
-                        } else {
-                            keepCached(c); // 鎬昏鍐呴儴鍏紡锛堥槻寰★級
+                    boolean isVal = is2026MonthCol(col);
+                    boolean isYoy = isYoyMonthCol(col);
+                    if (!isVal && !isYoy) {
+                        // 2025 骞村垪绛夛細璺ㄧ翱鍏紡鍙栫紦瀛樺�兼柇閾撅紱鍐呴儴鍏紡锛堝悎璁�/绱锛変繚鐣欙紝绋嶅悗 recalc 閲嶇畻
+                        if (c.getCellType() == CellType.FORMULA) {
+                            String f = c.getCellFormula();
+                            if (f != null && f.contains("[")) keepCached(c);
                         }
                         continue;
                     }
-                    int k = blockOffset % 5; // 1=鐝嚎 2=鍏氦 3=鍑虹 4=缃戠害杞�
                     String area = areas.get(blockOffset / 5);
-                    if (is2026MonthCol(col)) {
+                    if (blockOffset % 5 == 0) {
+                        if (isYoy) {
+                            fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, -1, volume);
+                        }
+                        // 鎬昏鍊煎垪锛氫竴寰嬩繚鐣欐ā鏉垮叕寮忥紙1~6 鏈堝師鍏紡 + 鎵╁垪鍏嬮殕鍑烘潵鐨勫叕寮忥級锛�
+                        // 鐢辩敓鎴愭敹灏剧殑 recalcWorkbookFormulas 姹傚�煎啓鍥炵紦瀛樸�傛棭鏈熺増鏈繖閲� keepCached
+                        // 浼氭妸鍒氬厠闅嗗嚭鏉ョ殑鍏紡娓呮垚绌烘牸锛屽鑷� 7 鏈堝強浠ュ悗鎬昏姘歌繙绌虹櫧銆�
+                        continue;
+                    }
+                    int k = blockOffset % 5; // 1=鐝嚎 2=鍏氦 3=鍑虹鍩庝埂 4=缃戠害杞﹀煄涔�
+                    if (isVal) {
                         fillMidCell(c, mid, currentYear, monthOfCol(col), area, k, volume);
-                    } else if (isYoyMonthCol(col)) {
-                        fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, k, volume);
                     } else {
-                        keepCached(c); // 2025 骞村垪淇濈暀妯℃澘缂撳瓨鍊�
+                        fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, k, volume);
                     }
                 }
             }
             // 绱鍚屾瘮鍒楋紙妯℃澘 #REF! 鈫� 搴撳唴鍘诲勾 1..N 鏈堢疮璁″悓姣旀暟鍊硷級
             fillMidCumYoyColumn(sheet, mid, currentYear, fillMonths, extended ? 27 : 15);
-            recalc(wb);
+            // evaluateAll 浼氬湪璺ㄧ翱鍏紡锛圫heet2 鐨� [1]xx!A1锛夊鏁存湰涓柇锛岀疮璁″垪 AA 灏辨案杩滄嬁涓嶅埌鏂扮紦瀛樺�硷紝
+            // 鏀圭敤閫愭牸瀹归敊鐨� recalcWorkbookFormulas锛氬潖鏍艰烦杩囥�佸ソ鏍肩収绠椼��
+            int[] recalc = recalcWorkbookFormulas(wb);
+            log.info("涓彛寰勬槑缁嗗叕寮忛噸绠楀畬鎴愶細鎴愬姛 {} 鏍硷紝澶辫触 {} 鏍�", recalc[0], recalc[1]);
             clearFormulaErrorsAll(wb); // 鍘诲勾鍚屾湡鏄庣粏椤垫畫鐣� #REF! 鍚屾瘮鍏紡 鈫� 娓呯┖
+            blankFutureMonthColumns(sheet, fillMonths); // 鎶ヨ〃鏈熶箣鍚庣殑鏈堜唤鍒椾笉淇濈暀鍏嬮殕鍏紡/0 鍊�
             return toBytes(wb);
+        }
+    }
+
+    /**
+     * 娓呯┖銆屾姤琛ㄦ湡涔嬪悗銆嶇殑鏈堜唤鍒楋紙鎵╁垪鍏嬮殕鍑烘潵鐨� 7~12 鏈堥噷銆佸皻鏈埌鏈熺殑鏈堜唤锛夈��
+     * 涓嶆竻鐨勮瘽锛屽厠闅嗗嚭鏉ョ殑鎬昏鍏紡浼氱畻鍑� 0锛屾姤琛ㄤ笂浼氬嚭鐜�"9~12 鏈堝叏鏄� 0"鐨勫亣鏁版嵁锛�
+     * 绱鍒楋紙AA锛夌殑鍏紡/缂撳瓨鍊煎凡鍦ㄩ噸绠楅樁娈电畻濂斤紝娓呯┖鏍煎瓙涓嶅奖鍝嶅畠锛堢┖ = 0锛夈��
+     */
+    private void blankFutureMonthColumns(Sheet sheet, int filledMonths) {
+        for (int m = filledMonths + 1; m <= 12; m++) {
+            int col = 2 * m;            // 0 鍩猴細1 鏈�=2(C)銆�7 鏈�=14(O)銆�12 鏈�=24(Y)
+            for (int r = 4; r <= sheet.getLastRowNum(); r++) { // 0 鍩虹 4 琛� = 绗� 5 琛岋紙棣栦釜鏁版嵁琛岋級锛岃〃澶翠笉鍔�
+                Row row = sheet.getRow(r);
+                if (row == null) continue;
+                Cell val = row.getCell(col);
+                if (val != null) val.setBlank();
+                Cell yoy = row.getCell(col + 1);
+                if (yoy != null) yoy.setBlank();
+            }
         }
     }
 
@@ -2256,16 +2289,19 @@
         return (col - 1) / 2;
     }
 
-    /** 濉腑鍙e緞鏁版嵁鍗曞厓鏍硷細鍑虹/缃戠害杞�(3/4)鏄惧紡 0锛岀彮绾�/鍏氦濉簱鍐呭�硷紙鏃犲�兼竻绌猴級 */
+    /**
+     * 濉腑鍙e緞鏁版嵁鍗曞厓鏍硷細鐝嚎/鍏氦/鍑虹鍩庝埂/缃戠害杞﹀煄涔� 鍥涚淮缁熶竴鍙栧簱鍐呭�笺��
+     * 搴撳唴璇ユ湀璇ョ淮鏃犳簮锛堝彇鍊间负 0锛夋椂**淇濈暀姣嶇増/妯℃澘鍘熷��**鈥斺�旂粷涓嶅啓绌恒�佷篃涓嶅啓 0銆�
+     * 渚濇嵁锛氭ā鏉跨殑鍩庡競绾у煄涔¤鏄�屽彴璐﹂〉 鎬婚噺 鈭� 鍩庡競鍐呫�嶇殑寮曠敤銆佸苟宸蹭笟鍔″畾绋匡紱
+     * 鐢ㄥ簱鍐呯己澶卞�艰鐩栦細鎶婂畾绋挎暟娓呮帀锛堝 2026-01~06 缃戠害杞﹁鍗曠己澶辨椂锛�
+     * 鍏ㄧ渷缃戠害杞﹀煄涔� 333.39 涓庡悇甯傚窞鍊间細琚竻绌猴級銆�
+     */
     private void fillMidCell(Cell c, Map<Integer, Map<String, double[][]>> mid, int year, int month, String area, int k, boolean volume) {
-        if (k == 3 || k == 4) {
-            writeExplicitZero(c); // 鍑虹/缃戠害杞︽殏鏃犳暟鎹簮锛屾樉寮� 0
-            return;
-        }
         double v = midClassVal(mid, year, month, area, k, volume);
+        if (v == 0.0) return; // 搴撳唴鏃犳簮锛氫繚鐣欐瘝鐗�/瀹氱鍘熷�硷紝缂烘暟鎹笉瑕嗙洊
         // POI setCellValue(double) 瀵瑰叕寮忓崟鍏冩牸鍙洿鏂扮紦瀛樹笉绉婚櫎鍏紡锛屽繀椤诲厛 setBlank 鍐嶅啓鍊�
         c.setBlank();
-        if (v != 0.0) c.setCellValue(round(v, 4));
+        c.setCellValue(round(v, 4));
     }
 
     /** 鏄惧紡鍐欏叆 0锛圥OI setCellValue(0.0) 浼氳浆 blank锛岄渶鎿嶄綔搴曞眰 XML锛� */
@@ -2369,7 +2405,52 @@
             addMidClass(mid, key, city, 2, nz(b.getPassengerChengxiang()), nz(b.getTurnoverChengxiang()));
             addMidClass(mid, key, "婀栧寳鐪�", 2, nz(b.getPassengerChengxiang()), nz(b.getTurnoverChengxiang()));
         }
+        // 缁村害3锛氬煄闄呭煄涔″贰娓稿嚭绉� = 鍙拌处椤点�屽嚭绉�!鎬婚噺 鈭� 鍑虹!鍩庡競鍐呫�嶏紙婧� city_taxi_monthly锛�
+        for (CityTaxiMonthly t : cityTaxiMapper.selectList(null)) {
+            if (t.getReportPeriod() == null || t.getCity() == null) continue;
+            int key = midPeriodKey(t.getReportPeriod());
+            if (key <= 0) continue;
+            String city = RegionUtil.normalizeCityName(t.getCity());
+            if (city == null) continue;
+            double pass = nz(t.getPassengerVolume()) - nz(t.getPassengerCity());
+            double turn = nz(t.getTurnover()) - nz(t.getTurnoverCity());
+            addMidClass(mid, key, city, 3, pass, turn);
+            addMidClass(mid, key, "婀栧寳鐪�", 3, pass, turn);
+        }
+        // 缁村害4锛氬煄闄呭煄涔$綉绾﹁溅 = 缃戠害杞︽媶鍒嗙粨鏋滐紙涓庡彴璐︺�岀綉绾﹁溅銆嶉〉鍚屾簮鍚屾硶锛�
+        for (WycOrderMonthly o : wycOrderMapper.selectList(null)) {
+            String per = o.getReportPeriod();
+            if (per == null) continue;
+            int key = midPeriodKey(per);
+            if (key <= 0) continue;
+            WycSplitCalc.WycResult wr;
+            try {
+                wr = wycSplitCalc.calc(per);
+            } catch (Exception e) {
+                continue; // 璇ユ湡缂鸿鍗�/pin 鎴栧嚭绉熸簮鏁版嵁锛岃烦杩囷紙涓嶅奖鍝嶅叾瀹冩湡锛�
+            }
+            for (Map.Entry<String, WycSplitCalc.WycMetrics> en : wr.getByCity().entrySet()) {
+                WycSplitCalc.WycMetrics wm = en.getValue();
+                addMidClass(mid, key, en.getKey(), 4, wm.getSuburbanPax(), wm.getSuburbanTurnover());
+                addMidClass(mid, key, "婀栧寳鐪�", 4, wm.getSuburbanPax(), wm.getSuburbanTurnover());
+            }
+        }
         return mid;
+    }
+
+    /** "yyyy-MM" -> yyyy*100+MM锛涢潪娉曡繑鍥� 0锛堜笌 loadMidClassMap 鐨� key 鍙e緞涓�鑷达級 */
+    private int midPeriodKey(String period) {
+        if (period == null) return 0;
+        String[] parts = period.trim().split("-");
+        if (parts.length != 2) return 0;
+        try {
+            int y = Integer.parseInt(parts[0]);
+            int m = Integer.parseInt(parts[1]);
+            if (y <= 0 || m < 1 || m > 12) return 0;
+            return y * 100 + m;
+        } catch (NumberFormatException e) {
+            return 0;
+        }
     }
 
     /** 鍐欏叆鍒嗙被鍊煎苟绱姞鎬婚噺锛堢淮搴�0锛� */
@@ -3362,6 +3443,8 @@
             applyTwoDecimalFormat(wb); // 鏁板�兼樉绀轰袱浣嶅皬鏁帮紙淇濈暀鍏ㄧ簿搴︼級锛�% / 鏃ユ湡绛夋棦鏈夋牱寮忎笉鏀瑰彉
             int inlineFixed = normalizeStaleInlineStrings(wb); // 娓呮帀銆岄潪 inlineStr 鍗存畫鐣� <is>銆嶇殑闈炴硶鏍硷紝鍚﹀垯 Excel 鎷掔粷鎵撳紑
             if (inlineFixed > 0) log.warn("姹囨�诲伐浣滅翱娓呮帀娈嬬暀 inlineStr 闈炴硶鏍� {} 涓紙姣嶇増鐢� openpyxl 鍐欏嚭鏃剁殑鍏稿瀷闂锛�", inlineFixed);
+            int[] recalc = recalcWorkbookFormulas(wb); // 鍏紡閲嶇畻骞跺啓鍥炵紦瀛樺�硷細鍏ㄧ渷琛�(危甯傚窞)/绱鍒�/鎺掑悕 SUM 鎵嶈兘琚瑙堜笌浜屾澶勭悊璇诲埌
+            log.info("姹囨�诲伐浣滅翱鍏紡閲嶇畻瀹屾垚锛氭垚鍔� {} 鏍硷紝澶辫触 {} 鏍硷紙澶辫触鏍间繚鐣欐瘝鐗堟棫缂撳瓨鍊硷紝鎵撳紑鏃舵寜 fullCalcOnLoad 閲嶇畻锛�", recalc[0], recalc[1]);
             if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr();
             wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // 杩樺師/鏀瑰啓鍏紡鍚庢墦寮�鍗抽噸绠�
             return toBytes(wb);
@@ -3371,6 +3454,53 @@
     }
 
     /**
+     * 姹囨�诲伐浣滅翱鍏紡閲嶇畻锛歅OI 鍐欐枃浠朵笉甯︾紦瀛樺�硷紝瀵艰嚧銆屽叏鐪佽锛埼�17甯傚窞锛夈�嶃�岀疮璁″垪銆嶃�屾帓鍚� SUM銆�
+     * 鍦ㄩ瑙�/浜屾澶勭悊閲屽彧鐪嬪埌姣嶇増涓婁竴鏈熺殑鏃у�硷紙2026-09-18 鐢ㄦ埛鎶モ��8鏈堟病鏁版嵁 / 鍏ㄧ渷琛屽仠鍦ㄤ笂涓�鏈熲�濈殑鏍瑰洜涔嬩竴锛夈��
+     * 閫愭牸 evaluate 骞舵妸缁撴灉鍐欏洖缂撳瓨鍊硷紱涓埆涓嶆敮鎸佸嚱鏁�/澶栭儴寮曠敤鏍煎け璐ュ垯璺宠繃骞惰鏁帮紝涓嶉樆濉炲鍑恒��
+     */
+    private int[] recalcWorkbookFormulas(XSSFWorkbook wb) {
+        if (wb == null) return new int[]{0, 0};
+        org.apache.poi.ss.usermodel.FormulaEvaluator ev;
+        try {
+            ev = wb.getCreationHelper().createFormulaEvaluator();
+        } catch (Exception e) {
+            log.warn("姹囨�诲伐浣滅翱鍏紡閲嶇畻锛氬垱寤烘眰鍊煎櫒澶辫触锛岃烦杩囷紙{}锛�", e.getMessage());
+            return new int[]{0, 0};
+        }
+        try {
+            // 璺ㄧ翱鍏紡锛圼1]鍑虹!C13 涔嬬被锛夊湪澶栭儴宸ヤ綔绨跨己澶辨椂榛樿鎶涘紓甯革紝浼氳寮曠敤瀹冪殑
+            // 鎬昏/绱/娲剧敓鍏紡杩為攣澶辫触锛堣〃鐜颁负銆屽叕寮忚繕鍦ㄤ絾娌℃湁缂撳瓨鍊笺�嶏級銆�
+            // 缃� true 鍚庢敼鐢ㄥ叕寮忔牸鑷韩鐨勭紦瀛樺�硷紙鍗冲畾绋垮�硷級鍙備笌璁$畻銆�
+            ev.setIgnoreMissingWorkbooks(true);
+        } catch (Exception ignore) {
+            // 涓埆瀹炵幇涓嶆敮鎸佽寮�鍏筹紝蹇界暐鍗冲彲
+        }
+        int ok = 0, fail = 0;
+        java.util.List<String> samples = new java.util.ArrayList<>();
+        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
+            Sheet sh = wb.getSheetAt(i);
+            if (sh == null) continue;
+            for (Row row : sh) {
+                if (row == null) continue;
+                for (Cell c : row) {
+                    if (c == null || c.getCellType() != CellType.FORMULA) continue;
+                    try {
+                        ev.evaluateFormulaCell(c); // 娉ㄦ剰锛歟valuate() 鏃犲壇浣滅敤锛屽繀椤荤敤 evaluateFormulaCell 鎵嶄細鎶婄粨鏋滃啓鍥炵紦瀛樺��
+                        ok++;
+                    } catch (Exception ex) {
+                        fail++;
+                        if (samples.size() < 10) {
+                            samples.add(sh.getSheetName() + "!" + c.getAddress() + " :: " + ex.getClass().getSimpleName());
+                        }
+                    }
+                }
+            }
+        }
+        if (!samples.isEmpty()) log.warn("姹囨�诲伐浣滅翱鍏紡閲嶇畻澶辫触鏍蜂緥锛歿}", samples);
+        return new int[]{ok, fail};
+    }
+
+    /**
      * 娓呮帀銆岄潪 inlineStr 鍗存畫鐣� &lt;is&gt;銆嶇殑闈炴硶鍗曞厓鏍笺��
      *
      * 姣嶇増鑻ョ敱 openpyxl 鍐欏嚭锛屾枃鏈崟鍏冩牸鐢� &lt;is&gt;锛坕nlineStr锛夊瓨鍌紱POI 鐨� setCellValue 鍙敼鍐� t 涓� &lt;v&gt;锛�

--
Gitblit v1.9.1