使用EasyExcel导出excel模板实现教程
一 、什么是EasyExcel
java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便
二、使用步骤
1.导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
2.excel模板


我在这里准备了一个excel表格里面有俩个sheet,分别会用几种方法写入
3.写入excel模板数据
先来一个基础的sheet1的写入数据,excel模板要放入指定位置或修改读取路径
//简单写入
@Test
void test01() {
//获取模板位置
InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
String fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
// 这里 会填充到第一个sheet, 然后文件流会自动关闭
Map<String, Object> map = MapUtils.newHashMap();
map.put("code", "8888");
map.put("leader", "测试用户");
map.put("endTime", "2023-10-10 09:51:32");
map.put("reportNo", "123456789");
EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
}
//集合写入
@Test
void test02() {
List<data> asList = Arrays.asList(
new data(1, "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"),
new data(2, "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"),
new data(3, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3"),
new data(4, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3")
);
InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
// 方案1
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet(1).build();
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
// 如果数据量大 list不是最后一行 参照下一个
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(asList, fillConfig, writeSheet);
//excelWriter.fill(asList, fillConfig, writeSheet);
Map<String, Object> map = MapUtils.newHashMap();
map.put("reportNo", "8888");
excelWriter.fill(map, writeSheet);
}
}
//多个sheet写入
@Test
void test03() {
List<data> asList = Arrays.asList(
new data(1, "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"),
new data(2, "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"),
new data(3, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3"),
new data(4, "4", "4", "4", "4", "4", "4", "4", "4", "4", "4")
);
InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 1; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。
// 实际上可以一直变
WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
Map<String, Object> maps = MapUtils.newHashMap();
maps.put("code", "8888");
maps.put("leader", "测试用户");
maps.put("endTime", "2023-10-10 09:51:32");
maps.put("reportNo", "123456789");
excelWriter.fill(maps, writeSheet1);
WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(asList, fillConfig, writeSheet2);
Map<String, Object> map = MapUtils.newHashMap();
map.put("reportNo", "8888");
excelWriter.fill(map, writeSheet2);
}
}
}
4.效果
简单写入的效果

集合写入的效果

同时写入多个sheet的效果 跟上面俩个一样都会有数据
@GetMapping("/excel")
public Object excel(HttpServletResponse response) throws UnsupportedEncodingException {
List<data> asList = Arrays.asList(
new data(1, "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"),
new data(2, "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"),
new data(3, "3", "3", "3", "3", "3", "3", "3", "3", "3", "3"),
new data(4, "4", "4", "4", "4", "4", "4", "4", "4", "4", "4")
);
//设置下载信息
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("数据写出", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
InputStream templateFileName = getClass().getResourceAsStream("/static/simple.xlsx");
// String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateFileName).build()) {
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
for (int i = 0; i < 1; i++) {
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。
// 实际上可以一直变
WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
Map<String, Object> maps = MapUtils.newHashMap();
maps.put("code", "8888");
maps.put("leader", "测试用户123");
maps.put("endTime", "2023-10-10 09:51:32");
maps.put("reportNo", "123456789");
excelWriter.fill(maps, writeSheet1);
WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(asList, fillConfig, writeSheet2);
Map<String, Object> map = MapUtils.newHashMap();
map.put("reportNo", "8888");
excelWriter.fill(map, writeSheet2);
excelWriter.finish();
}
} catch (Exception e) {
e.printStackTrace();
}
return "成功";
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java final关键字修饰类、方法、变量的不同作用及实战指南
在Java中final关键字是一个修饰符,它用于表示某个类、方法或变量是不可变的或不可继承的,这篇文章主要介绍了Java final关键字修饰类、方法、变量的不同作用及实战指南,需要的朋友可以参考下2026-01-01
SpringBoot Maven项目依赖冲突问题排查与解决全攻略
本文将深入剖析SpringBoot项目中关于Maven依赖冲突问题的排查与解决,文内会提供三种实用排查方案与实战代码,希望可以帮助大家彻底搞定依赖冲突2026-03-03
Java使用RandomAccessFile类对文件进行读写
本篇文章主要介绍了Java使用RandomAccessFile类对文件进行读写,详细的介绍了RandomAccessFile类的使用技巧和实例应用,有兴趣的可以了解一下2017-04-04
Java序列化问题:“Serialized class has not impl
在Java开发中,序列化(Serialization)是一个常见的操作,尤其是在分布式系统、网络通信或数据持久化场景中,然而,序列化过程中可能会遇到各种问题,其中最常见的一个错误是Serialized class has not implement Serializable interface,本文给大家介绍了相关的解决方法2025-02-02


最新评论