当前位置:   article > 正文

java操作excel最简单的方法-eaxyexcel(最简单使用,详细示例!!!)多种监听器使用方式,以及代码详细解析_java excel

java excel

操作easyexcel最简单方式,使用阿里巴巴组件easyexcel(操作简单需求,复杂excel可以考虑使用apache的poi,之后有时间也会出poi的文章)

可以参考官方文档 https://easyexcel.opensource.alibaba.com/docs/current/

一、导入easyexcel的pom文件

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

二、接收excel实体类示例(@ExcelProperty(index = 0),index指定列)每个属性代表excel的一列

@Data
public class FactoryTypeDetailDto {
    @ExcelProperty(index = 0)//index0表示对应excel文件的第一列
    private String id;
    @ExcelProperty(index = 1)
    private String name;
    @ExcelProperty(index = 2)
    private String subId;
    @ExcelProperty(index = 3)
    private Integer typeDetail;
}

三、1、业务代码示例(以下为使用自带监听器,这是最简单的使用方式;也可以手动新建一个监听器类来更灵活的配置)适用于只有一个sheet的excel

2.监听器使用第二种方式手动创建监听器

  1. package com.situ.balance.util.excle_listener;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.alibaba.excel.context.AnalysisContext;
  4. import com.alibaba.excel.read.listener.ReadListener;
  5. import com.alibaba.excel.util.ListUtils;
  6. import com.alibaba.fastjson2.JSON;
  7. import lombok.extern.slf4j.Slf4j;
  8. import java.util.List;
  9. @Slf4j
  10. public class SubstationListener implements ReadListener<SubstationInstalledcapacity> {
  11. /**
  12. * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
  13. */
  14. private static final int BATCH_COUNT = 100;
  15. /**
  16. * 缓存的数据
  17. */
  18. private List<SubstationInstalledcapacity> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
  19. /**
  20. * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
  21. */
  22. private SubstationInstalledcapacityService substationInstalledcapacityService;
  23. public SubstationListener() {
  24. // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
  25. }
  26. /**
  27. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
  28. *
  29. * @param
  30. */
  31. public SubstationListener(SubstationInstalledcapacityService substationInstalledcapacityService) {
  32. this.substationInstalledcapacityService = substationInstalledcapacityService;
  33. }
  34. /**
  35. * 这个每一条数据解析都会来调用
  36. *
  37. * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
  38. * @param context
  39. */
  40. @Override
  41. public void invoke(SubstationInstalledcapacity data, AnalysisContext context) {
  42. log.info("解析到一条数据:{}", JSON.toJSONString(data));
  43. cachedDataList.add(data);
  44. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
  45. if (cachedDataList.size() >= BATCH_COUNT) {
  46. saveData();
  47. // 存储完成清理 list
  48. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
  49. }
  50. }
  51. /**
  52. * 所有数据解析完成了 都会来调用
  53. *
  54. * @param context
  55. */
  56. @Override
  57. public void doAfterAllAnalysed(AnalysisContext context) {
  58. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
  59. log.info("所有数据解析完成!");
  60. }
  61. /**
  62. * 加上存储数据库
  63. */
  64. private void saveData() {
  65. log.info("{}条数据,开始存储数据库!", cachedDataList.size());
  66. //保存数据库
  67. substationInstalledcapacityService.saveOrUpdateBatch(cachedDataList);
  68. log.info("存储数据库成功!");
  69. }
  70. }

使用监听器时将所需service作为参数传进去,因为监听器不会被spring管理

例如:

EasyExcel.read(filePath, 你自己接收excel的类.class, new ReadListener<你自己接收excel的类>(你需要用到的service)).sheet().doRead();

四、指定sheet用法

String excelpath= "aaa.xlsx";
ExcelReader excelReader = EasyExcel.read(excelpath).build();
//readSheet(0)代表读取第一个sheet
ReadSheet readSheet = EasyExcel.readSheet(0).head(excel接收类.class).registerReadListener(new PageReadListener<excel接收类>(dataList -> {

})).build();

//第二个sheet

ReadSheet readSheet1 = EasyExcel.readSheet(1).head(excel接收类.class).registerReadListener(new PageReadListener<excel接收类>(dataList -> {
})).build();

//最后调用read方法

excelReaderPoli.read(readSheet , readSheet1 );

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/726103
推荐阅读
相关标签
  

闽ICP备14008679号