控股器
@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("存储数据库成功!"); } }