当前位置:   article > 正文

Springboot 基于EasyPoi的excel导入导出_springboot easypoi

springboot easypoi

1. EasyPoi简介

EasyPoi功能如同名字easy一样,主打的就是容易,让一个没见过也没接触过poi的人员就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板于洋,完成以前复杂的写法。

2. EasyPoi主要功能

  • 基于注解的导入导出,修改注解就可以修改Excel。
  • 支持常用的样式自定义。
  • 基于Map可以灵活定义的表头字段。
  • 支持一对多的导出导入。
  • 支持模板的导出,一些常见的标签,自定义标签。
  • 支持HTML/Excel转换,模板不能满足用户的需求时,可以使用这个功能。
  • 支持Word的导出,支持图片。

3, EasyPoi注解介绍 

EasyPoi起因就是Excel的导入导出,最初的模板时实体和Excel的对应。model-row,filed-col这样利用注解我们可以容易做到excel的导入导出。经过一段时间发展,现在注解有5个,分别是:

  • @Excel 作用到filed上面,是对Excel一列描述。
  • @ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个半截,班级可以用集合表示。
  • @ExcelEntity 表示一个继续深入导出的实体,但它没有太多实际意义,只是告诉系统这个对象里面同样有导出的字段
  • @Excelgnore 和名字一样表示这个字段被忽略跳过这个导出。
  • @ExcelTarget 这个是用于最外层的对象,描述这个对象的id,一边支持一个对象可以针对不同导出做出不同处理。

3.1 @Excel 

这个是必须使用的注解,如果需求简单只使用这一个注解也是可以的,涵盖了常用的Excel需求,需要大家熟悉这个功能。

属性类型默认值功能
nameStringnull列名,支持name_id
needMergebooleanfasle是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNumString“0”列的排序,支持name_id
replaceString[]{}值得替换 导出是{a_id,b_id} 导入反过来
savePathString“upload”导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/
typeint1导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
widthdouble10列宽
heightdouble10列高,这个会被废弃,注意
isStatisticsbooleanfasle自动统计数据,在追加一行统计,把所有数据都和输出[这个处理会吞没异常,请注意这一点]
isHyperlinkbooleanfalse超链接,如果是需要实现接口返回对象
isImportFieldbooleantrue校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id
exportFormatString“”导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormatString“”导入的时间格式,以这个是否为空来判断是否需要格式化日期
formatString“”时间格式,相当于同时设置了exportFormat 和 importFormat
databaseFormatString“yyyyMMddHHmmss”导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormatString“”数字格式化,参数是Pattern,使用的对象是DecimalFormat
imageTypeint1导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
suffixString“”文字后缀,如% 90 变成90%
isWrapbooleantrue是否换行 即支持\n
mergeRelyint[]{}合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了
mergeVerticalbooleanfasle纵向合并内容相同的单元格
fixedIndexint-1对应excel的列,忽略名字
isColumnHiddenbooleanfalse导出隐藏列

3.2 @ExcelCollection 

一对多的集合注解,用以标记集合是否被数据以及集合的整体排序

属性类型默认值功能
idStringnull定义ID
nameStringnull定义集合列名,支持nanm_id
orderNumint0排序,支持name_id
typeClass<?>ArrayList.class导入时创建对象使用

4. 如何使用EasyPoi 

4.1 添加maven依赖

<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-spring-boot-starter</artifactId>
   <version>4.2.0</version>
</dependency>

 4.2 导入功能的实现

首先定义需要导入的数据类型UserImportVO,并使用@Excel注解与excel列映射,导入的时候通常需要对导入的数据进行一些校验。

4.2.1 UserImportVO自定义类

EasyPoi的校验使用也很简单,对象上加上通用的校验规则,配置下需要校验就可以了,校验主要是JSR303规范,可以结合Hibernate Validator使用

自定义类对象实现IexcelModer,IexcelDataModel接口,可获取到错误校验信息。

  1. @Data
  2. public class UserImportVO implements Serializable,IExcelModel, IExcelDataModel {
  3. @NotBlank
  4. @Excel(name = "姓名")
  5. private String realName;
  6. @Excel(name = "性别", replace = { "男_1", "女_2" })
  7. private Integer sex;
  8. @Excel(name = "出生日期", format = "yyyy-MM-dd")
  9. private Date birthday;
  10. @Length(min=1, max=11, message = "请填写正确的手机号")
  11. @Excel(name = "手机号码")
  12. private String phone;
  13. @Excel(name = "固定电话")
  14. private String tel;
  15. @Email(message = "请填写正确的邮箱地址")
  16. @Excel(name = "邮箱")
  17. private String email;
  18. @Excel(name = "头像地址")
  19. private String avatar;
  20. @Excel(name = "信息")
  21. private String errorMsg;
  22. private Integer rowNum;
  23. @Override
  24. public Integer getRowNum() {
  25. return this.rowNum;
  26. }
  27. @Override
  28. public void setRowNum(Integer i) {
  29. this.rowNum = i;
  30. }
  31. @Override
  32. public String getErrorMsg() {
  33. return this.errorMsg;
  34. }
  35. @Override
  36. public void setErrorMsg(String s) {
  37. this.errorMsg = s;
  38. }
  39. }
