阿里EasyExcel入门——读取excel

阿里EasyExcel是一个低内存消耗的处理Excel工具,旨在解决Apache POI在处理大量数据时可能出现的内存溢出问题。文章介绍了如何使用EasyExcel 1.1.2-beta4版本读取Excel文件,包括依赖的Maven坐标,以及读取超过1000行数据的处理方式。通过实现ExcelListener监听器,可以监听到每一行的数据解析,并在解析结束后执行特定操作。相比Apache POI,EasyExcel在处理大行数Excel时更高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyExcel是18年3月份左右发布的,刚刚发布就是打着“低内存”解决POI的oom的口号。经过一年版本迭代现在最新版是1.1.2-beta4

GitHub地址https://github.com/alibaba/easyexcel
maven地址:https://mvnrepository.com/artifact/com.alibaba/easyexcel

easyexcel是在poi基础的上做的开发所有需要poi的jar包。下面的案例是用easyexcel 1.1.2-beta4和poi3.17

全部的jar包:推荐使用maven,现在好多项目都是maven项目,学习一个新想技术,光是找jar就节省了不少时间。

github上介绍的03版和07本的excel读取方法一样,只需要把流作为参数写入方法中和指定ExcelTypeEnum就行。poi就麻烦了。需要自己读取excel的格式再生成对应的workbook。

读取大于1000行数据返回List<? extend BaseRowModel>(实际开发中,根本就无法确定excel的行数,直接用大于1000行的方法)

import java.io.FileInputStream;
import java.io.IOExcep
### 如何使用 EasyExcel 分批次读取大型 Excel 文件 为了高效处理大规模的 Excel 数据,采用分批读取的方式可以有效防止内存溢出并提高性能。通过监听器模式实现这一目标是一个常见做法[^2]。 #### 创建监听器类 首先定义一个继承自 `AnalysisEventListener` 的监听器类用于接收每一行的数据: ```java public class DataListener extends AnalysisEventListener<YourDataClass> { private static final int BATCH_COUNT = 100; List<YourDataClass> list = new ArrayList<>(BATCH_COUNT); private transient SqlSession sqlSession; public DataListener(SqlSession sqlSession){ this.sqlSession = sqlSession; } @Override public void invoke(YourDataClass data, AnalysisContext context) { list.add(data); if (list.size() >= BATCH_COUNT) { saveData(); list.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { saveData(); // 处理剩余未保存的数据 } private void saveData(){ try{ YourMapper mapper = sqlSession.getMapper(YourMapper.class); for (YourDataClass item : list){ mapper.insert(item); } sqlSession.commit(true); }catch(Exception e){ sqlSession.rollback(true); throw new RuntimeException(e.getMessage(),e.getCause()); } } } ``` 此代码片段展示了如何创建一个监听器实例,在每次接收到新数据时将其加入列表,并当达到设定阈值或完成全部分析后批量写入数据库[^4]。 #### 执行读取操作 接下来编写执行实际读取过程的方法: ```java String fileName = "path/to/your/large/excel/file.xlsx"; SqlSession sqlSession = MyBatisUtil.openSession(); try { EasyExcel.read(fileName).head(YourDataClass.class).registerReadListener(new DataListener(sqlSession)).sheet().doRead(); } finally { sqlSession.close(); } ``` 上述方法指定了要读取的目标文件路径以及对应的实体类类型 (`YourDataClass`) ,注册了之前定义好的监听器对象,并启动读取流程。 #### 关键点说明 - **Batch Size**: 设置合理的 batch size 可以平衡效率与资源占用之间的关系。 - **事务管理**: 在每一批次结束之后提交事务;如果发生异常则回滚整个交易以保持数据一致性。 - **线程安全考虑**: 如果多线程环境下运行该程序,则需确保共享变量的安全访问机制。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值