ToB企服应用市场:ToB评测及商务社交产业平台

标题: EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法 [打印本页]

作者: 涛声依旧在    时间: 2024-9-16 10:40
标题: EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法
OK,不废话,直接开干!说真话是有些坑,或者是我不会用吧
模板如下:

 
  1. <strong>invokeHeadMap 这个方法其实针对第一行就是表头的完全没问题。
  2. 针对第二行的,我DEBUG拿到的是这样
  3. </strong><strong>很明显,他拿到了第一行;既然他只能拿到第一行的数据,那么我们就换一个思路,只校验能拿到的表头,就不做那么好。思路就是拿到value不为null的key,作为一个新的map,然后再去比对代码如下:</strong>
复制代码
  1.     /**
  2.      * 验证具有表头为第二行的 Excel 模板是否正确。
  3.      *
  4.      * @param clazz 要验证的 Excel 类型。
  5.      * @param headMap 包含 Excel 表头信息的映射。
  6.      *
  7.      */
  8.     private void validateTwoRowHeaderMap(Class<?> clazz, Map<Integer, String> headMap) {
  9.         validateExcelTemplate(clazz, headMap);
  10.     }
  11.     /**
  12.      * 验证 Excel 表头信息是否与预定义的属性映射匹配。
  13.      *
  14.      * @param clazz 要验证的 Excel 类型。
  15.      * @param headMap 包含 Excel 表头信息的映射。
  16.      * @return 如果所有表头都匹配,返回 true;否则返回 false。
  17.      */
  18.     private void validateExcelTemplate(Class<?> clazz, Map<Integer, String> headMap) {
  19.         Map<Integer, String> collect = headMap.entrySet().stream()
  20.                 .filter(entry -> entry.getValue() != null)
  21.                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
  22.         Map<Integer, String> excelPropertyMap = getExcelPropertyMap(clazz, 0);
  23.         for (Integer i : collect.keySet()) {
  24.             if (!collect.get(i).equals(excelPropertyMap.get(i))) {
  25.                 throw new ExcelAnalysisException("模板错误,请检查导入模板");
  26.             }
  27.         }
  28.     }
  29.     /**
  30.      * 根据类类型和位置参数获取 Excel 属性映射。
  31.      *
  32.      * @param clazz 要获取属性映射的 Excel 类型。
  33.      * @param position 位置参数,用于确定具体的属性值。
  34.      * @return 包含 Excel 属性映射的 Map。
  35.      */
  36.     private Map<Integer, String> getExcelPropertyMap(Class<?> clazz,Integer position) {
  37.         Map<Integer, String> excelPropertyMap = new HashMap<>();
  38.         Field[] fields = clazz.getDeclaredFields(); // 获取所有字段,包括私有字段
  39.         for (Field field : fields) {
  40.             if (!Modifier.isStatic(field.getModifiers())) { // 忽略静态字段
  41.                 ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
  42.                 if (excelProperty != null) {
  43.                     int index = excelProperty.index();
  44.                     String value = excelProperty.value()[position];
  45.                     excelPropertyMap.put(index, value);
  46.                 }
  47.             }
  48.         }
  49.         return excelPropertyMap;
  50.     }
复制代码
着实我这里是把校验表头为第一行和第二行的分开了,如下图:


然后无语的来了,针对表头为第二行的,走我自己处置惩罚以后的方法,框架还会去调用invokeHeadMap方法,并且这次拿到了全部信息,如下图:

然后又走我那个针对表头为第二行的处置惩罚方法,成功报错! 就很无语。
搞半天我那个还白写了。
然后我又发现,不是每次都会去调用两次,如果第一次调用的时间,抛了非常,那么就不会调用第二次。
然后我现在也还在看怎么处置惩罚一下,反正这个方法,针对复杂表头,必要自己加逻辑处置惩罚,直接用是用不了的,我也是记载一下和分享一下思绪吧。不外知道了这个流程,处置惩罚也不是很麻烦。对了 ,我这个项目时老项目,easyExcel版本是2.几的,我不知道是不是版本的题目,设置了表头行然后神奇的来了,针对表头为第二行的,走我自己处置惩罚以后的方法,框架还会去调用数在走这个invokeHeadMap方法的时间没用。貌似3版本可以直接拿到。
欢迎评论区互换!

========================后续来了

 
简单处置惩罚一下吧,能有个作用就行,为每个线程单独设置一个计数器,重要是不想在改了,还在催,能跑就行,代码不要写的太完美了,你弄久了,还嫌你效率低呢,哈哈


参考思绪就行了,贴了代码也用不了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4