package com.chinaztt.mes.quality.excel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import com.chinaztt.mes.quality.service.TestStandardService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * @Auther: shihongzhi * @Date: 2021/12/22/17:52 * @Description: */ @Slf4j public class TestStandardUploadListener extends AnalysisEventListener { /** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 10000; /** * 缓存的数据 */ private List cachedDataList = new LinkedList<>(); private TestStandardService testStandardService; public TestStandardUploadListener(TestStandardService testStandardService) { this.testStandardService = testStandardService; } @Override public void invoke(TestStandardData testStandardData, AnalysisContext analysisContext) { log.info("解析到一条数据:{}", JSON.toJSONString(testStandardData)); cachedDataList.add(testStandardData); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (cachedDataList.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list cachedDataList.clear(); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); log.info("所有数据解析完成!"); } /** * 加上存储数据库 */ private void saveData() { log.info("{}条数据,开始存储数据库!", cachedDataList.size()); testStandardService.importExcel(cachedDataList); log.info("存储数据库成功!"); } }