您好,登錄后才能下訂單哦!
在上一篇文章中,我們實(shí)現(xiàn)了使用自定義注解導(dǎo)出Excel的小案例。但是有問題的。我們發(fā)現(xiàn),如果對象屬性中包含了date類型或者使用了枚舉類。這個(gè)時(shí)候就會出問題。我們來看看問題所在:
是不是已經(jīng)看到了結(jié)果:性別出現(xiàn)了1和0 ,而日期也出現(xiàn)的格式不是我們習(xí)慣的格式。.在來看看這個(gè)1是怎么來的。
是從枚舉類GenderEnum中來的。
我們來看看性別枚舉類:
現(xiàn)在來說說本文我們主要解決的問題:
1:怎么對日期進(jìn)行格式化?
2:怎么對枚舉類進(jìn)行轉(zhuǎn)中文?
一:怎么對日期進(jìn)行格式化
通過前幾篇文章學(xué)習(xí)中,我們知道了怎么自定義注解及使用。我們也知道自定義枚舉類的成員屬性可以有八大基本類型及其他類型。
分析:
那么我們可不可以用boolean來標(biāo)識是否使用日期,在使用string類型對日期進(jìn)行格式?
1.1:在自定義注解的成員變量中,我們定義一個(gè)Boolean類型的成員,用來標(biāo)注要開始對日期進(jìn)行格式化了。
/** ?*?是否需要格式化日期. ?*?改字段必須注解在date類型的字段上。否則會有問題 ?*?@return ?*/ public?abstract?boolean?isDateFormat()?default?false;
1.2:我們使用String類型的成員變量,來對日期進(jìn)行格式化:
/** ?*?日期格式化?format ?*?@return ?*/ public?abstract?String?dateFormatSdf()?default?"yyyy-MM-dd";
1.3:那么怎么使用呢?
我們在AnnotationUserPoJo這個(gè)類的private Date birthDay;屬性上使用:
???/** ?????*?生日 ?????*/ ????@ExcelAnnotation(ZHName?=?"生日",?colum?="C"?,isDateFormat?=?true,dateFormatSdf?=?"yyyy-MM-dd") //????@ExcelAnnotation(ZHName?=?"生日",?colum?="C") ????private?Date?birthDay;
這樣就可以了。
1.4:那么怎么解析呢?
在excel導(dǎo)出工具類中:
二:怎么對枚舉類code進(jìn)行轉(zhuǎn)中文?
分析:我們知道自定義注解的屬性還支持Class類型的。所以我們可以使用一個(gè)class屬性的成員來標(biāo)識是哪個(gè)枚舉對象;
使用String類型的屬性來標(biāo)識調(diào)用枚舉類中的那個(gè)方法;
同樣使用class類型標(biāo)注,需要調(diào)用方法的參數(shù)類型。
經(jīng)過分析,我們就能得到一些數(shù)據(jù):
2.1:在自定義注解中,使用class類型的屬性標(biāo)識是哪個(gè)枚舉對象:
/** ?*?枚舉類的類 ?*?@return ?*/ public?abstract?Class?EnumClazz()?default?String.class;
2.2:使用String類型的屬性標(biāo)注調(diào)用枚舉類中的哪個(gè)方法進(jìn)行code轉(zhuǎn)中文
/** ?*枚舉類的方法 ?*?@return ?*/ public?abstract?String?EnumMethodName()?default??"getDescriptionByCode";
2.3:同樣使用class類型的屬性標(biāo)注,調(diào)用方法中的參數(shù)類型:
/** ?*?枚舉類的方法的參數(shù) ?*?@return ?*/ public??abstract??Class?methodArgClass()?default?Integer.class;
2.4:枚舉類中code轉(zhuǎn)行中文使用
???/** ?????*?性別 ?????*/ ???@ExcelAnnotation(ZHName?=?"性別",?colum?="D",?EnumClazz=GenderEnum.class, ???????????EnumMethodName?=?"getDescriptionByCode"?,methodArgClass=Integer.class?) //????@ExcelAnnotation(ZHName?=?"性別",?colum?="D") ????private?Integer?Gender;
2.5:解析注解時(shí)候?qū)γ杜e類處理:
Class?clazz?=?attr.EnumClazz(); if(!"java.lang.String".equals(clazz.getName())){?//需要進(jìn)行轉(zhuǎn)換 ????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()); }
寫完之后。我們重寫進(jìn)行測試:
導(dǎo)出的excel是我們需要的結(jié)果。OK ,優(yōu)化初級階段ok了。
看到很多朋友說代碼怎么不貼全。因?yàn)閑xcel導(dǎo)出太多代碼了。后面凱哥會放到git上,供大家下載。
下篇預(yù)告:在下一篇文章中,我們將進(jìn)行plush版升級改造。也是我們Java注解學(xué)習(xí)系列最后一篇文章。
聲明:本文是《Java中注解學(xué)習(xí)系列教程》第五篇文章-小案例,使用自定義注解實(shí)現(xiàn)Excel導(dǎo)出優(yōu)化初級階段。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。