一、简单使用
引入依赖:
这里我们可以使用最新的4.0.2
版本,也可以选择之前的稳定版本,3.1.x
以后的版本API
大致相同,新的版本也会向前兼容(3.1.x
之前的版本,部分API
可能在高版本被废弃),关于POI、JDK
版本适配问题,具体可参考官网-版本说明。
XML
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.2</version>
</dependency>
下载excel文件:
java
@GetMapping("/download")
public void excelDownload(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
EasyExcel.write(response.getOutputStream(), Data.class).sheet("模板").doWrite(datas);
String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
}
读取excel文件:
java
@PostMapping("/read")
public void read(MultipartFile file) throws IOException {
1、这只是简单演示,一般不使用 doReadSync 方法,
此方法同步执行的,即它会阻塞当前线程,直到读取完整个Excel文件并返回所有数据。
读取大型文件时,可能会导致程序响应变慢或阻塞。
2、使用head映射字段时,该实体类上不能加 @Accessors 注解,加上此注解
会字段映射不成功。
3、一般会使用监听器 + doRead 方法实现excel文件的读取
List<Data> datas = EasyExcel.read(file.getInputStream()).sheet().head(Data.class).doReadSync();
System.out.println(datas);
}
二、常用注解
1、@ExcelProperty注解
这个注解应该是最常用的注解,通常用来映射字段跟excel的列名,有以下几个属性:
名称 | 默认值 | 描述 |
---|---|---|
value | 空 | 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 |
order | Integer.MAX_VALUE | 优先级高于value ,会根据order 的顺序来匹配实体和excel中数据的顺序 |
index | -1 | 优先级高于value 和order ,会根据index 直接指定到excel中具体的哪一列 |
converter | 自动选择 | 指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext<T>) 方法即可 |
注意:
1、如果没有特殊的调整一般,使用value属性就够了,在读取或者导出时都能匹配或者映射为对应的列名。
2、value 跟 index 可以在导出数据的时候配合使用,value指定列名,index指定该列的顺序,例如:
@ExcelProperty(value = "性别",index = 3) 代表列名为 性别,导出到第三列的位置。 但是在导入时,如果设置了order属性,表示会根据指定列来匹配字段,例如上面就会将第三列匹配为性别字段,如果该列字段为空,或者字段类型不匹配就会报错,一般在读取数据时不会这么使用这个属性。
3、order 属性代表按顺序匹配,比如说导出数据时,会按照字段上该属性的顺序,一次为列设置对应字段的值,比如order最小的,就匹配第一列的值,依次往后,在导出时也是一样,order最小的值,导出到第一列依次往后。