一、引入maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
二、常见问题
-
填充和写的选择
填充其实也不会占用大量内存,用的也是文件缓存,最后统一书写,如果导出的内容各种格式复杂,建议直接用模板然后填充(填充的数据会自动有格式)。如果格式相对简单,建议直接用写,相对来说,直接导出性能还是高一丢丢。
-
部分字段读取或者写入为空
读写反射对象用到了
Cglib
,所以成员变量必须符合驼峰规范,而且使用@Data
不能使用@Accessors(chain = true)
。后续会考虑支持非驼峰。 -
其他问题参考官方文档。
三、读Excel
1. 最简单的读
对象:
@Data
public class Student {
private String name;
private Integer age;
private String address;
private Float money;
}
表格(Excel)
姓名 | 年龄 | 地址 | 余额 |
---|---|---|---|
张三 | 22 | 广东省深圳市 | 6543 |
李四 | 18 | 湖北省武汉市 | 4900 |
王五 | 36 | 云南省昆明市 | 5200 |
-
监听器
-
监听器采用匿名内部类的形式提供。
-
代码
@Test
public void testRead() {
// 被读取的文件绝对路径
String fileName = "C:/location/myFiles/temp/students.xlsx";
// 接收解析出的目标对象(Student)
List<Student> studentList = new ArrayList<>();
// 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
// excel中表的列要与对象的字段相对应
EasyExcel.read(fileName, Student.class, new AnalysisEventListener<Student>() {
// 每解析一条数据都会调用该方法
@Override
public void invoke(Student student, AnalysisContext analysisContext) {
System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
studentList.add(student);
}
// 解析完毕的回调方法
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("excel文件读取完毕!");
}
}).sheet().doRead();
}
2. 指定列的下标或列名
读的方法都一样(包括监听器),只不过要给目标对象的类上加如下注解(demo来自官方文档)。
@Data
public class IndexOrNameData {
/**
* 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name * 去匹配
*/
@ExcelProperty(index = 2)
private Double doubleData;
/**
* 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
*/
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
}
3. 不创建对象的读
不创建对象读取的话,直接用Map接收数据。
@Test
public void readWithoutObj() {
// 被读取的文件绝对路径
String fileName = "C:/location/myFiles/temp/students.xlsx";
// 接收结果集,为一个List列表,每个元素为一个map对象,key-value对为excel中每个列对应的值
List<Map<Integer,String>> resultList = new ArrayList<>();
EasyExcel.read(fileName, new AnalysisEventListener<Map<Integer,String>>() {
@Override
public void invoke(Map<Integer, String> map, AnalysisContext analysisContext) {
System.out.println("解析到一条数据:" + JSON.toJSONString(map));
resultList.add(map);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("excel文件解析完毕!" + JSON.toJSONString(resultList));
}
}).sheet().doRead();
}
4. 其他复杂方式读
读取多个sheet、日期/数字和自定义格式转换、多行头、同步返回、读取表头、web中的读等读法参考官方文档
easyExcel:官网excel · 语雀