public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { Integer rowIndex = context.readRowHolder().getRowIndex(); Integer headRowNumber = context.readSheetHolder().getHeadRowNumber(); // 判断当前行是否为表头行 if (rowIndex == headRowNumber - 1) { int count = 0; // 获取数据实体的字段列表 Field[] fields = entityClass.getDeclaredFields(); for (Field field : fields) { count++; // 获取当前字段上的ExcelProperty注解信息 ExcelProperty fieldAnnotation = field.getAnnotation(ExcelProperty.class); // 判断当前字段上是否存在ExcelProperty注解 if (fieldAnnotation != null) { // 根据注解的index索引到表头中获取对应的表头名 String expectedHeadName = fieldAnnotation.value()[0]; if (!headMap.containsValue(expectedHeadName)) { throw new BizException(500, "excel文件表头不一致:" + expectedHeadName); } } } // 判断用户导入表格的标题头是否完全符合模板 if (count != headMap.size()) { throw new BizException(500, "excel文件表头不一致"); } } }
时间: 2024-02-10 13:29:35 浏览: 28
这段代码是用于校验 Excel 文件的表头是否与预期的字段列表中的注解信息匹配。它接收一个 `headMap` 参数,表示当前读取的表头映射关系,以及一个 `AnalysisContext` 参数,表示当前的解析上下文。
首先,代码获取当前行的索引 `rowIndex` 和表头所在的行号 `headRowNumber`。
然后,代码判断当前行是否为表头行,即 `rowIndex` 是否等于 `headRowNumber - 1`。如果是表头行,则继续执行校验逻辑。
接下来,代码定义一个计数器 `count`,用于记录实体类中存在的字段数量。
然后,通过反射获取实体类 `entityClass` 中的字段列表 `fields`。
接下来,使用增强的 `for` 循环遍历字段列表 `fields`。
在循环中,首先增加计数器 `count` 的值。
然后,通过 `field.getAnnotation(ExcelProperty.class)` 获取当前字段上的 `ExcelProperty` 注解信息。
接下来,判断当前字段上是否存在 `ExcelProperty` 注解。如果存在,则继续执行校验逻辑。
在校验逻辑中,通过注解的索引 `fieldAnnotation.value()[0]` 在表头映射关系 `headMap` 中获取对应的表头名 `expectedHeadName`。
然后,检查 `headMap` 是否包含了该表头名。如果不包含,则抛出一个自定义异常 `BizException`,提示 "excel文件表头不一致:" 加上预期的表头名。
循环结束后,代码判断实体类中的字段数量 `count` 是否与表头映射关系 `headMap` 的大小相等。如果不相等,则抛出一个自定义异常 `BizException`,提示 "excel文件表头不一致"。
总的来说,这段代码通过反射和注解,校验了 Excel 文件的表头是否与预期的字段列表中的注解信息匹配,并在不一致的情况下抛出异常。