背景:
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, "此处可以根据自己的业务处理"); } }
标签:map,headMap,easyexcel,表头,填坑,new,expectHeadList From: https://www.cnblogs.com/ztfcb/p/17204229.html