From 9aec8dbbbe90f8730c71dd9143c387692cba5c8f Mon Sep 17 00:00:00 2001
From: new_new_new <8454518+new-twice@user.noreply.gitee.com>
Date: Tue, 23 Jun 2026 10:36:56 +0000
Subject: [PATCH] =?UTF-8?q?!52=20feat(excel):=20=E6=96=B0=E5=A2=9EEasyExce?=
=?UTF-8?q?l=E5=88=86=E6=89=B9=E5=AF=BC=E5=85=A5=EF=BC=8C=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E5=AD=97=E5=85=B8=E6=A0=A1=E9=AA=8C=E5=92=8CHibernate?=
=?UTF-8?q?=20Validator?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(excel): 新增EasyExcel分批导入,支持字典校验和Hibernate Validator
* feat(excel): 新增EasyExcel导出工具类,基于@Excel注解解析并支持模板表头下载
* chore: 添加easyexcel依赖
---
jeecg-boot-base-core/pom.xml | 9 +
.../base/controller/JeecgController.java | 116 +++++-
.../jeecg/common/util/excel/ColumnMeta.java | 51 +++
.../common/util/excel/ColumnWidthHandler.java | 43 ++
.../util/excel/ExcelAnnotationUtils.java | 376 ++++++++++++++++++
.../common/util/excel/ExcelDataListener.java | 43 ++
.../util/excel/ExcelImportListener.java | 165 ++++++++
.../controller/BgXiSpeakController.java | 20 +
.../modules/bg/xispeak/entity/BgXiSpeak.java | 15 +-
.../DjInspectImproveController.java | 9 +
pom.xml | 8 +
11 files changed, 828 insertions(+), 27 deletions(-)
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/excel/ColumnMeta.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/excel/ColumnWidthHandler.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/excel/ExcelAnnotationUtils.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/excel/ExcelDataListener.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/excel/ExcelImportListener.java
diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml
index 3fbe879..94bba34 100644
--- a/jeecg-boot-base-core/pom.xml
+++ b/jeecg-boot-base-core/pom.xml
@@ -327,5 +327,14 @@
org.jeecgframework.boot
jeecg-boot-starter-chatgpt
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ com.alibaba
+ easyexcel
+ compile
+
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 f3ff51e..0e42e8a 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
@@ -18,7 +18,9 @@ import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.util.excel.ExcelAnnotationUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
@@ -27,6 +29,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
+import java.io.InputStream;
import java.util.*;
/**
@@ -37,12 +40,16 @@ import java.util.*;
*/
@Slf4j
public class JeecgController> {
- /**issues/2933 JeecgController注入service时改用protected修饰,能避免重复引用service*/
+ /**
+ * issues/2933 JeecgController注入service时改用protected修饰,能避免重复引用service
+ */
@Autowired
protected S service;
@Resource
private JeecgBaseConfig jeecgBaseConfig;
-
+
+ private final int BATCH_NUM = 500;
+
/**
* 导出excel
*
@@ -57,7 +64,7 @@ public class JeecgController> {
String selections = request.getParameter("selections");
if (oConvertUtils.isNotEmpty(selections)) {
List selectionList = Arrays.asList(selections.split(","));
- queryWrapper.in("id",selectionList);
+ queryWrapper.in("id", selectionList);
}
// Step.2 获取导出数据
List exportList = service.list(queryWrapper);
@@ -68,53 +75,54 @@ public class JeecgController> {
mv.addObject(NormalExcelConstants.FILE_NAME, title);
mv.addObject(NormalExcelConstants.CLASS, clazz);
//update-begin--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置--------------------
- ExportParams exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title);
+ ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title);
exportParams.setImageBasePath(jeecgBaseConfig.getPath().getUpload());
//update-end--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置----------------------
- mv.addObject(NormalExcelConstants.PARAMS,exportParams);
+ mv.addObject(NormalExcelConstants.PARAMS, exportParams);
mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
return mv;
}
+
/**
* 根据每页sheet数量导出多sheet
*
* @param request
- * @param object 实体类
- * @param clazz 实体类class
- * @param title 标题
+ * @param object 实体类
+ * @param clazz 实体类class
+ * @param title 标题
* @param exportFields 导出字段自定义
- * @param pageNum 每个sheet的数据条数
+ * @param pageNum 每个sheet的数据条数
* @param request
*/
- protected ModelAndView exportXlsSheet(HttpServletRequest request, T object, Class clazz, String title,String exportFields,Integer pageNum) {
+ protected ModelAndView exportXlsSheet(HttpServletRequest request, T object, Class clazz, String title, String exportFields, Integer pageNum) {
// Step.1 组装查询条件
QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
// Step.2 计算分页sheet数据
double total = service.count();
- int count = (int)Math.ceil(total/pageNum);
+ int count = (int) Math.ceil(total / pageNum);
//update-begin-author:liusq---date:20220629--for: 多sheet导出根据选择导出写法调整 ---
// Step.3 过滤选中数据
String selections = request.getParameter("selections");
if (oConvertUtils.isNotEmpty(selections)) {
List selectionList = Arrays.asList(selections.split(","));
- queryWrapper.in("id",selectionList);
+ queryWrapper.in("id", selectionList);
}
//update-end-author:liusq---date:20220629--for: 多sheet导出根据选择导出写法调整 ---
// Step.4 多sheet处理
List