Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。(该段文字采取官方文档,git地址为:https://github.com/alibaba/easyexcel),
1.导出结果如下:
2.pom.xml 导入jar
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.6</version>
</dependency>
3.实体类如下:
注解:a.@data 引用lombok,省略get、set、equals、hashCode、canEqual、toString
b. @ExcelProperty引用easyExcel,value为表头(如上图中,可以理解为有两行表头,故设置了两个值),index为索引,具体位置,从0开始。
c.@ColumnWidth 为列宽
@Data
public class UserInfo {
@ExcelProperty(value = {"报表", "id"}, index = 0)
@ColumnWidth(30)
private String id;
@ExcelProperty(value = {"报表", "名称"}, index = 1)
@ColumnWidth(30)
private String name;
@ExcelProperty(value = {"报表", "年龄"}, index = 2)
@ColumnWidth(30)
private Integer age;
@ExcelProperty(value = {"报表", "邮箱"}, index = 3)
@ColumnWidth(30)
private String email;
@ExcelProperty(value = {"报表", "年龄描述"}, index = 4)
@ColumnWidth(30)
private String ageDesc;
}
4.service
@Service(value = "easyExcelExportService")
public class EasyExcelExportService {
public void reportData() {
//文件生成地址
String filePath = UserServiceImpl.class.getResource("/").getPath();
//文件名
String fileName = "文件名.xls";
try {
//表对象,设置生成文件,实体类
ExcelWriter excelWriter = EasyExcel.write(filePath + fileName, UserInfo.class).
registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
//表头 "yuluo"为图中标签b
WriteSheet writeSheet = EasyExcel.writerSheet("yuluo").needHead(Boolean.TRUE).build();
//添加表头
excelWriter.write(new ArrayList(), writeSheet);
//造的表数据
List<UserInfo> userList = new ArrayList<>();
UserInfo user;
for (int i = 0; i < 10; i++) {
user = new UserInfo();
user.setId(i + "");
user.setAge((int) (Math.random() * 30));
user.setName("userNm" + i);
user.setEmail("1238105230@163.com");
user.setAgeDesc(user.getAge() > 18 ? "成年人" : "未成年");
userList.add(user);
}
//数据填充到表格中
excelWriter.write(userList, writeSheet);
//关闭excel
excelWriter.finish();
} catch (Exception e) {
System.out.println("生成报表失败");
e.printStackTrace();
}
}
}
完成。