一、前言
1.EasyExcel是阿里巴巴开源的一个excel处理框架, 以使用简单、节省内存著称。 EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
2.EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者模式通知处理(AnalysisEventListener)
二、如何使用EasyExcel读取文件数据
1.首先需要添加easyexcel的相关依赖包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>
2.使用EasyExcel进行读操作,读的时候要ExcelListener监听器。
首先定义一个类,继承AnalysisEventListener。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
public class ExcelListener extends AnalysisEventListener<Map<Integer,String>>{
private List<Map<Integer,String>> excelList =new ArrayList<Map<Integer,String>>();
private Map<Integer,String> headMap = new HashMap<Integer, String>();
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
excelList.add(data);
}
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
this.headMap=headMap;
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("已解析");
}
public List<Map<Integer,String>> getExcelList(){
return excelList;
}
}
这里用的是Map<Integer, String> 来接收每一行的数据,当然也可以自己定义一些对象。
3.使用EasyExcel.read()方法读取数据,代码如下:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
public class ExcelUtils {
public static List<Map<Integer,String>> readExcel(InputStream inputStream){
//该监听器一行行将文件读取到内存
ExcelListener excelListener =new ExcelListener();
ExcelReader excelReader = null;
try {
//把前端传来的文件转成输入流
// 初始化对象
excelReader = EasyExcel.read(inputStream, excelListener).build();
// 指定读取哪一个sheet
ReadSheet readSheet = EasyExcel.readSheet(0).build();
// 开始读取
excelReader.read(readSheet);
List<Map<Integer,String>> excelList = excelListener.getExcelList();
return excelList;
} catch (Exception e) {
throw new RuntimeException("文件错误");
} finally {
if (excelReader != null) {
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();
}
}
}
public static void main(String[] args) throws FileNotFoundException {
InputStream in =new FileInputStream(new File("F://任务配置参数(3).xlsx"));
List<Map<Integer,String>> list = readExcel(in);
list.stream().forEach(x->System.err.println(x));
}
}
运行main方法,结果如下:
总结,我们可以根据自己的需要选择实现ExcelListener接口、使用回调函数或继承AnalysisEventListener类来处理读取Excel文件中的。