SpringBoot easyExcel导入

控股器
@Autowired
ErpStorehouseDao erpStorehouseDao

/**
 * 导入
 * @return
 */
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
    EasyExcel.read(file.getInputStream(), ErpStorehouseEntity.class, new Listener(erpStorehouseDao)).sheet().doRead();
    return "success";
}

实体类

@Data
public class ErpStorehouseEntity {

    @ExcelProperty(value ="仓库名称", index = 0)
    private String storehouseName;

    @ExcelProperty(value ="库存量", index = 1)
    @ApiModelProperty(value = "库存量")
    private Integer storehouseNumber;

    @ExcelProperty(value ="保质期", index = 2)
    @ApiModelProperty(value = "保质期")
    private Date expirationDate;

    @ExcelProperty(value ="品类", index = 4)
    @ApiModelProperty(value = "品类")
    @TableField(exist = false)
    private String goodsClassName;

}

导入实现类

/**
 * @author liangsheng
 * @version 1.0
 * @date 2020/12/23 10:56
 * @Description TODO
 */
@Component
public class Listener extends AnalysisEventListener<ErpStorehouseEntity> {


    @Autowired
    private ErpGoodsClassDao goodsClassDao;

    public static Listener listener;

    @PostConstruct
    public void init() {
        listener = this;
    }

    private static final Logger LOGGER =
            LoggerFactory.getLogger(zhihuichufang.modules.storehouse.service.impl.Listener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    List<ErpStorehouseEntity> list = new ArrayList<ErpStorehouseEntity>();

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


    public Listener(ErpStorehouseDao erpStorehouseDao) {
        this.erpStorehouseDao = erpStorehouseDao;
    }
    /**
     * 这个每一条数据解析都会来调用
     *
     * @param erpStorehouseImport
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param analysisContext
     */
    @Override
    public void invoke(ErpStorehouseEntity  erpStorehouseImport, AnalysisContext analysisContext) {
        System.out.println("invoke方法被调用");
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(erpStorehouseImport));
        list.add(erpStorehouseImport);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (list.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            list.clear();
        }

    }
    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("doAfterAllAnalysed方法 被调用");
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        LOGGER.info("所有数据解析完成!");

    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        LOGGER.info("{}条数据,开始存储数据库!", list.size());
        if (null!=list&&list.size()>0){
            list.forEach(data->{
                ErpGoodsClassEntity erpGoodsClassEntity=new ErpGoodsClassEntity();
                erpGoodsClassEntity.setName(data.getGoodsClassName());
                ErpGoodsClassEntity erpGoodsClassEntitydata =listener.goodsClassDao.selectOne(erpGoodsClassEntity);
                data.setStorehouseId(String.valueOf(UUID.randomUUID()+String.valueOf(System.currentTimeMillis())));
                data.setCreateTime(new Date());
                if (null!=erpGoodsClassEntitydata){
                    data.setGoodsClassId(erpGoodsClassEntitydata.getGoodsClassId());
                }
                erpStorehouseDao.insert(data);
            });
        }
        LOGGER.info("存储数据库成功!");

    }
}

猜你喜欢

转载自blog.csdn.net/qq_30667039/article/details/111576596
今日推荐