本文主要介绍Java中,使用EasyExcel读取Excel文件中多个Sheet的方法,以及使用示例代码。

1、读取数据的实体对象

@Data
public class DemoData {private String string;private Date date;private Double doubleData;
}

2、保存数据的Listener(监听器)

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
public class DemoDataListener extends AnalysisEventListener<DemoData> {private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);/*** 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;List<DemoData> list = new ArrayList<DemoData>();/*** 假设这个是一个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*/@Overridepublic void invoke(DemoData data, AnalysisContext context) {LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));list.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (list.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listlist.clear();}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();LOGGER.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {LOGGER.info("{}条数据,开始存储数据库!", list.size());demoDAO.save(list);LOGGER.info("存储数据库成功!");}
}

3、读取多个Sheet的示例代码

/*** 读多个或者全部sheet,这里注意一个sheet不能读取多次,多次读取需要重新读取文件* <p>* 1. 创建excel对应的实体对象 参照{@link DemoData}* <p>* 2. 由于默认异步读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}* <p>* 3. 直接读即可*/
@Test
public void repeatedRead() {String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";// 读取全部sheet// 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();// 读取部分sheetfileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";ExcelReader excelReader = EasyExcel.read(fileName).build();// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的ListenerReadSheet readSheet1 =EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();ReadSheet readSheet2 =EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();// 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能excelReader.read(readSheet1, readSheet2);// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的excelReader.finish();
}

相关文档:Java EasyExcel创建读写操作Excel(.xls,.xlsx)用法及示例代码

Java 使用EasyExcel读取Excel中多个sheet方法及示例代码相关推荐

  1. java通过poi读取excel中的日期类型数据或自定义类型日期

    java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的  12-十月-2019,而Excel中输入的是 2019/10/12 ...

  2. python 实现读取excel中的所有sheet后,增加新的sheet,生成新的excel文件

    python 实现读取excel中的所有sheet后,增加新的sheet,生成新的excel文件 import pandas as pd import osPath = r"C:\Users ...

  3. Python pandas 保存Excel自动调整列宽的方法及示例代码

    本文主要介绍Python中,使用pandas.ExcelWriter保存Excel文件数据时,自动判断调整列的宽度方法,以及相关的示例代码. 原文地址:Python pandas 保存Excel自动调 ...

  4. .NET Core(C#) EPPlus创建Excel(.xlsx)写入数据的方法及示例代码

    EPPlus是一个使用Open Office XML(Xlsx)文件格式,能读写Excel(.xlsx)文件的开源组件.本文主要介绍.NET Core(C#)中使用EPPlus创建Excel(.xls ...

  5. java设置excel标题栏_Java EasyExcel写入Excel中复杂头(head)表中的标题的方法及示例代码...

    数据标题示例: 1、实体对象@Data public class ComplexHeadData { @ExcelProperty({"主标题", "字符串标题" ...

  6. java操控easyexcel读取excel表格数据为null或部分字段为null

    数据部分字段为null或者全部为null: 可以看到很多字段出现null,解决办法很简单如下: 一.实体类中需要添加toString方法(快捷生成toString键:Ctrl+Ins) @Overri ...

  7. java通过poi读取excel中的日期类型

    1.问题分析 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2020,而Excel中输入的是 2020/10/12 或 2020-10-12 poi处理excel时,当 ...

  8. java createfile_Java 使用createFile和createTempFile创建文件的方法及示例代码

    1、创建文件 可以使用createFile(Path, FileAttribute>)方法创建具有初始属性集的空文件 .例如,如果在创建时希望文件具有特定的文件权限集,请使用该createFil ...

  9. abap中读取excel中不同的sheet数据_Python 如何将数据写入Excel的不同或同一个工作簿中...

    在进行日常的数据分析统计时,很多时候我们需要将不同数据写入到同一个Excel文件的不同工作簿或同一个工作簿中.本文主要介绍 Python 如何将多个 DataFrame 写入同一个 Excel 不同或 ...

最新文章

  1. Python3 网络编程(转载)
  2. 二、MySql优化七个查询命令特征
  3. 记一次OutOfMemory定位过程
  4. python中zip( )的使用
  5. 2.3_模型和交叉检验
  6. linux调用python函数,python脚本里执行linux命令的时候如何调用python的函数?
  7. 如何设计一门语言(十二)——设计可扩展的类型
  8. 我教育和科研计算机网是指,我校成为中国教育和科研计算机网湘潭城市节点单位...
  9. 新天龙官网服务器更新消息,新天龙八部怀旧服太火,增开7组服务器不够用,还得继续扩容...
  10. handler类型的定时器
  11. 前端开发如何做好本地接口模拟
  12. OEA中的缓存模块设计
  13. JDK动态代理入门、JDK动态代理原理、为什么JDK动态代理是基于接口的
  14. [Vue]动态加载组件的四种方式
  15. 图形化硬件编程 ——数码管时钟——之米思齐篇
  16. Photoshop CS 5 注册方法
  17. 服务器通过无线modem接入4g网络,24-4G Modem管理配置
  18. 编写第一个操作WORD文档的应用程序
  19. 郭涛 黄渤 田原09贺岁大片《高兴》DVD修正版
  20. appweb的开发步骤简介

热门文章

  1. 2022Android大厂面试真题,新鲜出炉的蚂蚁金服面经
  2. ASCII码表,运算符,自加,加号的三种用法
  3. Install/uninstall .deb files
  4. [车联网安全自学篇] ATTACK安全之检测BootLoader+内核+文件系统的安全启动固件的异常篡改行为「一」
  5. c语言语句大全翻译,C语言语句求翻译
  6. linux中磁盘分区fdisk,管理磁盘分区之fdisk详解
  7. 中南民大计算机学院复试细则,2016年中南民族大学计算机科学学院数据库系统概论考研复试题库...
  8. python中的findall函数_关于Python正则表达式 findall函数问题详解
  9. 热电堆传感器是什么东西_热电堆传感器是干什么用的
  10. datepicker unity 下载_datePicker