Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

 更新时间:2021年03月18日 11:27:28   作者:不会编程的派大星  
这篇文章主要介绍了Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一.读Excel

1.Excel表格示例

在这里插入图片描述

2.对象示例

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

3.监听器(重点部分)

// 有个很重要的点 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
  */
 @Override
 public void invoke(DemoData data, AnalysisContext context) {
  LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
  list.add(data);
  // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
  if (list.size() >= BATCH_COUNT) {
   saveData();
   // 存储完成清理 list
   list.clear();
  }
 }
 /**
  * 所有数据解析完成了 都会来调用
  *
  * @param context
  */
 @Override
 public void doAfterAllAnalysed(AnalysisContext context) {
  // 这里也要保存数据,确保最后遗留的数据也存储到数据库
  saveData();
  LOGGER.info("所有数据解析完成!");
 }
 /**
  * 加上存储数据库
  */
 private void saveData() {
  LOGGER.info("{}条数据,开始存储数据库!", list.size());
  demoDAO.save(list);
  LOGGER.info("存储数据库成功!");
 }
}

4.持久层-将读出的Excel表格内容存到数据库

/**
 * 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。
 **/
public class DemoDAO {
 public void save(List<DemoData> list) {
  // 这里根据自己的业务需求自己去实现业务逻辑dao service
 }
}

5.测试类

/**
  * 最简单的读
  * <p>1. 创建excel对应的实体对象 参照{@link DemoData}
  * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
  * <p>3. 直接读即可
  */
 @Test
 public void simpleRead() {
  // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
  // 写法1:
  String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
  // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
  EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();

  // 写法2:
  fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
  ExcelReader excelReader = null;
  try {
   excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
   ReadSheet readSheet = EasyExcel.readSheet(0).build();
   excelReader.read(readSheet);
  } finally {
   if (excelReader != null) {
    // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
    excelReader.finish();
   }
  }
 }

5.测试结果

在这里插入图片描述

到此这篇关于Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码的文章就介绍到这了,更多相关Java使用EasyExcel操作Excel表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 根据身份证号码判断出生日期、性别、年龄的示例

    java 根据身份证号码判断出生日期、性别、年龄的示例

    这篇文章主要介绍了java 根据身份证号码判断出生日期、性别、年龄的示例,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-10-10
  • Java实现对比两个实体类字段变化的示例详解

    Java实现对比两个实体类字段变化的示例详解

    我们在工作中,可能会在日志中记录数据的变化情况或者在公共处理的数据增加一个日志页面,我们可以根据CompareUtils工具类比较数据前后发生了怎样的变化,下面我们就来看看具体实现吧
    2024-03-03
  • springboot2.1.3配置sftp自定义sftp连接池的详细过程

    springboot2.1.3配置sftp自定义sftp连接池的详细过程

    这篇文章主要介绍了springboot2.1.3配置sftp自定义sftp连接池的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • SpringBoot中的@Value注解用法

    SpringBoot中的@Value注解用法

    这篇文章主要介绍了SpringBoot中的@Value注解用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java语言实现扫雷游戏(1)

    Java语言实现扫雷游戏(1)

    这篇文章主要为大家详细介绍了Java语言实现的扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 解析SpringSecurity自定义登录验证成功与失败的结果处理问题

    解析SpringSecurity自定义登录验证成功与失败的结果处理问题

    这篇文章主要介绍了SpringSecurity系列之自定义登录验证成功与失败的结果处理问题,本文通过实例给大家讲解的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Springboot+aop实现配置多数据源的示例代码

    Springboot+aop实现配置多数据源的示例代码

    本文介绍了如何使用SpringAOP和注解实现动态数据源切换,通过自定义注解和ThreadLocal存储数据上下文信息,重写AbstractRoutingDataSource类并使用自定义切面来实现动态数据源的切换,感兴趣的可以了解一下
    2024-11-11
  • SpringBoot上传文件如何返回前端进度条

    SpringBoot上传文件如何返回前端进度条

    这篇文章主要介绍了SpringBoot上传文件如何返回前端进度条问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java开发微服务架构设计消息队列的水有多深

    java开发微服务架构设计消息队列的水有多深

    今天我们说说消息队列的问题,来带大家探一探消息队列的水有多深,希望看完本文大家在引入消息队列的时候先想一想,是不是一定要引入?引入消息队列后产生的问题能不能解决
    2021-10-10
  • java错误:无效的源发行版:18解决办法图文详解

    java错误:无效的源发行版:18解决办法图文详解

    在Java开发中,如果你遇到错误: 无效的源发行版,这通常意味着你正在使用的Java编译器(通常是javac)被配置为编译一个比你的JDK 版本更高,这篇文章主要给大家介绍了关于java错误:无效的源发行版:18的解决办法,需要的朋友可以参考下
    2024-08-08

最新评论