更多操作参考:https://www.yuque.com/easyexcel/doc/easyexcel

增加依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>2.2.6</version>
  5. </dependency>

操作excel

定义导出entity

  1. @Data
  2. @ColumnWidth(25)
  3. @HeadRowHeight(20)
  4. @ContentRowHeight(18)
  5. public class UserExcel implements Serializable {
  6. private static final long serialVersionUID = 1L;
  7. @ColumnWidth(15)
  8. @ExcelProperty("租户编号")
  9. private String tenantId;
  10. @ColumnWidth(15)
  11. @ExcelProperty("账户")
  12. private String account;
  13. @ColumnWidth(10)
  14. @ExcelProperty("昵称")
  15. private String name;
  16. @ColumnWidth(10)
  17. @ExcelProperty("姓名")
  18. private String realName;
  19. @ExcelProperty("邮箱")
  20. private String email;
  21. @ColumnWidth(15)
  22. @ExcelProperty("手机")
  23. private String phone;
  24. @ExcelIgnore
  25. @ExcelProperty("角色ID")
  26. private String roleId;
  27. @ExcelIgnore
  28. @ExcelProperty("部门ID")
  29. private String deptId;
  30. @ExcelIgnore
  31. @ExcelProperty("岗位ID")
  32. private String postId;
  33. @ExcelProperty("角色名称")
  34. private String roleName;
  35. @ExcelProperty("部门名称")
  36. private String deptName;
  37. @ExcelProperty("岗位名称")
  38. private String postName;
  39. @ColumnWidth(20)
  40. @ExcelProperty("生日")
  41. private Date birthday;
  42. }

定义导入监听器

  1. @Data
  2. @RequiredArgsConstructor
  3. @EqualsAndHashCode(callSuper = true)
  4. public class UserImportListener extends AnalysisEventListener<UserExcel> {
  5. /**
  6. * 默认每隔3000条存储数据库
  7. */
  8. private int batchCount = 3000;
  9. /**
  10. * 缓存的数据列表
  11. */
  12. private List<UserExcel> list = new ArrayList<>();
  13. /**
  14. * 用户service
  15. */
  16. private final IUserService userService;
  17. @Override
  18. public void invoke(UserExcel data, AnalysisContext context) {
  19. list.add(data);
  20. // 达到BATCH_COUNT,则调用importer方法入库,防止数据几万条数据在内存,容易OOM
  21. if (list.size() >= batchCount) {
  22. // 调用importer方法
  23. userService.importUser(list);
  24. // 存储完成清理list
  25. list.clear();
  26. }
  27. }
  28. @Override
  29. public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  30. // 调用importer方法
  31. userService.importUser(list);
  32. // 存储完成清理list
  33. list.clear();
  34. }
  35. }

定义UserService

  1. /**
  2. * 服务类
  3. *
  4. * @author xq
  5. */
  6. public interface IUserService extends BaseService<User> {
  7. /**
  8. * 导入用户数据
  9. *
  10. * @param data
  11. * @return
  12. */
  13. void importUser(List<UserExcel> data);
  14. /**
  15. * 获取导出用户数据
  16. *
  17. * @param queryWrapper
  18. * @return
  19. */
  20. List<UserExcel> exportUser(Wrapper<User> queryWrapper);
  21. }
  22. /**
  23. * 服务实现类
  24. *
  25. * @author Chill
  26. */
  27. @Service
  28. @AllArgsConstructor
  29. public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements IUserService {
  30. @Override
  31. public void importUser(List<UserExcel> data) {
  32. data.forEach(userExcel -> {
  33. User user = Objects.requireNonNull(BeanUtil.copy(userExcel, User.class));
  34. // 设置部门ID
  35. user.setDeptId(sysClient.getDeptIds(userExcel.getTenantId(), userExcel.getDeptName()));
  36. // 设置岗位ID
  37. user.setPostId(sysClient.getPostIds(userExcel.getTenantId(), userExcel.getPostName()));
  38. // 设置角色ID
  39. user.setRoleId(sysClient.getRoleIds(userExcel.getTenantId(), userExcel.getRoleName()));
  40. // 设置默认密码
  41. user.setPassword(CommonConstant.DEFAULT_PASSWORD);
  42. this.submit(user);
  43. });
  44. }
  45. @Override
  46. public List<UserExcel> exportUser(Wrapper<User> queryWrapper) {
  47. List<UserExcel> userList = baseMapper.exportUser(queryWrapper);
  48. userList.forEach(user -> {
  49. user.setRoleName(StringUtil.join(sysClient.getRoleNames(user.getRoleId())));
  50. user.setDeptName(StringUtil.join(sysClient.getDeptNames(user.getDeptId())));
  51. user.setPostName(StringUtil.join(sysClient.getPostNames(user.getPostId())));
  52. });
  53. return userList;
  54. }
  55. }

