springboot使用easyExcel导入Excel

springboot使用easyExcel导入Excel

  • 1,Excel映射类

首先需要准备一个Excel的映射类
需和映射类一致
Excel映射类

  • 2,开发Listener

可以说上传Excel主要的业务就在Listener里!!!

@Slf4j
public class ExcelListener extends AnalysisEventListener<ExcelSets> {
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<ExcelSets> list = new ArrayList<ExcelSets>();

    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private ProductSetsMapper productSetsMapper;
    private String productId;
    private IdWorker idWorker;

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param productSetsMapper
     */
    public ExcelListener(ProductSetsMapper productSetsMapper,String productId,IdWorker idWorker) {
        this.productSetsMapper = productSetsMapper;
        this.productId = productId;
        this.idWorker = idWorker;
    }
    @Override
    public void invoke(ExcelSets data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        data.setProductId(productId);
        data.setProductSetId(idWorker.nextId()+"");
        list.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }
    }

    private void saveData() {
        log.info("{}条数据,开始存储数据库!", list.size());
        productSetsMapper.save(list);
        log.info("存储数据库成功!");
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        log.info("所有数据解析完成!");
    }
}

首先new一个集合用来存放Excel中的数据,BATCH_COUNT是每隔多少条对集合中的数据进行一次新增。在继承AnalysisEventListener这个抽象类后,会重写两个方法(invoke,doAfterAllAnalysed),invoke方法用来做业务之类的操作,每行Excel数据都会执行一次invoke,我们可以在这个方法中对这个对象做我们所需要的处理,然后满足定义的条数后进行saveData()去添加集合中的数据,添加后需要把list清空,如果不清空会出现重复添加的情况。如果剩下最后几条无法满足条件了,那就会执行doAfterAllAnalysed方法把集合中的数据进行添加

  • 3,存表
    在Listener类中,单独写了一个方法去存表,在这里要注意,不要想着在Listener中去注入mapper层文件,而是要在service层调用Listener时通过构造把这个mapper文件传过来,然后定义好属性去接,若是有一些参数用户无法在Excel中填写(比如某某id之类的),那可以让前段一起传过来,通过构造把值传进Listener
  • 4,然后把三层架构代码都奉献出来

controller

	@PostMapping("/adds")
    public JsonResponse adds(@RequestParam(required = true) String productId, MultipartFile file) throws IOException {
        return productSetsService.adds(file,productId);
    }

service的实现类,在这里就不写interface里的方法了

 	@Override
    public JsonResponse adds(MultipartFile file,String productId) throws IOException {
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(file.getInputStream(), ExcelSets.class, new ExcelListener(productSetsMapper,productId,idWorker)).sheet().doRead();
        return JsonResponse.SUCCESS();
    }

mapper

void save(@Param("list") List<ExcelSets> list);
<insert id="save" parameterType="java.util.List">
        INSERT INTO t_product_sets(
        数据库字段
        )VALUES
        <foreach collection="list" index="index" item="item" separator=",">
            (
            #{item.*}
            )
        </foreach>
    </insert>
  • 附赠
    如果想把Excel中的数据一下子存进数据库,就把invoke中的添加操作去掉,如果去掉添加操作,就不能clear集合了
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值