• 使用easyPOI导入excel转换为对象集合


    1.介绍

    easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法

    2.完成导入excel转换为对象集合

    2.1导入easypoi的依赖

    1. cn.afterturn
    2. easypoi-spring-boot-starter
    3. 4.3.0
    4. cn.afterturn
    5. easypoi-base
    6. 4.3.0
    7. cn.afterturn
    8. easypoi-web
    9. 4.3.0
    10. cn.afterturn
    11. easypoi-annotation
    12. 4.3.0

    2.2 需要导入的excel如下

     2.3 定义excel对应的实体类

    1. /**
    2. * @author wangli
    3. * @create 2022-08-27 15:35
    4. */
    5. @Data
    6. @ToString
    7. public class Person {
    8. @Excel(name = "序号")
    9. private int id;
    10. @Excel(name = "名字")
    11. private String name;
    12. @Excel(name = "年纪")
    13. private Integer age;
    14. }

    @Excel

    这个是必须使用的注解,如果需求简单只使用这一个注解也是可以的,涵盖了常用的Excel需求,需要大家熟悉这个功能,主要分为基础,图片处理,时间处理,合并处理几块,name_id是上面讲的id用法,这里就不累言了

    属性类型默认值功能

    name

    String

    null

    列名,支持name_id

    needMerge

    boolean

    fasle

    是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)

    orderNum

    String

    "0"

    列的排序,支持name_id

    replace

    String[]

    {}

    值得替换 导出是{a_id,b_id} 导入反过来

    savePath

    String

    "upload"

    导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/

    type

    int

    1

    导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本

    width

    double

    10

    列宽

    height

    double

    10

    列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意

    isStatistics

    boolean

    fasle

    自动统计数据,在追加一行统计,把所有数据都和输出 这个处理会吞没异常,请注意这一点

    isHyperlink

    boolean

    false

    超链接,如果是需要实现接口返回对象

    isImportField

    boolean

    true

    校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id

    exportFormat

    String

    ""

    导出的时间格式,以这个是否为空来判断是否需要格式化日期

    importFormat

    String

    ""

    导入的时间格式,以这个是否为空来判断是否需要格式化日期

    format

    String

    ""

    时间格式,相当于同时设置了exportFormat 和 importFormat

    databaseFormat

    String

    "yyyyMMddHHmmss"

    导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出

    numFormat

    String

    ""

    数字格式化,参数是Pattern,使用的对象是DecimalFormat

    imageType

    int

    1

    导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的

    suffix

    String

    ""

    文字后缀,如% 90 变成90%

    isWrap

    boolean

    true

    是否换行 即支持\n

    mergeRely

    int[]

    {}

    合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了

    mergeVertical

    boolean

    fasle

    纵向合并内容相同的单元格

    fixedIndex

    int

    -1

    对应excel的列,忽略名字

    isColumnHidden

    boolean

    false

    导出隐藏列

    2.4 使用MultipartFile从前端接收excel文件

    我们使用easyPOI的

    importExcel(File file, Class pojoClass, ImportParams params)
    

    方法,需要传入File对象,但是我们传入的是MultipartFile,所以我们还需将MultipartFile转换为File

    所以我再下面也提供了转换的方法multipartFileToFile

    1. /**
    2. * 传入excel文件转换为对象集合
    3. * @param multipartFile
    4. */
    5. @PostMapping("/excelReport")
    6. public void excelReport(@ModelAttribute("multipartFile") MultipartFile multipartFile) {
    7. try {
    8. ImportParams params = new ImportParams();
    9. //表格标题行数,默认0
    10. params.setTitleRows(0);
    11. //表头行数,默认1
    12. params.setHeadRows(1);
    13. List list = null;
    14. //导入excel
    15. list = ExcelImportUtil.importExcel(multipartFileToFile(multipartFile), Person.class, params);
    16. System.out.println(list.size());
    17. list.forEach(System.out::println);
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. }
    21. }

    2.5 将MultipartFile转换为File(此方法和直接使用,无需理解,只是工具类)

    1. /**
    2. * MultipartFile转化为file
    3. *
    4. * @param file
    5. * @return
    6. * @throws Exception
    7. */
    8. public File multipartFileToFile(MultipartFile file) throws Exception {
    9. File toFile = null;
    10. if (file.equals("") || file.getSize() <= 0) {
    11. file = null;
    12. } else {
    13. InputStream ins = null;
    14. ins = file.getInputStream();
    15. toFile = new File(file.getOriginalFilename());
    16. inputStreamToFile(ins, toFile);
    17. ins.close();
    18. }
    19. return toFile;
    20. }
    21. private static void inputStreamToFile(InputStream ins, File file) {
    22. try {
    23. OutputStream os = new FileOutputStream(file);
    24. int bytesRead = 0;
    25. byte[] buffer = new byte[8192];
    26. while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
    27. os.write(buffer, 0, bytesRead);
    28. }
    29. os.close();
    30. ins.close();
    31. } catch (Exception e) {
    32. e.printStackTrace();
    33. }
    34. }

    2.6 启动项目使用postman进行测试

    2.7 查看转换效果

     

     

  • 相关阅读:
    (附源码)ssm芜湖公共书房服务平台 毕业设计 250859
    使用 Docker 部署高可用 MongoDB 分片集群
    SpringBoot之@ConfigurationProperties和@Value用法详解
    SpringSecurity权限管理基本概念和整体架构介绍
    运动装备经营小程序商城效果如何
    【Rust日报】2022-10-30 如何修补 Rust 中即将出现的 OpenSSL 漏洞
    模块化编程
    动态链接库与可执行文件
    Linux中for循环
    string类详解
  • 原文地址:https://blog.csdn.net/wang20010104/article/details/126563348