Controlador
@Autowired ErpStorehouseDao erpStorehouseDao /** * 导入 * @return */ @PostMapping("upload") @ResponseBody public String upload(archivo MultipartFile) arroja IOException { EasyExcel.read(file.getInputStream(), ErpStorehouseEntity.class, new Listener( erpStorehouseDao)).hoja().doRead(); devolver "éxito"; }
clase de entidad
@Data public class ErpStorehouseEntity { @ExcelProperty(value = "nombre del almacén", índice = 0) private String storehouseName; @ExcelProperty(value = "stock", index = 1) @ApiModelProperty(value = "stock") private Integer storehouseNumber; @ExcelProperty(valor = "vida útil", índice = 2) @ApiModelProperty(valor = "vida útil") privado Fecha fecha de caducidad; @ExcelProperty(valor = "categoría", índice = 4) @ApiModelProperty(valor = "categoría") @TableField(existir = falso) private String NombreClaseDeProductos; }
clase de implementación de importación
/** * @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 List ener listener ; @PostConstruct public void init() { listener = this; } private static final Logger LOGGER = LoggerFactory.getLogger (zhihuichufang.modules.storehouse.service.impl.Listener.class); */ private static final int BATCH_COUNT = 5; @Override List<ErpStorehouseEntity> list = new ArrayList<ErpStorehouseEntity>(); /** * Supongamos que se trata de un DAO, por supuesto, también puede ser un servicio con lógica empresarial. Por supuesto, es inútil si no almacena este objeto. */ private ErpStorehouseDao erpStorehouseDao; public Listener(ErpStorehouseDao erpStorehouseDao) { this.erpStorehouseDao = erpStorehouseDao; } / ** * Esto se llamará para cada análisis de datos * * @param erpStorehouseImport * valor de una fila. Es lo mismo que {@ link AnalysisContext #readRowHolder()} * @param analysisContext */ public void invocar(ErpStorehouseEntity erpStorehouseImport, AnalysisContext analysisContext) { System.out.println("Se llama al método de invocación"); LOGGER.info("Analizado en un dato: {}", JSON.toJSONString(erpStorehouseImport)); list .add (erpStorehouseImport); // Cuando se alcanza BATCH_COUNT, es necesario almacenar la base de datos una vez para evitar que decenas de miles de datos se almacenen en la memoria, lo cual es fácil de OOM si (list.size() >= BATCH_COUNT) { saveData(); // El almacenamiento se completa y se limpia la lista list .clear(); } } /** * Se llamará a todos los análisis de datos * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context ) { System.out.println("Se llama al método doAfterAllAnalysed"); // Guarde también los datos aquí para asegurarse de que los últimos datos restantes también se almacenen en la base de datos saveData( ); LOGGER.info("¡Se completó el análisis de todos los datos!"); } /** * Además de la base de datos de almacenamiento */ private void saveData() { LOGGER.info("{} datos, comience a almacenar la base de datos!", list.size()); if (null!=list&&list.size()> 0) { list.forEach(data->{ ErpgoodSclassEntity ERPGOODSSSSENTITY = New ErpgoodSclassEntity (); ERPGOODSClassEntity (data.getgoodscscscsc LassName ()); ErpgoodSclassEntity ErpgoodSclassEntity = Listener.goodSclassDao.SelectOne (ERPGOODSClassEntity); data.setStorehouseId(String.valueOf(UUID.randomUUID()+String.valueOf(System.currentTimeMillis()))); data.setCreateTime(nueva Fecha()); if (null!=erpGoodsClassEntitydata){ data.setGoodsClassId(erpGoodsClassEntitydata.getGoodsClassId()); } erpStorehouseDao.insert(datos); }); } LOGGER.info("存储数据库成功!"); } }