From 16343d2e99a9cff5b0bac8428f3ab2ba69d5778d Mon Sep 17 00:00:00 2001 From: wsm <2746563060@qq.com> Date: Tue, 30 Jun 2026 10:05:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(xispeak):=20=E6=96=B0=E5=A2=9EExcel?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=8F=AA=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=B8=8D=E4=BF=9D=E5=AD=98=E5=88=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JeecgController 新增 checkExcelByEasyExcel 基类方法,batchHandler 传 null 跳过入库 - ExcelImportListener 支持 batchHandler 为 null 时不攒 batch 内存 - BgXiSpeakController 新增 /checkExcelByEasyExcel 接口 Co-Authored-By: Claude Opus 4.7 --- .../base/controller/JeecgController.java | 34 +++++++++++++++++++ .../util/excel/ExcelImportListener.java | 16 +++++---- .../controller/BgXiSpeakController.java | 8 +++++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java index 79cc33c..7e2d5b1 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java @@ -237,6 +237,40 @@ public class JeecgController> { } } + /** + * 通过EasyExcel校验数据,只返回校验结果,不保存到数据库 + */ + protected Result checkExcelByEasyExcel(HttpServletRequest request, Class clazz) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + MultipartFile file = fileMap.values().stream().findFirst().orElse(null); + if (file == null) { + return Result.error("未找到上传文件!"); + } + try (InputStream inputStream = file.getInputStream()) { + long start = System.currentTimeMillis(); + List errors = new ArrayList<>(); + int total = ExcelAnnotationUtils.read( + inputStream, + clazz, + null, + BATCH_NUM, + errors::addAll, + dictQuery()); + log.info("【EasyExcel校验】校验完成, 数据行数: {}, 耗时: {}毫秒", total, System.currentTimeMillis() - start); + if (!errors.isEmpty()) { + for (ExcelAnnotationUtils.ValidationError err : errors) { + log.warn("【EasyExcel校验】校验失败, 行号: {}, 错误: {}", err.row(), err.messages()); + } + return Result.error("文件校验不通过: 存在" + errors.size() + "行数据校验不通过,请修改后重新导入", errors); + } + return Result.ok("文件校验通过!数据行数:" + total); + } catch (IOException e) { + log.error("【EasyExcel校验】文件读取失败", e); + return Result.error("文件校验失败:" + e.getMessage()); + } + } + /** * 通过excel导入数据 * diff --git a/jeecg-boot-module/jeecg-module-tools/src/main/java/org/jeecg/common/util/excel/ExcelImportListener.java b/jeecg-boot-module/jeecg-module-tools/src/main/java/org/jeecg/common/util/excel/ExcelImportListener.java index 30f348f..2094a5b 100644 --- a/jeecg-boot-module/jeecg-module-tools/src/main/java/org/jeecg/common/util/excel/ExcelImportListener.java +++ b/jeecg-boot-module/jeecg-module-tools/src/main/java/org/jeecg/common/util/excel/ExcelImportListener.java @@ -47,7 +47,7 @@ public class ExcelImportListener implements ReadListener this.displayToCode = displayToCode; this.batchHandler = batchHandler; this.errorHandler = errorHandler; - this.batch = new ArrayList<>(batchSize); + this.batch = batchHandler != null ? new ArrayList<>(batchSize) : null; this.errorBatch = new ArrayList<>(batchSize); } @@ -133,12 +133,14 @@ public class ExcelImportListener implements ReadListener return; } - // 4. 成功加入批次 - batch.add(obj); + // 4. 成功计数 successCount[0]++; - if (batch.size() >= batchSize) { - batchHandler.accept(new ArrayList<>(batch)); - batch.clear(); + if (batchHandler != null) { + batch.add(obj); + if (batch.size() >= batchSize) { + batchHandler.accept(new ArrayList<>(batch)); + batch.clear(); + } } } catch (Exception e) { @@ -158,7 +160,7 @@ public class ExcelImportListener implements ReadListener @Override public void doAfterAllAnalysed(AnalysisContext context) { - if (!batch.isEmpty()) { + if (batchHandler != null && batch != null && !batch.isEmpty()) { batchHandler.accept(new ArrayList<>(batch)); batch.clear(); } diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/bg/xispeak/controller/BgXiSpeakController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/bg/xispeak/controller/BgXiSpeakController.java index 0e6fce4..2266ee2 100644 --- a/jeecg-module-supervision/src/main/java/org/jeecg/modules/bg/xispeak/controller/BgXiSpeakController.java +++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/bg/xispeak/controller/BgXiSpeakController.java @@ -382,6 +382,14 @@ public class BgXiSpeakController extends JeecgController checkExcelByEasyExcel(HttpServletRequest request) { + return super.checkExcelByEasyExcel(request, BgXiSpeak.class); + } /**