easyexcel-统一监听器

说明

  • 项目说明:在公司中做了某一个项目,这个项目的作用就是做文档的导入导出
  • 有的数据文档的数据是直接导入AND更新
  • 有的数据是直接导入
  • 期间的关联关系是某一个值

项目

采用的springboot、mybatos-plus、easyexcel

思路

  1. 先把导入的所有数据放入到List中
  2. 将要查询的值封装成一个对象,
  3. 进行批量查询
  4. 将查出来的数据转换成Map<特定值,T>
  5. 把所有要查询的数据也转换成Map<特定值,T>
  6. 数据转换
  7. 批量更新and插入

代码

  • 批量查询和批量插入
  • 代码是特定的代码,但是实现思路是差不多的,
/**
 * @param 
 */
public class ExcetListener<T extends BaseDo<T>> extends AnalysisEventListener<T> {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExcetListener.class);
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 30;
    List<T> addList = new ArrayList<>();
    List<T> updataList = new ArrayList<>();
    private IBaseDao<T> iBaseDao;
    private Boolean isUpData = Boolean.FALSE;

    public ExcetListener(IBaseDao<T> iBaseDao) {
        this.iBaseDao = iBaseDao;
    }

    public ExcetListener(IBaseDao<T> iBaseDao, Boolean isUpData) {
        this(iBaseDao);
        this.isUpData = isUpData;

    }


    /**
     * 这个每一条数据解析都会来调用
     *
     * @param testCategory
     * @param analysisContext
     */
    @SneakyThrows
    @Override
    public void invoke(T testCategory, AnalysisContext analysisContext) {
        if (isUpData) {
            updataList.add(testCategory);
        } else {
            addList.add(testCategory);
        }
        if (addList.size() >= BATCH_COUNT || updataList.size() >= BATCH_COUNT) {
            saveData();
            addList.clear();
            updata();
            updataList.clear();
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param analysisContext
     */
    @SneakyThrows
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        updata();
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        if (addList.isEmpty()) {
            return;
        }
        iBaseDao.saveBatch(addList, BATCH_COUNT);
    }

    private void updata() throws Exception {
        if (updataList.isEmpty()) {
            return;
        }
        //这些是要进行更新的
        Map<String, T> updataMap = iBaseDao.listBatchByEntityList(getQueryList()).stream()
                .collect(Collectors.toMap(T::getOnlyCode, Function.identity()));
        //所有数据
        Map<String, T> collect = updataList.stream().collect(Collectors.toMap(T::getOnlyCode, Function.identity()));
        collect.forEach((key, value) -> {
            T t = updataMap.get(key);
            if (t != null) {
                value.setId(t.getId());
            }
        });
        updataList = new ArrayList<>(collect.values());
        iBaseDao.saveOrUpdateBatch(updataList);
    }

    public List<T> getQueryList() throws Exception {
        List<T> queryList = Lists.newArrayList();
        for (T t : updataList) {
            try {
                Class<? extends BaseDo> aClass = t.getClass();
                T baseDo = (T) aClass.newInstance();
                baseDo.setOnlyCode(t.getOnlyCode());
                queryList.add(baseDo);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return queryList;
    }

}

你可能感兴趣的:(excel,mybatyis-plus,springboot)