4.2.2 编写controller导入方法
  1. @Autowired
  2. private IUserService userService;
  3. @PostMapping("/importExcel")
  4. public String importExcel(@RequestParam("file") MultipartFile file) {
  5. try {
  6. String result = userService.importExcel(file);
  7. return result;
  8. } catch (Exception e) {
  9. return "导入失败";
  10. }
  11. }
4.2.3 编写Service方法 
  1. @Autowired
  2. private UserVerifyHandler userVerifyHandler;
  3. @Override
  4. public String importExcel(MultipartFile file) throws Exception{
  5. ImportParams importParams = new ImportParams();
  6. //表格标题行数,默认0
  7. importParams.setTitleRows(1);
  8. //是否需要校验上传的Excel
  9. importParams.setNeedVerify(true);
  10. //告诉easypoi我们自定义的验证器
  11. importParams.setVerifyHandler(userVerifyHandler);
  12. ExcelImportResult<UserImportVO> result = ExcelImportUtil.importExcelMore(file.getInputStream(),UserImportVO.class,importParams);
  13. if (!result.isVerifyFail() && !CollectionUtils.isEmpty(result.getList())) {
  14. for (UserImportVO vo : result.getList()) {
  15. log.info("从Excel导入数据到数据库的详细为 :{}", vo);
  16. User user = new User();
  17. BeanUtil.copyProperties(vo,user);
  18. this.save(user);
  19. }
  20. } else {
  21. for (UserImportVO vo : result.getFailList()) {
  22. log.info("校验失败的详细为 :{}", vo);
  23. }
  24. return "文档校验失败";
  25. }
  26. return "导入成功";
  27. }
 4.2.4 自定义校验规则

通用的校验满足不了所有的校验,例如还需要通过查询数据库,校验数据的唯一性,此时需要自定义一个校验规则,实现IexcelVerifyHandler接口。

  1. @Component
  2. public class UserVerifyHandler implements IExcelVerifyHandler<UserImportVO> {
  3. @Autowired
  4. private IUserService userService;
  5. @Override
  6. public ExcelVerifyHandlerResult verifyHandler(UserImportVO vo) {
  7. ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult();
  8. //假设我们要添加用户,现在去数据库查询realName,如果存在则表示校验不通过。
  9. User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getRealName,vo.getRealName()));
  10. if (user!=null) {
  11. result.setMsg("唯一校验失败");
  12. result.setSuccess(false);
  13. return result;
  14. }
  15. result.setSuccess(true);
  16. return result;
  17. }
  18. }

 4.3 导出功能实现

4.3.1 UserExportVO导出类

导出类不需要配置校验规则,只需要定义要导出的信息。

  1. @Data
  2. public class UserExportVO implements Serializable {
  3. @Excel(name = "姓名")
  4. private String realName;
  5. @Excel(name = "性别", replace = { "男_1", "女_2" }, suffix = "生")
  6. private Integer sex;
  7. @Excel(name = "出生日期", format = "yyyy-MM-dd")
  8. private Date birthday;
  9. @Excel(name = "手机号码")
  10. private String phone;
  11. @Excel(name = "固定电话")
  12. private String tel;
  13. @Excel(name = "邮箱")
  14. private String email;
  15. @Excel(name = "头像地址")
  16. private String avatar;
  17. }
4.3.2 导出Controller类

编写导出的controller类

  1. @GetMapping("/exportExcel")
  2. public void export(HttpServletResponse response) {
  3. //查询要导出的数据
  4. List<UserExportVO> users = userService.getUserExportList();
  5. ExcelUtil.exportExcelX(users, "测试导出表", "sheet1", UserExportVO.class, "测试导出表.xlsx", response);
  6. }
4.3.3 Service层

编写service层查询需要导出的数据,把查询出来的集合转化成导出VO集合。

  1. @Override
  2. public List<UserExportVO> getUserExportList() {
  3. List<User> users = this.list();
  4. //users集合转成export集合
  5. List<UserExportVO> exportVOList = users.stream().map(user -> {
  6. UserExportVO vo = new UserExportVO();
  7. BeanUtils.copyProperties(user, vo);
  8. return vo;
  9. }).collect(Collectors.toList());
  10. return exportVOList;
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/551625
推荐阅读
相关标签
  

闽ICP备14008679号