easyexcel 2.2.6 新版本以列表的形式读取 Excel
使用步骤:
注:讲述使用 EasyExcel 的读取 Excel 数据列表的案例,项目基于 springboot + maven 模式。
1、引入 EasyExcel 依赖包,文章以 easyexcel 2.2.6 为基础。
1 2 3 4 5 | <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version> 2.2 . 6 </version> </dependency> |
2、创建 Excel 内容处理转换类 StringArrayExcelReadListener,该类须是 AnalysisEventListener 的子类,并重写 invoke、invokeHeadMap 等方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * StringList 解析监听器 * @author Lingyejun * @since 2022-11-12 */ @Slf4j public class StringArrayExcelReadListener extends AnalysisEventListener<Map<String, String>> { /** * 存储读取到的表头 */ private List<String> head = new ArrayList<>(); /** * 存储读取到的 Excel 数据 */ private List<List<String>> data = new ArrayList<>(); /** * 每解析一行都会回调invoke()方法 * @param item 读取后的数据对象 * @param context 内容 */ @Override public void invoke(Map<String, String> item, AnalysisContext context) { if (item != null && !item.isEmpty()) { List<String> info = item.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); data.add(info); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { } /** * 处理读取到的表头数据 * @param headMap * @param context */ @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { if (headMap != null && !headMap.isEmpty()) { head = headMap.entrySet().stream().map(e -> e.getValue()).collect(Collectors.toList()); } } /** * 获取表头数据信息 * @return */ public List<String> getHead() { return this .head; } /** * 获取读取到的 Excel 数据 * @return */ public List<List<String>> getData() { return this .data; } } |
3、读取文件流,并读取 Excel 文件信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @PostMapping ( "importExcel" ) public void excelImportAdd( @RequestParam ( "file" ) MultipartFile file) { if (file.isEmpty()) { throw new QuZuException( "请选择上传文件" ); } InputStream inputStream; try { inputStream = file.getInputStream(); } catch (IOException e) { e.printStackTrace(); throw new QuZuException( "解析文件错误" ); } StringArrayExcelReadListener listener = new StringArrayExcelReadListener(); ExcelReader reader = EasyExcelFactory.read(inputStream, listener).build(); // 读取Sheet,从第0行开始读取(表示从表头开始读) ReadSheet readSheet = EasyExcel.readSheet( 0 ).build(); reader.read(readSheet); reader.finish(); List<String> head = listener.getHead(); System.out.println(JSON.toJSONString(head)); List<List<String>> data = listener.getData(); System.out.println(JSON.toJSONString(data)); } |
概念普及
1.什么是POI?
其中Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。
在Java技术生态圈中,可以进行Excel文件处理的主流技术包括: Apache POI 、 JXL 、 Alibaba EasyExcel 等。
其中各个技术都有最适合的场景
Apache POI 基于 DOM 方式进行解析,将文件直接加载内存,所以速度较快,适合 Excel 文件数据量不大的应用场景。
JXL 只支持Excel 2003以下版本,所以不太常见。
Alibaba EasyExcel 采用逐行读取的解析模式,将每一行的解析结果以观察者的模式通知处理(AnalysisEventListener),所以比较适合数据体量较大的 Excel 文件解析。
本文我们使用POI作为处理Excel文件的技术。
2.为什么要用POI?
主要用于导入导出大量数据
例:
在开发过程中常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要实现导入、导出Excel的应用时。
有大量的报表需要导出(从数据库导出为Excel),另外在做测试的时候又需要往数据库里面导入很多测试数据(从Excel导入数据库)(如数据分析统计)
即将上线的电商网站,大量的基础数据需要录入,人工一条一条录入不太现实,这时候就用到了poi导入
poi 属于 Apache旗下 http://poi.apache.org/
当然: poi 不仅仅导入导出 Excel;可以用于Office 其他办公软件---word等等;
3.POI的缺点
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够将原本一个3M的excel文件,在之前使用POI sax依然需要100M左右内存才可以完成解析,降低到几M就可以了,并且再大的excel不会出现内存溢出。总之Alibaba EasyExcel相对于Apache POI的话,它是定位为海量数据读取。
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
出处:http://www.cnblogs.com/lingyejun/
若本文如对您有帮助,不妨点击一下右下角的【推荐】。
如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。
转载文章请务必保留出处和署名,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2018-11-12 Mysql闭包表之关于国家区域的一个实践