# 前言
历经波折,断更数日。幸得坚定,幸怀自信。
近期参与了一个新的系统搭建,功能需求:完成对于导入表格的内容的审查校验,无需核对数据类型,对表头校验即可。如何优雅地完成代码的设计,如何提高的代码的可读,都会是要考虑到的内容。
# 干货
/**
* @author hanhao
* @description Excel表格工具类
* @date 2024/8/19
*/
@Slf4j
public class RiskExcelUtil {
/**
* 检查Excel文件中的数据是否符合实体类的要求
*
* @param reader hutool读取Excel文件
* @param clazz 对应的实体类
* @return 检查结果,true表示符合要求,false表示不符合要求
*/
public static <T> boolean checkExcelData(ExcelReader reader, Class<T> clazz) {
// 读取第一行列名
List<Object> columnNames = reader.readRow(0);
List<String> columns = columnNames.stream().map(item -> item + "").collect(Collectors.toList());
// 获取实体注解名
List<String> propertyValues = getApiModelPropertyValues(clazz);
// 校验
if (CollUtil.isNotEmpty(columns) && CollUtil.isNotEmpty(propertyValues)) {
Set<String> resultSet = new LinkedHashSet<>(propertyValues);
resultSet.addAll(columns);
return resultSet.size() == propertyValues.size();
}
return false;
}
/**
* 获取指定类中所有@ApiModelProperty注解的值,并放入一个List<String>中返回
*
* @param clazz 要检查的类
* @return 包含所有@ApiModelProperty注解值的List<String>
*/
public static List<String> getApiModelPropertyValues(Class<?> clazz) {
List<String> values = Lists.newArrayList();
// 获取类的所有字段
Field[] fields = ReflectUtil.getFields(clazz);
for (Field field : fields) {
// 获取字段上的@ApiModelProperty注解
ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
if (apiModelProperty != null) {
// 将注解的值添加到列表中
values.add(apiModelProperty.value());
}
}
return values;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 理解
利用hutool工具读取Excel,然后读取第一行的列表名称存放。然后利用封装好的实体类,基于实体的ApiModelProperty注解获取其value值(基于反射做)。然后进行数据校验,我们可以利用Set去重的特性,然后引入linkedHashSet,同时维护插入的顺序,这样就可以保证两边去重的同时又可以对于顺序性有一定要求能够进入更进一步细致的校验。