写文档的工作,真的是低效和重复劳动,前面的人不愿意,就喜欢压迫后面的人,前面的人自己没思路解决事情,就喜欢刷锅给后面的人。真想问问前面的人技术经验没啥提升,甩锅的技能又见长了。
前景介绍
由于公司的数据库用的是mongodb,ORM框架使用的是morphia框架,还有一个自定义注解Title,这个Title注解里面包括一个属性,就是描述字段信息。
作者只是做一个演示,每个公司用的描述字段注解肯定都不一样,只是提供一种思路。
需求:
将各个实体类的字段信息统计成一个Excel表
思路:
通过Java反射技术拿到相应的信息进行统计,并借助hutool工具类Excel工具对统计的信息进行导出。
做个模拟环境:
创建一个springboot项目,通过maven导入相关依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.mongodb.morphia</groupId>
<artifactId>morphia</artifactId>
<version>1.3.2</version>
</dependency>
这个自定义注解可以自定义名称,我这边直接就把Title搬过来用了
以下是Title的定义
Title注解可以定义到class和字段field上
以下是实现代码
@Test
void test01() throws ClassNotFoundException {
Class<?> clz = Class.forName("***");
Entity item = clz.getAnnotation(Entity.class);
//获取字节码中的字段信息
Field[] fields = clz.getDeclaredFields();
//存储字段名称
List<String> fieldNames = new ArrayList<>();
//存储每个字段类型
List<String> types = new ArrayList<>();
//存储字段描述信息
List<String> fieldDescriptions = new ArrayList<>();
for (Field field : fields) {
Title annotation = field.getAnnotation(Title.class);
//获取字段名称
String fieldName = field.getName();
//获取字段描述信息
String fieldDescription = "";
if (annotation != null){
fieldDescription = annotation.title();
}
//获取字段数据类型
String dateType = field.getType().getSimpleName();
fieldNames.add(fieldName);
fieldDescriptions.add(fieldDescription);
types.add(dateType);
System.out.println("Field Name: " + fieldName);
System.out.println("Data Type: " + dateType);
System.out.println("Field Description: " + fieldDescription);
}
// 导出到Excel
ExcelWriter writer = ExcelUtil.getWriter("d:/Yxbz.xlsx");
writer.merge(2,"表名" +":"+ item.value());
writer.addHeaderAlias("fieldName", "字段名");
writer.addHeaderAlias("dateType","数据类型");
writer.addHeaderAlias("fieldDescription", "字段描述");
//构造ExcelData数据
List<ExcelData> excelDataList = new ArrayList<>();
for (int i = 0; i < fieldNames.size(); i++) {
ExcelData excelData = new ExcelData();
excelData.setFieldName(fieldNames.get(i));
excelData.setDateType(types.get(i));
excelData.setFieldDescription(fieldDescriptions.get(i));
excelDataList.add(excelData);
}
writer.write(excelDataList, true);
writer.setColumnWidth(0, 20); // 设置第一列宽度
writer.setColumnWidth(1, 20); // 设置第二列宽度
writer.setColumnWidth(2, 30); // 设置第三列宽度
writer.flush();
writer.close();
}
public class ExcelData {
//字段名称
private String fieldName;
//数据类型
private String dateType;
//描述详情
private String fieldDescription;
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldDescription() {
return fieldDescription;
}
public void setFieldDescription(String fieldDescription) {
this.fieldDescription = fieldDescription;
}
public String getDateType() {
return dateType;
}
public void setDateType(String dateType) {
this.dateType = dateType;
}
}