EasyExcel
- EasyExcel是阿里开源的一个excel处理框架,以使用简单、节省内存著称,其能大大减少内存占用的原因是因为在解析Excel的时候,并没有把excel文件中所有的内容都一次性全部加载到内存中,而是从文件中一行一行进行读取,逐个解析。
- Java领域中,excel处理的比较有名的框架主要是poi和jxl,但这两个都存在内存占用非常大的问题,如果系统的并发量不大的话基本没有什么问题,但是如果并发使用量特别大的话,极容易造成OOM问题。
- EasyExcel读取文件采用一行一行读取,数据读取后,会调用对应的Listener进行处理,这里采用了观察者的设计模式。
- github地址
show the code
- pom文件
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency>
- 定义跟excel文件中内容对应的java实体类
其中ExcelProperty注解指定了实体类中的属性与excel文件中文件头的对应关系。@Data public class ExcelData { @ExcelProperty("id") private Integer id ; @ExcelProperty("name") private String name ; @ExcelProperty("email") private String email ; }
- 编写相应的Listener
其中,dataList属性为接收数据的存储结构,在listener构造器中进行传入。监听器中,invoke方法为easyExcel每读取一行数据后进行调用的方法,而doAfterAllAnalysed方法为excel文件整体读取完毕后调用的方法。class MyListener2 extends AnalysisEventListener<ExcelData> { private List<ExcelData> dataList ; public MyListener2(List<ExcelData> dataList){ this.dataList = dataList ; } public void invoke(ExcelData data, AnalysisContext context) { dataList.add(data); } public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("数据读取完毕。。。。。。"); } }
- 调用code
@Test public void test_EasyExcel() throws Exception { List<ExcelData> dataList = new LinkedList<ExcelData>(); //指定读取的文件 ExcelReaderBuilder builder = EasyExcel.read("C:\\\\Users\\\\Administrator\\\\Desktop\\\\123.xlsx"); //自动关闭流 builder.autoCloseStream(true); //指定excel文件的type builder.excelType(ExcelTypeEnum.XLSX); //注册数据读取后处理的监听器 builder.registerReadListener(new MyListener2(dataList)); //指定标题与属性的对应关系的class builder.head(ExcelData.class); //读取文件 builder.doReadAll(); //打印获取到的数据 for (ExcelData data : dataList) { System.out.println(data); } }