阿里EasyExcel导入Excel大批量数据用法

阿里EasyExcel导入Excel大批量数据用法

-pom文件依赖

<!--阿里巴巴EasyExcel依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>
  • 导入(读)数据–第一步创建一个监听器ExcelDataListener.java继承AnalysisEventListener类
// 1.编写一个监听器 ExcelDataListener.java继承AnalysisEventListener类
//    重写invoke方法

package com.xiaogui.log.utils;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Cell;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.fastjson.JSON;
import com.xiaogui.log.mapper.LogMapper;
import com.xiaogui.log.vo.resp.RespLogInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.*;



@Component
@Slf4j
public class ExcelDataListener extends AnalysisEventListener<RespLogInfo> {
    /**
     * 每隔10条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 10;
    List<与Excel表头对应的Entity> list = new ArrayList<>();
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。
     * 当然如果不用存储这个对象没用。
     */
    private final Mapper Mapper;

    /**
     * 如果使用了spring,请使用这个构造方法。
     * 每次创建Listener的时候需要把spring管理的类传进来
     */
    public ExcelDataListener(Mapper mapper) {
        this.logMapper = logMapper;
    }

    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(与Excel表头对应的Entity data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            for (Entity entity: list) {
                mapper.insertSelective(entity);
            }
            // 存储完成清理 list
            list.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        log.info("所有数据解析完成!");
    }
}


  • 导入(读)数据–第二步-使用read读取,并且引入(可以注入也可以new一个ExcelDataListener)
		/**
         * 读取数据
         */
        // 写法1:
        String fileName = "文件路径/文件名.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        ExcelDataListener excelDataListener = new ExcelDataListener();
        EasyExcel.read(fileName,与Excel表头对应的Entity.class,excelDataListener   ).sheet().doRead();

        // 写法2:
        ExcelReader excelReader = EasyExcel.read(fileName, 与Excel表头对应的Entity.class,excelDataListener   ).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        excelReader.read(readSheet);
        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot使用EasyExcel导入Excel文档时,如果数据量较大,可以考虑使用分批次读取数据的方式,避免一次性读取过多数据导致内存溢出的问题。 具体实现可以参考以下步骤: 1. 定义一个数据处理器类,实现EasyExcelReadListener接口,在onRead方法中处理每一批次读取到的数据。 2. 在Controller中定义一个方法,接收前端上传的Excel文件,并使用EasyExcelread方法读取Excel文件,同时传入数据处理器类的实例作为参数。 3. 在数据处理器类中,设置每批次读取的数据量,例如每次读取1000条数据。 4. 在onRead方法中,处理每一批次读取到的数据,例如将数据保存到数据库中。 5. 如果还有未处理完的数据,继续读取并处理,直到读取完所有数据。 下面是一个示例代码: ```java @Component public class ExcelDataListener implements ReadListener<User> { private List<User> userList = new ArrayList<>(); @Override public void onRead(List<User> data, AnalysisContext context) { userList.addAll(data); if (userList.size() >= 1000) { // 处理每一批次读取到的数据 saveUserList(userList); userList.clear(); } } @Override public void onException(Exception exception, AnalysisContext context) { // 处理异常 } private void saveUserList(List<User> userList) { // 将数据保存到数据库中 } } @RestController public class ExcelController { @Autowired private ExcelDataListener excelDataListener; @PostMapping("/upload") public void uploadExcel(@RequestParam("file") MultipartFile file) throws IOException { EasyExcel.read(file.getInputStream(), User.class, excelDataListener).sheet().doRead(); // 处理剩余未处理的数据 excelDataListener.saveUserList(excelDataListener.getUserList()); } } ``` 注意,在使用分批次读取数据时,需要考虑如何处理异常情况,以及在处理完所有数据后如何清理资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值