一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2021-03-18 编辑:袖梨 来源:一聚教程网

本篇文章小编给大家分享一下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 {
 private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
 /**
  * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
  */
 private static final int BATCH_COUNT = 5;
 List list = new ArrayList();
 /**
  * 假设这个是一个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 list) {
  // 这里根据自己的业务需求自己去实现业务逻辑dao service
 }
}

5.测试类

/**
  * 最简单的读
  * 

1. 创建excel对应的实体对象 参照{@link DemoData} *

2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener} *

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(); } } }

6.测试结果

热门栏目