Java中注解学习系列教程-5 excel导出优化初级阶段

December 17, 2023
测试
测试
测试
测试
6 分钟阅读

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

0b73cda46837fe5021e7ade737a04aa5.png
0b73cda46837fe5021e7ade737a04aa5.png

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

是从枚举类GenderEnum中来的。

我们来看看性别枚举类:

80a1a9027572ce6ac9b6dcd21c9444da.png
80a1a9027572ce6ac9b6dcd21c9444da.png

现在来说说本文我们主要解决的问题:

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";
7d49af1d3254bc4bfee40e2d214c5b52.png
7d49af1d3254bc4bfee40e2d214c5b52.png

1.3:那么怎么使用呢?

我们在AnnotationUserPoJo这个类的private Date birthDay;属性上使用:

   /**
     * 生日
     */
    @ExcelAnnotation(ZHName = "生日", colum ="C" ,isDateFormat = true,dateFormatSdf = "yyyy-MM-dd")
//    @ExcelAnnotation(ZHName = "生日", colum ="C")
    private Date birthDay;
09f896e463430a54b76e6975d4f1d704.png
09f896e463430a54b76e6975d4f1d704.png

这样就可以了。

1.4:那么怎么解析呢?

在excel导出工具类中:

24cf7bbdd9ae89e67208fb4e697365e4.png
24cf7bbdd9ae89e67208fb4e697365e4.png

二:怎么对枚举类code进行转中文?

分析:我们知道自定义注解的属性还支持Class类型的。所以我们可以使用一个class属性的成员来标识是哪个枚举对象;

使用String类型的属性来标识调用枚举类中的那个方法;

同样使用class类型标注,需要调用方法的参数类型。

经过分析,我们就能得到一些数据:

2.1:在自定义注解中,使用class类型的属性标识是哪个枚举对象:

/**
 * 枚举类的类
 * @return
 */
public abstract Class EnumClazz() default String.class;
f842e8e71d423c9b5f089843491b814e.png
f842e8e71d423c9b5f089843491b814e.png

2.2:使用String类型的属性标注调用枚举类中的哪个方法进行code转中文

/**
 *枚举类的方法
 * @return
 */
public abstract String EnumMethodName() default  "getDescriptionByCode";
65d28cf41f42a6f8475067267d31ac14.png
65d28cf41f42a6f8475067267d31ac14.png

2.3:同样使用class类型的属性标注,调用方法中的参数类型:

/**
 * 枚举类的方法的参数
 * @return
 */
public  abstract  Class methodArgClass() default Integer.class;
2188b89989bd389b5f7036ebde717a80.png
2188b89989bd389b5f7036ebde717a80.png

2.4:枚举类中code转行中文使用

   /**
     * 性别
     */
   @ExcelAnnotation(ZHName = "性别", colum ="D", EnumClazz=GenderEnum.class,
           EnumMethodName = "getDescriptionByCode" ,methodArgClass=Integer.class )
//    @ExcelAnnotation(ZHName = "性别", colum ="D")
    private Integer Gender;
72ae6385686b67890a344cc03c288920.png
72ae6385686b67890a344cc03c288920.png

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());
}
fc3f4f03e987f00e7391706c6ff3c069.png
fc3f4f03e987f00e7391706c6ff3c069.png

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

b703ede7a114fc235db53d157032c67c.png
b703ede7a114fc235db53d157032c67c.png

导出的excel是我们需要的结果。OK ,优化初级阶段ok了。

看到很多朋友说代码怎么不贴全。因为excel导出太多代码了。后面凯哥会放到git上,供大家下载。

下篇预告:在下一篇文章中,我们将进行plush版升级改造。也是我们Java注解学习系列最后一篇文章。

声明:本文是《Java中注解学习系列教程》第五篇文章-小案例,使用自定义注解实现Excel导出优化初级阶段。

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多