diff --git a/src/main/java/com/youlai/system/common/util/ExcelUtils.java b/src/main/java/com/youlai/system/common/util/ExcelUtils.java new file mode 100644 index 00000000..f107230b --- /dev/null +++ b/src/main/java/com/youlai/system/common/util/ExcelUtils.java @@ -0,0 +1,24 @@ +package com.youlai.system.common.util; + +import com.alibaba.excel.EasyExcel; +import com.youlai.system.framework.easyexcel.ExcelResult; +import com.youlai.system.framework.easyexcel.MyAnalysisEventListener; + +import java.io.InputStream; + +/** + * Excel 工具类 + * + * @author: haoxr + * @date: 2023/03/01 + */ +public class ExcelUtils { + + public static ExcelResult importExcel(InputStream is, Class clazz, MyAnalysisEventListener listener) { + EasyExcel.read(is, clazz, listener).sheet().doRead(); + ExcelResult excelResult = listener.getResult(); + return excelResult; + } + + +} diff --git a/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java b/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java new file mode 100644 index 00000000..d1a37136 --- /dev/null +++ b/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java @@ -0,0 +1,17 @@ +package com.youlai.system.framework.easyexcel; + +import java.util.List; + +/** + * Excel 读取结果 + * + * @author: haoxr + * @date: 2023/03/01 + */ +public interface ExcelResult { + + List getList(); + + String getMsg(); + +} diff --git a/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java b/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java new file mode 100644 index 00000000..00259e60 --- /dev/null +++ b/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java @@ -0,0 +1,13 @@ +package com.youlai.system.framework.easyexcel; + +import com.alibaba.excel.event.AnalysisEventListener; + +/** + * 自定义解析结果监听器 + * + * @author: haoxr + * @date: 2023/03/01 + */ +public abstract class MyAnalysisEventListener extends AnalysisEventListener { + public abstract ExcelResult getResult(); +} diff --git a/src/main/java/com/youlai/system/listener/UserImportListener.java b/src/main/java/com/youlai/system/listener/UserImportListener.java index f486f36c..b8f14af3 100644 --- a/src/main/java/com/youlai/system/listener/UserImportListener.java +++ b/src/main/java/com/youlai/system/listener/UserImportListener.java @@ -1,27 +1,90 @@ package com.youlai.system.listener; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.excel.context.AnalysisContext; -import com.alibaba.excel.event.AnalysisEventListener; -import com.youlai.system.pojo.dto.UserImportDTO; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; +import com.alibaba.excel.util.ListUtils; +import com.youlai.system.framework.easyexcel.ExcelResult; +import com.youlai.system.framework.easyexcel.MyAnalysisEventListener; +import com.youlai.system.pojo.vo.UserImportVO; +import com.youlai.system.service.SysUserService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; /** + * 用户导入监听器 + *

+ * https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read * * @author haoxr * @date 2022/4/10 20:49 */ -@Component -@Scope("prototype") -public class UserImportListener extends AnalysisEventListener { +@Slf4j +public class UserImportListener extends MyAnalysisEventListener { + /** + * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 + */ + private static final int BATCH_COUNT = 100; + + /** + * 缓存的数据 + */ + private List cachedUserList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + + + /** + * 部门ID + */ + private final Long deptId; + + private final SysUserService userService; + + public UserImportListener(Long deptId) { + this.deptId = deptId; + this.userService = SpringUtil.getBean(SysUserService.class); + } + + + /** + * 每一条数据解析都会来调用 + * + * @param userImportVO 一行数据,类似于 {@link AnalysisContext#readRowHolder()} + * @param analysisContext + */ @Override - public void invoke(UserImportDTO.UserItem userItem, AnalysisContext analysisContext) { + public void invoke(UserImportVO userImportVO, AnalysisContext analysisContext) { + log.info("解析到一条用户数据:{}", JSONUtil.toJsonStr(userImportVO)); + + + } + + /** + * 所有数据解析完成会来调用 + * + * @param analysisContext + */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } + + @Override + public ExcelResult getResult() { + return new ExcelResult() { + @Override + public List getList() { + return null; + } + + @Override + public String getMsg() { + return null; + } + }; + } } diff --git a/src/main/java/com/youlai/system/pojo/dto/UserImportDTO.java b/src/main/java/com/youlai/system/pojo/dto/UserImportDTO.java deleted file mode 100644 index 7f8da694..00000000 --- a/src/main/java/com/youlai/system/pojo/dto/UserImportDTO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.youlai.system.pojo.dto; - -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -/** - * 用户导入对象 - * - * @author haoxr - * @date 2022/4/10 - */ -@Data -public class UserImportDTO { - - /** - * 部门ID - */ - private Long deptId; - - /** - * 角色ID - */ - private String roleIds; - - private MultipartFile file; - - /** - * 导入的用户列表 - */ - private List userList; - - @Data - @NoArgsConstructor - @AllArgsConstructor - public static class UserItem { - - @ExcelProperty(value = "用户名") - private String username; - - @ExcelProperty(value = "用户昵称") - private String nickname; - - @ExcelProperty(value = "性别") - private String gender; - - @ExcelProperty(value = "手机号码") - private String mobile; - - @ExcelProperty(value = "邮箱") - private String email; - } - -} diff --git a/src/main/java/com/youlai/system/pojo/vo/UserImportVO.java b/src/main/java/com/youlai/system/pojo/vo/UserImportVO.java new file mode 100644 index 00000000..f47a43c9 --- /dev/null +++ b/src/main/java/com/youlai/system/pojo/vo/UserImportVO.java @@ -0,0 +1,30 @@ +package com.youlai.system.pojo.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 用户导入对象 + * + * @author haoxr + * @date 2022/4/10 + */ +@Data +public class UserImportVO { + + @ExcelProperty(value = "用户名") + private String username; + + @ExcelProperty(value = "用户昵称") + private String nickname; + + @ExcelProperty(value = "性别") + private String gender; + + @ExcelProperty(value = "手机号码") + private String mobile; + + @ExcelProperty(value = "邮箱") + private String email; + +} diff --git a/src/main/resources/excel-templates/用户导入模板.xlsx b/src/main/resources/excel-templates/用户导入模板.xlsx new file mode 100644 index 00000000..60166214 Binary files /dev/null and b/src/main/resources/excel-templates/用户导入模板.xlsx differ