目录
一.简介
1 官方网站
2 EasyExcel特点
3.相比于poi
4.EasyExcel依赖
二.实际应用
1.编写ExcelUtils工具类
2.编写需要导出的dto类
@ExcelProperty注解
业务层代码
三.总结
开发中总结
GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具
快速开始:EasyExcel(文档已经迁移) · 语雀
Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
工具 | 上手难易程度 |
---|---|
POI | 比较难(需要对源码有所研究 需要写workbook),使用完必须手动关闭流 |
easyExcel | 简单只需要提供数据和模板,不需要关闭流 |
com.alibaba
easyexcel
2.1.7
在我们世家开发中要应用的导出Excel文件,有可能跟跟大家的不同
核心代码
/**
* 导出Excel到web
*
* @param response 响应
* @param excelName Excel名称
* @param sheetName sheet页名称
* @param clazz Excel要转换的类型
* @param data 要导出的数据
* @throws Exception
*/
public static void export2Web(HttpServletResponse response, String excelName, String sheetName, Class clazz, List data) throws Exception {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码
excelName = URLEncoder.encode(excelName, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + excelName + ExcelTypeEnum.XLSX.getValue());
EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(data);
}
由于项目中的代码比较多,我用一个简单的实体类代替这里看一下
package com.springboot.utils.excel.test;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 导出实体类
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class UserDto extends BaseRowModel {
/**
* value: 表头名称
* index: 列的号, 0表示第一列
*/
@ExcelProperty(value = "姓名", index = 0)
private String name;
@ExcelProperty(value = "年龄",index = 1)
private int age;
@ExcelProperty(value = "学校",index = 2)
private String school;
}
注:
使用字段作为表头显然不是我们想要的,EasyExcel提供了ExcelProperty注解,可以定义表头的名称。这个注解还提供了index、order两个属性,可以定义列的位置和顺序。
ArrayList list1 = new ArrayList<>();
for(int i = 1; i < 4; j++){
ArrayList list = new ArrayList<>();
for(int i = 0; i < 4; i++){
UserDate userDto= new userDto();
userDto.setName("bj" + i);
userDto.setAge(18 + i);
userDto.setSchool("北京大学" + i);
list.add(userDto);
}
Sheet sheet = new Sheet(j, 0);
sheet.setSheetName("sheet" + j);
ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();
multipleSheelPropety.setData(list);
multipleSheelPropety.setSheet(sheet);
list1.add(multipleSheelPropety);
}
ExcelUtil.writeWithMultipleSheel("/home/chenmingjian/Downloads/aaa.xlsx",list1);
1.用我们的EasyExcel做导出需要特别注意乱码的情况,我们应该作防止乱码代码验证
2.注意表头设置, 防止我们的index下标重复,这样会报错的
例: