开源插件介绍
- Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
- EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是磁盘上一行行读取数据,逐个解析
- EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。
其使用的场景是有许多的,功能也十分强大。
本次我使用的是基础的web写,导出Excel文档。
首先添加一个 链接 ,里面写的还是比较详细了的
基本的使用理念就是把一个集合数据转换成Excel模式的文档。
实现一个基础的web写操作
首先我们来做一些准备工作:
-
第一步引入依赖文件
<!-- 官方文档里面提醒了最好不要跨大版本跟新使用,可能会出现一些不必要的bug --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> </dependency>
-
第二步设置我们的Data数据
@Data
public class DemoData {
//文档最上面行的标题符号,安装定义的上下顺序,呈现出来在Excel中的顺序是从左到右的
//当然官方文档中还有许多其他特殊格式的定义,如:自定义拼接字符、日期格式、小数转百分数
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
}
-
选择需要的写方法,此次在对应的需求中我采用的是web中的写,改方法可以将集合中的数据写入表格中,并提供下载。
/** * 文件下载(失败了会返回一个有部分数据的Excel) * <p> * 1. 创建excel对应的实体对象 参照{@link DownloadData} * <p> * 2. 设置返回的 参数 * <p> * 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大 */ @GetMapping("download") public void download(HttpServletResponse response) throws IOException { // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 // "测试" ----> 最终导出的文件名字 String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 此处的 DemoData.class 为第二步中定义的Data数据, // sheet("模板") "模板" 为 Excel中sheet的名称 // doWrite(data()) data() 为 我们需要导入的数据集合 EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(data()); }
以上三步操作就是实现了简单的写操作,其他操作可以继续在官方文档中学习使用。