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 鍗存畫鐣� <is>銆嶇殑闈炴硶鍗曞厓鏍笺��
*
* 姣嶇増鑻ョ敱 openpyxl 鍐欏嚭锛屾枃鏈崟鍏冩牸鐢� <is>锛坕nlineStr锛夊瓨鍌紱POI 鐨� setCellValue 鍙敼鍐� t 涓� <v>锛�
--
Gitblit v1.9.1