使用EasyExcel读取excel文件,实现批量读取数据

本文介绍了如何利用阿里巴巴的EasyExcel库在Java中实现高效且内存友好的Excel读写操作。通过简单的步骤配置依赖、创建监听器、控制器和服务层,实现了Excel数据的导入,并提供了导入结果的统计。在Controller层中,使用EasyExcel读取上传文件并调用监听器进行数据处理。监听器中,每个解析的数据行都会调用Service层进行业务处理,最后返回导入结果。
摘要由CSDN通过智能技术生成

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

官网:https://www.yuque.com/easyexcel

 github地址:https://github.com/alibaba/easyexcel

1、导入依赖

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

2、接口文档

Request URL: /clues/clue/importData
Request Method: POS
{
    "msg": "操作成功",
    "code": 200,
    "data": {
        "successNum": 1,
        "failureNum": 0
    }
}

3、结果集对象

/**
 * 线索导入结果集对象
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImportResultDTO {

    //成功数量
    private Integer successNum = 0;
    //失败数量
    private Integer failureNum = 0;

    /**
     * 提供静态方法,发生插入失败的时候记录
     */
    public static ImportResultDTO error() {
        return new ImportResultDTO(0, 1);
    }

    /**
     * 提供静态方法,发生成功的时候记录数据
     */
    public static ImportResultDTO success() {
        return new ImportResultDTO(1, 0);
    }

    /**
     * 该方法主要是将每次插入的结果与总的结果进行汇总时进行调用
     */
    public void addAll(ImportResultDTO data) {
        this.failureNum += data.getFailureNum();
        this.successNum += data.getSuccessNum();
    }
}

4、Controller层

 @PostMapping("/importData")
public AjaxResult importData(MultipartFile file) throws Exception {

   //ExcelListener 不能被spring管理,要每次读取excel都要new, 然后里面用到spring 的对象可以构造方法传进去
   //TbClueExcelVo是实体类
   ExcelListener excelListener = new ExcelListener(tbClueService);
   EasyExcel.read(file.getInputStream(), TbClueExcelVo.class,excelListener).sheet().doRead();

   return AjaxResult.success(excelListener.getResult());
}

5、监听器

/**
 * EasyExcel监听器,用于解析数据并执行操作
 */
public class ExcelListener extends AnalysisEventListener<TbClueExcelVo> {

    public ITbClueService clueService;
    private final ImportResultDTO resultDTO = new ImportResultDTO();

    /**
     * 提供带参构造方法,在这里需要通过构造方法的方式获取对应的service层
     * 谁调用这个监听器谁提供需要的service
     */
    public ExcelListener(ITbClueService clueService) {
        this.clueService = clueService;
    }
    /**
     * 每解析一行数据都要执行一次
     * 每条都执行一次插入操作
     */
    @Override
    public void invoke(TbClueExcelVo data, AnalysisContext context) {
        //1. 调用添加线索的业务逻辑
        ImportResultDTO addResult = clueService.importCluesData(data);
        //2. 统计的处理结果(成功,失败多少条,用于前端页面的提示)
        resultDTO.addAll(addResult);
    }
    /**
     * 当所有数据都解析完成后会执行
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
    }
    /**
     * 返回结果集对象
     */
    public ImportResultDTO getResult() {
        return resultDTO;
    }
}

6、Service层

 @Override
    public ImportResultDTO importCluesData(TbClueExcelVo data) {
        
    //这里写单条数据的处理代码,返回成功或失败
    //监听器每解析一行数据都要执行一次
  
        return ImportResultDTO.success();
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值