在上一篇文章中,我们实现了使用自定义注解导出Excel的小案例。但是有问题的。我们发现,如果对象属性中包含了date类型或者使用了枚举类。这个时候就会出问题。我们来看看问题所在:

是不是已经看到了结果:性别出现了1和0 ,而日期也出现的格式不是我们习惯的格式。.在来看看这个1是怎么来的。

是从枚举类GenderEnum中来的。
我们来看看性别枚举类:

现在来说说本文我们主要解决的问题:
1:怎么对日期进行格式化?
2:怎么对枚举类进行转中文?
一:怎么对日期进行格式化
通过前几篇文章学习中,我们知道了怎么自定义注解及使用。我们也知道自定义枚举类的成员属性可以有八大基本类型及其他类型。
分析:
那么我们可不可以用boolean来标识是否使用日期,在使用string类型对日期进行格式?
1.1:在自定义注解的成员变量中,我们定义一个Boolean类型的成员,用来标注要开始对日期进行格式化了。
/**
* 是否需要格式化日期.
* 改字段必须注解在date类型的字段上。否则会有问题
* @return
*/
public abstract boolean isDateFormat() default false;
1.2:我们使用String类型的成员变量,来对日期进行格式化:
/**
* 日期格式化 format
* @return
*/
public abstract String dateFormatSdf() default "yyyy-MM-dd";

1.3:那么怎么使用呢?
我们在AnnotationUserPoJo这个类的private Date birthDay;属性上使用:
/**
* 生日
*/
@ExcelAnnotation(ZHName = "生日", colum ="C" ,isDateFormat = true,dateFormatSdf = "yyyy-MM-dd")
// @ExcelAnnotation(ZHName = "生日", colum ="C")
private Date birthDay;

这样就可以了。
1.4:那么怎么解析呢?
在excel导出工具类中:

二:怎么对枚举类code进行转中文?
分析:我们知道自定义注解的属性还支持Class类型的。所以我们可以使用一个class属性的成员来标识是哪个枚举对象;
使用String类型的属性来标识调用枚举类中的那个方法;
同样使用class类型标注,需要调用方法的参数类型。
经过分析,我们就能得到一些数据:
2.1:在自定义注解中,使用class类型的属性标识是哪个枚举对象:
/**
* 枚举类的类
* @return
*/
public abstract Class EnumClazz() default String.class;

2.2:使用String类型的属性标注调用枚举类中的哪个方法进行code转中文
/**
*枚举类的方法
* @return
*/
public abstract String EnumMethodName() default "getDescriptionByCode";

2.3:同样使用class类型的属性标注,调用方法中的参数类型:
/**
* 枚举类的方法的参数
* @return
*/
public abstract Class methodArgClass() default Integer.class;

2.4:枚举类中code转行中文使用
/**
* 性别
*/
@ExcelAnnotation(ZHName = "性别", colum ="D", EnumClazz=GenderEnum.class,
EnumMethodName = "getDescriptionByCode" ,methodArgClass=Integer.class )
// @ExcelAnnotation(ZHName = "性别", colum ="D")
private Integer Gender;

2.5:解析注解时候对枚举类处理:
Class clazz = attr.EnumClazz();
if(!"java.lang.String".equals(clazz.getName())){ //需要进行转换
Method method = clazz.getMethod(attr.EnumMethodName(),attr.methodArgClass());
Object obj = method.invoke(clazz,field.get(vo));
if(null != obj ){
cell.setCellValue( obj.toString());
}else{
cell.setCellValue( "");
}
}else{
cell.setCellValue(field.get(vo) == null ? ""
: attr.pre()+String.valueOf(field.get(vo))+attr.suffix());
}

写完之后。我们重写进行测试:

导出的excel是我们需要的结果。OK ,优化初级阶段ok了。
看到很多朋友说代码怎么不贴全。因为excel导出太多代码了。后面凯哥会放到git上,供大家下载。
下篇预告:在下一篇文章中,我们将进行plush版升级改造。也是我们Java注解学习系列最后一篇文章。
声明:本文是《Java中注解学习系列教程》第五篇文章-小案例,使用自定义注解实现Excel导出优化初级阶段。