From 175708716c099caf0c967cd5d7b49ecb150a7bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sat, 31 Jan 2026 02:17:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(excel):=20=E6=94=AF=E6=8C=81=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=8F=91=E7=94=9F=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E8=A1=A8=E5=A4=B4=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 occurrenceTime2 字段支持导入发生时间数据 - 实现表头单元格标准化处理,移除多余空格和特殊字符 - 解决因表头包含空白字符导致的列映射失败问题 - 支持对 "原告/上诉人" 等包含特殊分隔符的表头进行标准化 - 通过 WorkbookFactory 读取并重新写入 Excel 文件实现表头清理 --- .../CreditCourtAnnouncementController.java | 6 +- .../credit/controller/ExcelImportSupport.java | 73 ++++++++++++++++++- .../CreditCourtAnnouncementImportParam.java | 3 + 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java index 01f984e..ef66aa6 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java @@ -410,11 +410,15 @@ public class CreditCourtAnnouncementController extends BaseController { ? param.getInvolvedAmount2() : param.getInvolvedAmount(); + String occurrenceTime = !ImportHelper.isBlank(param.getOccurrenceTime2()) + ? param.getOccurrenceTime2() + : param.getOccurrenceTime(); + entity.setDataType(dataType); entity.setPlaintiffAppellant(plaintiffAppellant); entity.setAppellee(param.getAppellee()); entity.setOtherPartiesThirdParty(otherPartiesThirdParty); - entity.setOccurrenceTime(param.getOccurrenceTime()); + entity.setOccurrenceTime(occurrenceTime); entity.setCaseNumber(param.getCaseNumber()); entity.setCauseOfAction(param.getCauseOfAction()); entity.setCourtName(param.getCourtName()); diff --git a/src/main/java/com/gxwebsoft/credit/controller/ExcelImportSupport.java b/src/main/java/com/gxwebsoft/credit/controller/ExcelImportSupport.java index eb1cb75..6f42476 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/ExcelImportSupport.java +++ b/src/main/java/com/gxwebsoft/credit/controller/ExcelImportSupport.java @@ -15,6 +15,8 @@ import org.apache.poi.ss.usermodel.WorkbookFactory; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.Collections; import java.util.HashMap; @@ -267,7 +269,76 @@ public class ExcelImportSupport { importParams.setHeadRows(headRows); importParams.setStartSheetIndex(sheetIndex); importParams.setSheetNum(1); - return ExcelImportUtil.importExcel(file.getInputStream(), clazz, importParams); + + // Easypoi matches headers by exact string. Some upstream files contain extra spaces/tabs/newlines in header cells + // (e.g. "原告 / 上诉人" or "原告/上诉人\t"), which makes specific columns silently not mapped. + // Normalize header cells first to make imports robust. + try (InputStream is = file.getInputStream(); Workbook workbook = WorkbookFactory.create(is)) { + if (workbook.getNumberOfSheets() > sheetIndex) { + Sheet sheet = workbook.getSheetAt(sheetIndex); + if (sheet != null) { + normalizeHeaderCells(sheet, titleRows, headRows); + } + } + try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + workbook.write(bos); + try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray())) { + return ExcelImportUtil.importExcel(bis, clazz, importParams); + } + } + } + } + + private static void normalizeHeaderCells(Sheet sheet, int titleRows, int headRows) { + if (sheet == null || headRows <= 0) { + return; + } + int headerStart = Math.max(titleRows, 0); + int headerEnd = headerStart + headRows - 1; + for (int r = headerStart; r <= headerEnd; r++) { + Row row = sheet.getRow(r); + if (row == null) { + continue; + } + short last = row.getLastCellNum(); + for (int c = 0; c < last; c++) { + Cell cell = row.getCell(c); + if (cell == null) { + continue; + } + + String text = null; + CellType type = cell.getCellType(); + if (type == CellType.STRING) { + text = cell.getStringCellValue(); + } else if (type == CellType.FORMULA && cell.getCachedFormulaResultType() == CellType.STRING) { + text = cell.getStringCellValue(); + } else { + continue; + } + + String normalized = normalizeHeaderText(text); + if (normalized != null && !normalized.equals(text)) { + cell.setCellValue(normalized); + } + } + } + } + + private static String normalizeHeaderText(String text) { + if (text == null) { + return null; + } + // Remove common invisible whitespace characters, including full-width space. + return text + .replace("/", "/") + .replace(" ", "") + .replace("\t", "") + .replace("\r", "") + .replace("\n", "") + .replace("\u00A0", "") + .replace(" ", "") + .trim(); } private static List filterEmptyRows(List rawList, Predicate emptyRowPredicate) { diff --git a/src/main/java/com/gxwebsoft/credit/param/CreditCourtAnnouncementImportParam.java b/src/main/java/com/gxwebsoft/credit/param/CreditCourtAnnouncementImportParam.java index 6a2422b..ffb47fc 100644 --- a/src/main/java/com/gxwebsoft/credit/param/CreditCourtAnnouncementImportParam.java +++ b/src/main/java/com/gxwebsoft/credit/param/CreditCourtAnnouncementImportParam.java @@ -54,6 +54,9 @@ public class CreditCourtAnnouncementImportParam implements Serializable { @Excel(name = "刊登日期") private String occurrenceTime; + @Excel(name = "发生时间") + private String occurrenceTime2; + @Excel(name = "备注") private String comments;