EasyExcel-读取多个sheet的方法
1.SpringBoot自定义cron表达式注册定时任务2.MongoDB + SpringBoot 的基础CRUD、聚合查询3.SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息4.SpringBoot获取Bean的工具类5.Gradle8.4构建SpringBoot多模块项目6.Gradle构建SpringBoot单模块项目7.Java根据URL截图的4种方式8.SpringBoot序列化、反序列化空字符串为null的三种方式9.SpringBoot使用模版导出Word文件:poi-tl
10.EasyExcel-读取多个sheet的方法
11.SpringBoot将数据库中的数据导入到xml文件中
管方文档
读取多个sheet的方法
主要代码
- 下面的is:是你导入的excel文件
ByteArrayInputStream is = new ByteArrayInputStream(new byte[1024]); EasyExcel.read(is, new ExcelListener()) .excelType(ExcelTypeEnum.XLSX) .doReadAll();
监听器(ExcelListener)
- 需要自定义监听器
- 每个sheet读取一次,监听器会运行一次(创建一个监听器对象)
- 我们 extends AnalysisEventListener<Map<Integer, Object>> 的监听器,可以让导入的数据有编号,而且是map格式的,就不用java对象去接收
package com.cc.eed.service.impl; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.read.listener.ReadListener; import java.util.Map; /** * <p></p> * * @author -- * @since 2024/12/25 */ public class ExcelListener extends AnalysisEventListener<Map<Integer, Object>> { //可以获取当前sheet的名字,最开始执行 @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { super.invokeHeadMap(headMap, context); } //读取数据,有一条运行一次 @Override public void invoke(Map<Integer, Object> integerObjectMap, AnalysisContext analysisContext) { } //解析完当前sheet运行 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }
监听器,可以参考管网的:最简单的监听器
// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 @Slf4j public class DemoDataListener implements ReadListener<DemoData> { /** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 100; /** * 缓存的数据 */ private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); /** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */ private DemoDAO demoDAO; public DemoDataListener() { // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数 demoDAO = new DemoDAO(); } /** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 * * @param demoDAO */ public DemoDataListener(DemoDAO demoDAO) { this.demoDAO = demoDAO; } /** * 这个每一条数据解析都会来调用 * * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context */ @Override public void invoke(DemoData data, AnalysisContext context) { log.info("解析到一条数据:{}", JSON.toJSONString(data)); cachedDataList.add(data); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (cachedDataList.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); } } /** * 所有数据解析完成了 都会来调用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); log.info("所有数据解析完成!"); } /** * 加上存储数据库 */ private void saveData() { log.info("{}条数据,开始存储数据库!", cachedDataList.size()); demoDAO.save(cachedDataList); log.info("存储数据库成功!"); } }
合集:
SpringBoot的Demo
分类:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了