导航

easyexcel填坑-校验表头为空,或者不符合预期

Posted on 2023-03-10 17:34  小强404  阅读(2048)  评论(1编辑  收藏  举报

背景:

easyexcel v3.1.5

实体类已经使用注解 @ExcelProperty标注需要导入的属性

正文开始

关闭忽略空行,防止第一行是空跳过校验 ignoreEmptyRow(false)。此处如果未关闭,第一行为空时,不会进入invokeHeadMap方法

EasyExcel.read(file.getInputStream(), **.class,
                    new KnowledgeListener(kgService, classificationRepository, issuesRepository, syncNeo4j, algorithmService))
                    .ignoreEmptyRow(false).sheet().doRead();

在自己的 Listener 重写 invokeHeadMap 方法。headMap为excel的第一行数据映射,expectHeadList为easyExcel从headMap中匹配到的 @ExcelProperty标注过的字段。所有只需要判断数量是否一致即可,另外还要注意空行时的headMap为空。

 @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        if(CollectionUtils.isEmpty(headMap)){
            //throw new CactusException(500, "此处可以根据自己的业务处理");
        }
        //获取bo对象head名称
        List<String> expectHeadList = Optional.ofNullable(context)
                .map(AnalysisContext::currentReadHolder)
                .map(ReadHolder::excelReadHeadProperty)
                .map(ExcelReadHeadProperty::getHeadMap)
                .map(Map::values)
                .orElse(Collections.emptyList())
                .stream().map(Head::getHeadNameList)
                .flatMap(Collection::stream)
                .collect(Collectors.toList());
        if(CollectionUtils.isEmpty(expectHeadList)){
            //throw new CactusException(500, "此处可以根据自己的业务处理");
        }
        //表头数量检测
        if (!Objects.equals(headMap.size(), expectHeadList.size())) {
            //throw new CactusException(500, "此处可以根据自己的业务处理");
        }
    }