一、EasyExcel特点
-
Java 领域解析、生成 Excel 比较有名的框架有 Apache poi、jxl 等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会 OOM 或者 JVM 频繁的 FULL GC。
-
EasyExcel 是阿里巴巴开源的一个 excel 处理框架,以使用简单、节省内存著称。 EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
-
EasyExcel 采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。
简单地理解:可以方便、快速的读取、写入 execl 内容。
【官方文档地址:】
https://alibaba-easyexcel.github.io/index.html
https://www.yuque.com/easyexcel
二、Excel的应用场景及优势
-
数据导入:减轻录入工作量
-
数据导出:统计信息归档
-
数据传输:异构系统之间数据传输
EasyExcel优势:
注解式自定义操作。
输入输出简单,提供输入输出过程的接口
支持一定程度的单元格合并等灵活化操作
三、常用注解
-
@ExcelProperty:指定当前字段对应 excel 中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个混着用怎么去排序的。
-
@ExcelIgnore:默认所有字段都会和excel去匹配,加了这个注解会忽略该字段
-
@DateTimeFormat:日期转换,用 String 去接收 excel 日期格式的数据会调用这个注解。里面的 value 参照 java.text.SimpleDateFormat
-
@NumberFormat:数字转换,用 String 去接收 excel 数字格式的数据会调用这个注解。里面的 value 参照 java.text.DecimalFormat
-
@ExcelIgnoreUnannotated:默认不加 ExcelProperty 的注解的都会参与读写,加了不会参与
四、使用EasyExcel
1. 导入依赖
<!-- easyexcel 主要依赖 这一个基本上就够了-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.4</version>
</dependency>
2.创建实体类
@ExcelProperty注解也可以用index进行索引设置表头顺序
@HeadRowHeight(30) // 标题高度
@ContentRowHeight(30) // 内容高度
@ColumnWidth(16) // 行高
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserVo {
@ExcelProperty("编号")
@ColumnWidth(40)
private String id;
@ExcelProperty("名称")
private String name;
@ExcelProperty("性别")
private String sex;
@ExcelProperty("地址")
@ColumnWidth(25)
private String address;
@ExcelProperty("电话")
@ColumnWidth(25)
private String phone;
}
3.导出为Excel
创建Controller,访问接口下载导出Excel
@Controller
public class TestController {
@GetMapping("/excel")
public void excel(HttpServletResponse response) {
List<UserVo> list = new ArrayList<>();
for (int i = 1; i <= 11; i++) {
UserVo userVo = new UserVo(UUID.randomUUID().toString(),
(i % 2 == 0 ? "吕" : "蓝") + "某某",
i % 2 == 0 ? "女" : "男",
"广东省广州市第" + i + "区",
"4404-" + String.valueOf(i * 31 * 31));
list.add(userVo);
}
try {
// 响应的内容类型为excel
response.setContentType("application/vnd.ms-excel");
// 指定服务器响应给浏览器的编码
response.setCharacterEncoding("utf-8");
// 通知浏览器以附件的形式下载处理,设置返回头要注意文件名有中文,这里URLEncoder.encode可以防止中文乱码
String fileName = URLEncoder.encode("用户列表" + System.currentTimeMillis(), "utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
// 获取通向浏览器的字节流
ServletOutputStream outputStream = response.getOutputStream();
// 导出列表内容到输出流中
EasyExcel.write(outputStream, UserVo.class)
.sheet("sheet")
.doWrite(list);
} catch (IOException e) {
System.err.println("导出Excel失败:" + e);
}
}
}
导出结果