欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2022-10-11 12:12:30|栏目:JAVA代码|点击:

一.读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.测试结果

在这里插入图片描述

上一篇:SpringBoot后端上传文件类型检测方式

栏    目:JAVA代码

下一篇:Java pdf文件书签承前缩放验证的设置方法

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

本文地址:http://www.codeinn.net/misctech/216083.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有