From 5cc92198015bde1e4bb50086514a261620d05107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Fri, 27 Feb 2026 16:14:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor(credit):=20=E4=BC=98=E5=8C=96Excel?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=B9=B6=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=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 - 移除过时的Excel导入相关依赖和方法 - 使用ExcelImportSupport替代原有的多配置尝试导入方式 - 添加表头文本标准化处理以解决空白字符导致的匹配问题 - 引入ExcelHeaderAlias注解支持表头别名匹配 - 简化导入逻辑并提高表头识别准确性 --- .../controller/CreditUserController.java | 49 +++++++------------ .../credit/param/CreditUserImportParam.java | 2 + 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java index 84240db..123b427 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java @@ -1,9 +1,7 @@ package com.gxwebsoft.credit.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; -import cn.afterturn.easypoi.excel.entity.ImportParams; import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.BaseController; @@ -205,19 +203,11 @@ public class CreditUserController extends BaseController { try { int sheetIndex = ExcelImportSupport.findSheetIndex(file, "招投标", 0); - List list = null; - int usedTitleRows = 0; - int usedHeadRows = 0; - int[][] tryConfigs = new int[][]{{1, 1}, {0, 1}, {0, 2}, {0, 3}}; - - for (int[] config : tryConfigs) { - list = filterEmptyRows(tryImport(file, config[0], config[1], sheetIndex)); - if (!CollectionUtils.isEmpty(list)) { - usedTitleRows = config[0]; - usedHeadRows = config[1]; - break; - } - } + ExcelImportSupport.ImportResult importResult = + ExcelImportSupport.read(file, CreditUserImportParam.class, this::isEmptyImportRow, sheetIndex); + List list = importResult.getData(); + int usedTitleRows = importResult.getTitleRows(); + int usedHeadRows = importResult.getHeadRows(); if (CollectionUtils.isEmpty(list)) { return fail("未读取到数据,请确认模板表头与示例格式一致", null); } @@ -354,15 +344,6 @@ public class CreditUserController extends BaseController { workbook.close(); } - private List tryImport(MultipartFile file, int titleRows, int headRows, int sheetIndex) throws Exception { - ImportParams importParams = new ImportParams(); - importParams.setTitleRows(titleRows); - importParams.setHeadRows(headRows); - importParams.setStartSheetIndex(sheetIndex); - importParams.setSheetNum(1); - return ExcelImportUtil.importExcel(file.getInputStream(), CreditUserImportParam.class, importParams); - } - /** * 读取“项目名称”列的超链接,按数据行顺序返回。 */ @@ -379,7 +360,7 @@ public class CreditUserController extends BaseController { if (headerRow != null) { for (int c = headerRow.getFirstCellNum(); c < headerRow.getLastCellNum(); c++) { Cell cell = headerRow.getCell(c); - if (cell != null && "项目名称".equals(cell.getStringCellValue())) { + if (cell != null && "项目名称".equals(normalizeHeaderText(cell.getStringCellValue()))) { nameColIndex = c; break; } @@ -404,14 +385,20 @@ public class CreditUserController extends BaseController { } /** - * 过滤掉完全空白的导入行,避免空行导致导入失败 + * 用于表头匹配:仅做最常见的空白字符规整(避免表头中存在换行/空格导致无法定位列)。 */ - private List filterEmptyRows(List rawList) { - if (CollectionUtils.isEmpty(rawList)) { - return rawList; + private static String normalizeHeaderText(String text) { + if (text == null) { + return ""; } - rawList.removeIf(this::isEmptyImportRow); - return rawList; + return text + .replace(" ", "") + .replace("\t", "") + .replace("\r", "") + .replace("\n", "") + .replace("\u00A0", "") + .replace(" ", "") + .trim(); } private boolean isEmptyImportRow(CreditUserImportParam param) { diff --git a/src/main/java/com/gxwebsoft/credit/param/CreditUserImportParam.java b/src/main/java/com/gxwebsoft/credit/param/CreditUserImportParam.java index 0420439..e902bf2 100644 --- a/src/main/java/com/gxwebsoft/credit/param/CreditUserImportParam.java +++ b/src/main/java/com/gxwebsoft/credit/param/CreditUserImportParam.java @@ -1,6 +1,7 @@ package com.gxwebsoft.credit.param; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.gxwebsoft.credit.excel.ExcelHeaderAlias; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -56,6 +57,7 @@ public class CreditUserImportParam implements Serializable { private String procurementName; @Excel(name = "中标单位") + @ExcelHeaderAlias({"中标单位(最多展示50家)"}) private String winningName; @Excel(name = "中标金额")