持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
作者平台:
| CSDN:blog.csdn.net/qq\_4115394…
| 知乎:www.zhihu.com/people/1024…
| GitHub:github.com/JiangXia-10…
| 微信公众号:1024笔记
本文一共2149字,预计阅读7分钟
前言
在日常的开发过程中免不了需要使用到java对于excel进行一些基本的读写操作。最近在新开发一个项目的时候,使用到easyexcel,感觉非常好用,分享给大家。
什么是EasyExcel
Java解析、生成Excel最为常见的一些框架有Apache poi、jxl等。但是他们都存在耗内存的问题,一旦并发较大就一定会出现OOM或者JVM频繁的full gc。而EasyExcel重写了poi对07版Excel的解析,一个3M的excel如果使用POI进行解析需要100M左右内存,但是如果使用EasyExcel对其进行解析则对于内存的需求可以降低到只需要几兆,并且再大的excel也不会出现内存溢出的情况。
EasyExcel是阿里巴巴开源的一个基于Java的简单、省内存的读写Excel的excel解析工具,以使用简单、节省内存著称,它能够在尽可能节约内存的情况下支持读写较大的Excel文档。
EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理。
关于更多EasyExcel相关知识的官方手册地址如下:
alibaba-easyexcel.github.io/docs/curren…
如何使用EasyExcel
对于excel或者任何其他文档的基本操作无外乎写操作和读操作。先看看EasyExcel如何对excel进行写操作。
首先需要在项目中引入easyexcel相关的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
然后创建一个基本的entity实体类,作为基本的操作对象:
import com.alibaba.excel.annotation.ExcelProperty;
//设置表头和需要添加的数据字段
public class DemoData {
//设置表头名称
@ExcelProperty("编号")
private int sno;
//设置表头名称
@ExcelProperty("姓名")
private String sname;
//get、set方法
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "DemoData{" +
"sno=" + sno +
", sname='" + sname + '\'' +
'}';
}
}
创建一个基本的方法,循环生成数据用于写入excel文件中:
//循环设置要添加的数据,最终封装到list集合中
private static List<DemoData> data() {
List<DemoData> list = new ArrayList<DemoData>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setSno(i);
data.setSname("亚索"+i);
list.add(data);
}
return list;
}
准备工作完成之后,那么接下来就是真正的如何使用easyexcel对数据进行写入操作了,这里的写操作主要有两种方法:
方法一:
public static void main(String[] args) throws Exception {
// 写法1
String fileName = "F:\\easyExcelDemo1.xlsx";
// 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("第一种写入方法").doWrite(data());
}
方法二:
public static void main(String[] args) throws Exception {
// 写法2,这种方法需要自己手动关闭流
String fileName = "F:\\easyExcelDemo2.xlsx";
// 这里 需要指定写用哪个class去写
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("第二种写入方法").build();
excelWriter.write(data(), writeSheet);
/// 千万别忘记finish 会帮忙关闭流
excelWriter.finish();
}
这里方法一和方法二的区别就是方法二需要自己手动关闭流。
读操作的基本操作如下:
首先需要创建一个读取操作的监听器:
//读取excel的监听器
public class ExcelListener extends AnalysisEventListener<ReadData> {
//创建list集合用于封装最终的数据
List<ReadData> list = new ArrayList<ReadData>();
//一行一行读取excle内容
//重写AnalysisEventListener的invoke方法
@Override
public void invoke(ReadData user, AnalysisContext analysisContext) {
list.add(user);
}
//读取excel表头信息 重写AnalysisEventListener的invokeHeadMap方法
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息:"+headMap);
}
//读取操作完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
调用方法实现最终的读取excel效果,这里的读取操作也有两种方法:
方法一:
String fileName = "F:\\01.xlsx";
EasyExcel.read(fileName, ReadData.class, new ExcelListener()).sheet().doRead();
这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭。
方法二:
InputStream in = new BufferedInputStream(new FileInputStream("F:\\01.xlsx"));
ExcelReader excelReader = EasyExcel.read(in, ReadData.class, new ExcelListener()).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
excelReader.finish();
}
这里依旧需要手动关闭流,千万别忘记关闭,因为读的时候会创建临时文件,如果不关闭到时侯磁盘会崩的。
除了读写excel,还有如何对已有excel的数据进行填充,这里其实主要调用的也是easyexcel的write方法:
private static void main() {
List list = new ArrayList();
list.add(new DemoData("1", "亚索"));
list.add(new DemoData("2", "李青"));
list.add(new DemoData("3", "盖伦"));
ExcelWriterBuilder writerBuilder = EasyExcel
.write("F:\\01.xlsx", DemoData.class)
.withTemplate("F:\\011.xlsx");
WriteSheet writeSheet = writerBuilder.sheet().build();
ExcelWriter excelWriter = writerBuilder.build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
excelWriter.fill(list, fillConfig, writeSheet);
Map map = new HashMap();
map.put("total",50);
excelWriter.fill(map, writeSheet);
//调用finish方法
excelWriter.finish();
}
这里需要注意的是在填充玩多结果数据后,要强制换行,不然后续的单结果数据会发生覆盖现象,主要就是下述代码:
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
总结
以上就是对于easyexcel对于excel的读写和填充操作的基本操作。使用easyexcel对excel进行操作简单,对于内存的使用较低。更多关于easyexcel的使用可以参考开发手册:
alibaba-easyexcel.github.io/docs/curren…
相关推荐
本文使用 文章同步助手 同步