1. 前言
最近阿里开源的excel读写项目EasyExcel又火了起来 . 原来是项目又开始维护了, 从1.x 更新到2.x 了 , 而且迭代迅速 , 目前已经更新到 2.1.0-beta3 版本.
关于easyexcel , 其主要目的为降低读取excel时的内存损耗 , 简化读写excel的api .
同时2.x版本提供了很多新功能 , 具体大家可以直接参考官方说明吧 , github文档上写十分详细 (中文) , 这里就不传播一些没啥必要的二三手知识了 , 而且目前该项目还在不停地迭代 , 给contributor一个star也是很有必要的 . 😄
官方地址 : easyexcel仓库地址 , easyexcel官网
这里我基于easyexcel 2.0.5
版本简单封装了一个web读写excel的工具类 , 主要封装了如下功能 :
-
通过注解自定义
LocalDateTime
的读写格式 -
通过注解自定义枚举类型的读写格式
-
自定义
BaseExcelListener
抽象类封装了常用的数据处理逻辑 , 以及补充读取excel过程中读取发生错误被跳过的行号记录 . -
封装了web的读写excel操作
-
…
下面列举主要功能以及相关示例 , 可以直接看源码 , 每个方法都有写完整的注释 , 如果觉得写得还凑合能看的话 , 给我这个刚毕业没多久的小菜鸡点个star呗 😄
附上源码地址 : https://github.com/aStudyMachine/easyexcel-utils
2. 主要功能
2.1 建立excel表每行数据与Java模型的映射
easyexcel读写excel可以基于java 模型的方式 , 也可以使用List<List<String>>
的方式读写excel , 这里我读写操作使用基于java模型的方式 , 通过java类的属性与excel每一列的数据进行对应
注解 : @ExcelProperty
,
具体如何使用注解建立java模型与Excel表数据的映射可以参考 com.wukun.module.easyexcel.pojo
下的两个java模型类Order
类与User
类
/**
* @author WuKun
* @since 2019/10/09
*/
@Data
@AllArgsConstructor
@NoArgsConstructor //必须要保证无参构造方法存在,否则会报初始化对象失败
public class User {
/**
* {@code @ExcelIgnore} 用于标识该字段不用做excel读写过程中的数据转换
*/
@ExcelIgnore
private Integer userId;
/**
* <pre>
* {@code @ExcelIgnore} 中的属性 不建议 index 和 name 同时用
*
* 要么一个对象统一只用index表示列号,
* 例如 : {@code @ExcelProperty(index = 0)}
*
* 要么一个对象统一只用value去匹配列名
* 例如 : {@code @ExcelProperty("姓名")}
*
* 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
* </pre>
*/
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("地址")
private String address;
/**
* <pre>
* {@code @EnumFormat} 注解 :
* 作用 : 与 {@code @ExcelProperty(converter = EnumExcelConverter.class)} 搭配使用
* 转换java枚举与excel中指定的内容
* 属性 :
* - value : 要转换的枚举类class对象
* - fromExcel : 指定excel中用户输入的枚举值的名字的字符串形式,与toJavaEnum中指定的枚举值一一对应
* 以下面的示例来说,fromExcel指定的 "男" 对应 toJavaEnum中的 "MAN" ,
* 当excel中该列读取到"男" 这个字符串时,会自动转化为枚举{@code GenderEnum.MAN},
* 同理在写excel时,如果该字段为{@code GenderEnum.MAN} 时, 写到excel时则转化为 "男"
* - toJavaEnum : 如上所述
*
* 注意 : fromExcel 与 toJavaEnum 这两个属性必须同时使用, 而且两个属性的字符串的数组长度必须相同,
* 若两个属性都不指定 , 则默认 枚举值名字符串转化为对应的枚举 例如: "MAN" <--> {@code GenderEnum.MAN}
* </pre>
*/
@EnumFormat(value = GenderEnum.class,
fromExcel = {
"男", "女"},
toJavaEnum = {
"MAN", "WOMAN"}) // "男" <--> GenderEnum.MAN ; "女" <--> GenderEnum.WOMAN
@ExcelProperty(value = "性别", converter = EnumExcelConverter.class)
private GenderEnum gender;
/**
* <pre>
* {@code @LocalDateTimeFormat} 注解
* 作用: 与 {@code @ExcelProperty(converter = LocalDateTimeExcelConverter.class)} 搭配使用,
* 指定导入导出的时间格式.
* 属性 :
* - value : 日期格式字符串
* </pre>
*/
@ExcelProperty(value = "生日", converter = LocalDateTimeExcelConverter.class)
@LocalDateTimeFormat("yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthday;
}
2.2 导出excel
2.2.1 相关API介绍
web导出excel 根据03 / 07版本分为两个不同的方法 ,分别为EasyExcelUtil
类中以下两个方法 :
-
导出03版本 :
exportExcel2003Format(EasyExcelParams excelParams)
-
导出07版本 :
exportExcel2007Format(EasyExcelParams excelParams)
EasyExcelParams
是使用EasyExcel导出excel需要设置的相关参数 , 包括需要导出的List<T>
数据以及对应的Java模型 , 使用时根据实际情况设置相应的参数即可.
/**
* @author WuKun
* @since 2019/10/14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class