Java使用Easyexcel导入大批量数据

Java使用Easyexcel导入大批量数据,第1张

ps:博主测试的60w数据是没问题的

pom.xml


com.alibaba
easyexcel
3.0.5
一、Controller
@RequestMapping(value = "importExcel", method = RequestMethod.POST, headers = "content-type=multipart/form-data")
@ApiOperation(value = "导入社区")
@ApiImplicitParams({ @ApiImplicitParam(name = "文件", value = "file") })
public Result  importExcel(@RequestParam(value="file") MultipartFile file) throws ControllerException {
   try {
      Result result = communityService.importExcel(file);
      return result;
   } catch (Exception e) {
      return Result.failed("导入失败");
   }
}
二、实体类
/**
 * 社区信息
 * 
 * @author LXF
 * @email
 * @date 2021-11-10 15:29:38
 */
​
@Data
public class Community implements Serializable {
   private static final long serialVersionUID = 1L;
   @JsonSerialize(using = ToStringSerializer.class)
   @TableId(value = "ID", type = IdType.AUTO)
   private Long id;//
​
   private String nation;// 国家
​
   private String province;// 省市
​
   private String city;
​
   private String county;// 区县
​
   private String town;// 镇
​
   private String community;// 村民委员会
​
   private String village;// 社区(村)
​
   private String address;// 地址
​
   private String headImgUrl;// 头像
​
   private String telephone;// 电话
​
   private String contact;// 联系人
​
   private String content;// 简介
   @JsonSerialize(using = ToStringSerializer.class)
   private Long userId;// 用户编号
​
   private String dmsAccount;// dms账号
​
   private String workAccount;// 工作号
​
   private Integer enabled;// 是否启用:1启用,0屏蔽
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
   private Date createTime;// 创建时间
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
   private Date updateTime;// 最近一次更新时间
   @JsonSerialize(using = ToStringSerializer.class)
   private Long operatorId;//  *** 作者
​
   private String operateIp;// 最近一次更新 *** 作的网址
   @JsonSerialize(using = ToStringSerializer.class)
   private Long version;// 版本号
​
}
@Data
public class CommunityImportBo implements Serializable {
   private static final long serialVersionUID = 1L;
​
   private Long id;
​
   @ExcelProperty("国家")
   private String nation;
​
   @ExcelProperty("省")
   private String province;
​
   @ExcelProperty("市")
   private String city;
​
   @ExcelProperty("区县")
   private String county;
​
   @ExcelProperty("乡镇街道")
   private String town;
​
   @ExcelProperty("居委会")
   private String community;
​
}
三、Service
/**
 * 导入社区excel
 *
 * @param file     文件
 * @param
 * @return {@link Result}
 */
Result importExcel(MultipartFile file) throws ServiceException, IOException;
四、ServiceImpl
    /**
    * 导入社区excel
    *
    * @param file     文件
    * @param
    * @return {@link Result}
    */
   @Override
   public Result importExcel(MultipartFile file) throws ServiceException, IOException {
		EasyExcel.read(file.getInputStream(), CommunityImportBo.class, new ConfigFilterListener(communityDao)).sheet().doRead();
      return Result.succeed("导入成功");
   }
}
五、监听器
package com.ys.dms.listener;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.ys.dms.common.exception.service.ServiceException;
import com.ys.dms.common.feign.UserFeign;
import com.ys.dms.dao.CommunityDao;
import com.ys.dms.entity.Community;
import com.ys.dms.entity.vo.CommunityImportBo;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Slf4j
public class ConfigFilterListener implements ReadListener {


    private  Logger logger = LoggerFactory.getLogger(ConfigFilterListener.class);


    /**
     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT =100;


    private List list = new ArrayList<>();

    private List communityList = new ArrayList<>();

    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    @Resource
    private CommunityDao communityDao;

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



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



    /**
     * 这个每一条数据解析都会来调用
     *
     * @param
     *
     * @param context
     */
    @Override
    public void invoke(CommunityImportBo communityImportBo, AnalysisContext context) {
        context.readWorkbookHolder().setIgnoreEmptyRow(false);
        Community community = new Community();
        community.setUserId(Long.valueOf("1277137734524300032"));
        community.setEnabled(1);
        community.setCreateTime(new Date());
        BeanUtil.copyProperties(communityImportBo,community);
        list.add(communityImportBo);
        communityList.add(community);
       //  达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (communityList.size() >= BATCH_COUNT) {
            batchInsert();
            // 存储完成清理 list
            communityList.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if(communityList.size() > 0){
            // 这里也要保存数据,确保最后遗留的数据也存储到数据库
            batchInsert();
            logger.info("所有数据解析完成!");
        }
    }

    @Async
    public void batchInsert() {
        communityDao.insertBatchTwo(communityList);
        log.info("存储数据库成功!");
    }



}
五、Dao
//返回主键
@Options(useGeneratedKeys=true,keyProperty="id")
void insertBatchTwo(List list);
六、Dao.xml

        insert into community(
        nation,
        province,
        city,
        county,
        town,
        community,
        village,
        address,
        head_img_url,
        telephone,
        contact,
        content,
        user_id,
        dms_account,
        work_account,
        enabled,
        create_time,
        update_time,
        operator_id,
        operate_ip,
        version)
        values
        
            (
            #{ item.nation},
            #{ item.province},
            #{ item.city},
            #{ item.county},
            #{ item.town},
            #{ item.community},
            #{ item.village},
            #{ item.address},
            #{ item.headImgUrl},
            #{ item.telephone},
            #{ item.contact},
            #{ item.content},
            #{ item.userId},
            #{ item.dmsAccount},
            #{ item.workAccount},
            #{ item.enabled},
            #{ item.createTime},
            #{ item.updateTime},
            #{ item.operatorId},
            #{ item.operateIp},
            #{ item.version}
            )
        
个人博客:

码农日志分享互联网知识,码农日志,博客,开发者,程序猿,编程,代码,开源,IT网站,Java,JavaWeb,Java常用框架,Spring,SpringBoot,SpringMVC,MyBatis,数据库,MySQL,C#,.NET,开发工具,Git,GitHub,Gitee,(My)Eclipse,IDEA, Hexo,Linux,Maven,前端基础知识,HTML,CSS,JavaScript,jQuery,Ajax,Bootstraphttp://lixiaofang.top/

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存