定义mapper

  1. public interface UserMapper extends BaseMapper<User> {
  2. /**
  3. * 获取导出用户数据
  4. *
  5. * @param queryWrapper
  6. * @return
  7. */
  8. List<UserExcel> exportUser(@Param("ew") Wrapper<User> queryWrapper);
  9. }
  10. <?xml version="1.0" encoding="UTF-8"?>
  11. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  12. <mapper namespace="org.springblade.system.user.mapper.UserMapper">
  13. <!-- 通用查询映射结果 -->
  14. <resultMap id="userResultMap" type="org.springblade.system.user.entity.User">
  15. <result column="id" property="id"/>
  16. <result column="tenant_id" property="tenantId"/>
  17. <result column="create_user" property="createUser"/>
  18. <result column="create_time" property="createTime"/>
  19. <result column="update_user" property="updateUser"/>
  20. <result column="update_time" property="updateTime"/>
  21. <result column="status" property="status"/>
  22. <result column="is_deleted" property="isDeleted"/>
  23. <result column="code" property="code"/>
  24. <result column="account" property="account"/>
  25. <result column="password" property="password"/>
  26. <result column="name" property="name"/>
  27. <result column="real_name" property="realName"/>
  28. <result column="email" property="email"/>
  29. <result column="phone" property="phone"/>
  30. <result column="birthday" property="birthday"/>
  31. <result column="sex" property="sex"/>
  32. <result column="role_id" property="roleId"/>
  33. <result column="dept_id" property="deptId"/>
  34. </resultMap>
  35. <!-- 通用查询结果列 -->
  36. <sql id="baseColumnList">
  37. select id,
  38. create_user AS createUser,
  39. create_time AS createTime,
  40. update_user AS updateUser,
  41. update_time AS updateTime,
  42. status,
  43. is_deleted AS isDeleted,
  44. account, password, name, real_name, email, phone, birthday, sex, role_id, dept_id
  45. </sql>
  46. <select id="exportUser" resultType="org.clown.system.user.excel.UserExcel">
  47. SELECT id, tenant_id, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM user ${ew.customSqlSegment}
  48. </select>
  49. </mapper>

定义导入导出接口

  1. @RestController
  2. @RequestMapping
  3. @AllArgsConstructor
  4. public class UserController {
  5. private IUserService userService;
  6. /**
  7. * 导入用户
  8. */
  9. @PostMapping("import-user")
  10. @ApiOperationSupport(order = 12)
  11. @ApiOperation(value = "导入用户", notes = "传入excel")
  12. public R importUser(MultipartFile file, Integer isCovered) {
  13. String filename = file.getOriginalFilename();
  14. if (StringUtils.isEmpty(filename)) {
  15. throw new RuntimeException("请上传文件!");
  16. }
  17. if ((!StringUtils.endsWithIgnoreCase(filename, ".xls") && !StringUtils.endsWithIgnoreCase(filename, ".xlsx"))) {
  18. throw new RuntimeException("请上传正确的excel文件!");
  19. }
  20. InputStream inputStream;
  21. try {
  22. UserImportListener importListener = new UserImportListener(userService);
  23. inputStream = new BufferedInputStream(file.getInputStream());
  24. ExcelReaderBuilder builder = EasyExcel.read(inputStream, UserExcel.class, importListener);
  25. builder.doReadAll();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. return R.success("操作成功");
  30. }
  31. /**
  32. * 导出用户
  33. */
  34. @SneakyThrows
  35. @GetMapping("export-user")
  36. @ApiOperationSupport(order = 13)
  37. @ApiOperation(value = "导出用户", notes = "传入user")
  38. public void exportUser(@ApiIgnore @RequestParam Map<String, Object> user, BladeUser bladeUser, HttpServletResponse response) {
  39. QueryWrapper<User> queryWrapper = Condition.getQueryWrapper(user, User.class);
  40. if (!SecureUtil.isAdministrator()){
  41. queryWrapper.lambda().eq(User::getTenantId, bladeUser.getTenantId());
  42. }
  43. queryWrapper.lambda().eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED);
  44. List<UserExcel> list = userService.exportUser(queryWrapper);
  45. response.setContentType("application/vnd.ms-excel");
  46. response.setCharacterEncoding(Charsets.UTF_8.name());
  47. String fileName = URLEncoder.encode("用户数据导出", Charsets.UTF_8.name());
  48. response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
  49. EasyExcel.write(response.getOutputStream(), UserExcel.class).sheet("用户数据表").doWrite(list);
  50. }
  51. /**
  52. * 导出模板
  53. */
  54. @SneakyThrows
  55. @GetMapping("export-template")
  56. @ApiOperationSupport(order = 14)
  57. @ApiOperation(value = "导出模板")
  58. public void exportUser(HttpServletResponse response) {
  59. List<UserExcel> list = new ArrayList<>();
  60. response.setContentType("application/vnd.ms-excel");
  61. response.setCharacterEncoding(Charsets.UTF_8.name());
  62. String fileName = URLEncoder.encode("用户数据模板", Charsets.UTF_8.name());
  63. response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
  64. EasyExcel.write(response.getOutputStream(), UserExcel.class).sheet("用户数据表").doWrite(list);
  65. }
  66. }