EasyExcel是在传统Apache POI基础上进行进一步的封装,使得使用更简单、性能更优。
1.Apache POI
Apache POI是一个开源的Java库,提供跨平台的Java API实现Microsoft Office格式化档案(Excel,Word,PPT等)读写,无需安装Office软件。但存在一些短板:
1.1 学习使用成本高
若需要使用高性能模式,写法复杂,学习成本和维护成本高。
POI分SAX和Dom两种解析模式:
Dom解析模式:一次性将整个文档加载到内存中,在内存中进行读写,对内存消耗大。
SAX模式:在Dom基础上做优化,分一块一块或一行一行读取文档,在一定程度上解决内存溢出问题。但03(.xls)和07(.xlsx)版本存储和解析方式各不相同,并且07版的解压和解压后存储依旧在内存中完成,内存消耗依旧很大。
1.2 内存消耗大
大部分使用POI都是用的userModel模式,写法简单,容易上手且使用简单。但内存消耗大,一个几兆的文件解析需要几百兆的内存,这种情况下,一旦并发上来必定会OOM或频繁full gc。
总结:POI功能强大,但代码书写冗余繁杂且内存消耗较大,高并发容易OOM。
2. EasyExcel
2.1 EasyExcel 的特点
2.1.1 使用简单
EasyExcel 提供简洁的 API 设计,用户可以通过少量代码快速实现 Excel 的读写操作。例如,读取 Excel 文件仅需定义实体类并绑定监听器,无需复杂配置。
2.1.2 内存消耗低
采用逐行解析的流式读写模型,避免一次性加载整个文件到内存,显著降低内存占用。对于百万级数据的大文件,传统工具可能触发 OOM(内存溢出),而 EasyExcel 能稳定处理。
2.1.3 仅支持 Excel 操作
专注于 Excel 文件(如 .xlsx、.xls 格式)的读写,不支持其他格式(如 CSV)或非表格数据。功能边界明确,适合纯 Excel 场景。
2.1.4 不支持图片读取
当前版本无法直接操作 Excel 中的图片或图表,仅处理单元格数据。若需读取图片,需结合其他库(如 Apache POI)或转换工具。
2.2 EasyExcel 对 POI 的优化
EasyExcel重写了POI对07版Excel(.xlsx)解析,使得内存消耗极大的降低。
2.2.1 基于事件的模型
EasyExcel 采用 SAX(Simple API for XML)模式解析 Excel 文件,逐行读取数据并触发事件,避免将整个文件加载到内存中。POI 的默认方式(DOM 模式)会加载整个文件到内存,导致内存占用过高。
2.2.2 对象复用
通过对象复用机制,EasyExcel 在解析过程中重复使用同一对象存储行数据,减少频繁创建和销毁对象的开销。POI 通常为每一行数据创建新对象,增加了内存压力。
2.2.3 缓存优化
EasyExcel 对样式、字符串等共享数据采用缓存策略,避免重复加载。POI 在处理复杂格式时可能重复加载相同资源,占用额外内存。
2.2.4 分片读取
支持分片读取大文件,按需加载数据块,进一步控制内存使用。POI 需要一次性加载整个文件,难以应对超大文件。
2.2.5 性能对比
测试表明,EasyExcel 解析 100 万行 Excel 文件时,内存消耗可降至 POI 的 1/5 以下,同时保持相近的解析速度。对于大规模数据场景,优势尤为明显。