999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Java反射和Fel計算引擎動態導出Excel的實現

2022-08-20 09:21:42張勝楠
現代計算機 2022年12期
關鍵詞:信息方法

張勝楠

(武漢光谷職業學院,武漢 430000)

0 引言

Web系統應用中經常會進行Excel表格的導出,傳統的導出方式在導出不同對象時需要配置表頭并且代碼頻繁復用,導致代碼冗余、工作量大,導出流程機械,并且對于大數據表操作效率較低。本文介紹一種基于Java反射和自定義注解,結合Fel計算表達式的方法,來實現Excel靈活動態的導出效果。

1 相關概念介紹

1.1 Java反射

Java反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為Java語言的反射機制。

1.2 自定義注解

注解其實就是一種標記,可以在程序代碼中的關鍵節點(類、方法、變量、參數、包)上打上這些標記,然后程序在編譯時或運行時可以檢測到這些標記從而執行一些特殊操作。

1.3 Fel計算

Fel是輕量級的高效的表達式計算引擎,Fel源自于企業項目,設計目標是為了滿足不斷變化的功能需求和性能需求。Fel的執行主要通過函數實現,運算符(+、-等)都是Fel函數,所有這些函數都是可以替換的,擴展函數也非常簡單,可以根據性能要求選擇執行方式。編譯執行就是將表達式編譯成字節碼(生成java代碼和編譯模塊都是可以擴展和替換的)。

2 實現步驟

2.1 自定義注解

構建ExportTblAnnotation.java類,自定義類注解:構建ExportAnnotation.java類,自定義方法注解,標記特定的類和方法,用于導出文件的數據填充。

//Excel導出注解

@Target({E1ementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public@interface ExportTblAnnotation{

}

//Excel導出注解

@Target({E1ementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public@interface ExportAnnotation{

Public String code()default"";

}

2.2 創建Bean Def i nat i on對象

用于存儲被上述自定義注解所標記的類和方法的定義。一個BeanDefinition描述了一個Bean實例,實例包含屬性值、構造方法參數值以及更多實現信息。該BeanDefinition只是一個最小的接口,主要目的是能動態地調用實現方法,這里列出幾個核心方法。

//bean定義

public class BeanDefinition{

private String beanName;

private String methodName;

private Class<?>[]parameterClass;

private Class<?>returnType;

private String[]parameterNames;

public String[]getParameterNames(){return paraneterNames;}

public void setParameterNames(String[]parame ter-Names){this.parameterNames=parameterNames;}

public String getBeanName(){return beanName;}

public void setBeanName(String beanName){this.beanName=beanName;}

public String getMethodName(){return methodName;}

public Class<?>[]getParameterClass(){return parameterClass;}

public void setParameterClass(Class<?>[]parameter-Class){this.parameterClass=parameterClass;}

....

2.3 添加自定義注解掃描方法

在程序啟動時,初始化階段掃描有上述自定義注解的類與方法,并將該方法的bean-Name、方法名稱methodName、參數類型parameterClass、參數名稱parameterNames、返回類型returnType等屬性存到BeanDefinition對象,與注解上code值一一映射,存入beanMap,核心代碼如下:

@PostConstruct

Public void init(){

log.info(“開始初始化報表配置”);

Map<String,Object>beanDefinitions=SpringContextUtils.getApplicationContext().getBeansWithAnnotation(ExportTblAnnotion.class);

DefaultParameterNameDiscoverer dpnp=new DefaultParameterNameDiscoverer();

...

BeanDefinition definition=new BeanDefinition();

...

Constant.beanMap.put(code,definition);

...

2.4 創建動態導出文件配置表

(1)創建導出文件配置信息表(見圖1),用于存儲導出路徑、導出報表名稱,支持xls、xlsx和csv三種格式、導出報表編碼,該值和自定義注解的code值對應、導出方式,支持方法導出、SQL導出、直接導出三種方式。

圖1 導出文件配置信息表

①方法導出方式僅需在導出文件所需數據的查詢方法上面添加自定義注解并配置報表編碼,舉例如下:

//添加自定義注解

@ExportAnnotation(code="ATLAS_TXN_DTL")

@0verride

public PageOutVo<BaseTxnV0> queryTxnDtl(AtlasTxnDtlInV0 inV0){

PageOutVo<BaseTxnV0>outV0=new PageOutVo<>();

If(StringUtils.isEmpty(inV0.getFrom())||String-Utils.isEmpty(inV0.getTarget())){

return outV0;

}

StringBuilder sb=new StringBuilder();

配置報表編碼(圖2)。

圖2 配置報表編碼

②SQL導出方式僅需配置exp_sql,配置查詢數據的SQL語句即可,無需添加任何代碼。

③直接導出用于導出已生成的文件。

(2)創建導出文件字段映射表(見圖3),用于存儲Excel表頭、標題、列寬、行高、填充值等屬性。顯示屬性SHOW_FLAG可以動態調整數據列的顯示狀態,順序屬性DISPLAY_ORDER可以調整列的顯示順序。

圖3 導出文件字段映射

接上述例子,假設導出報表的表頭是序號、交易卡號、交易對方證件號等信息,表填充如圖4。

圖4 導出報表填充信息

以上兩個步驟即可完成動態導出文件的相關配置,相對于傳統實現方法的業務代碼和功能代碼耦合性高,且需求變化時會修改大量代碼,本方法僅通過配置的方式即可實現,業務代碼和導出邏輯完全分離,移植性好。

2.5 添加公共導出接口

用戶通過前端頁面傳入待導出文件對應的報表編碼值及查詢條件json串,即可根據上述配置信息表中的配置信息以及反射機制靈活導出多種格式文件,公共導出接口方法:

@GetMapping("/export/data")

@ApiOperation(“導出文件接口”)

public ResponseEntity<Resource>exportData(String code,String condStr){

log.info(“開始導出文件code="+code+";condStr=”+condStr);

Map<String.Object>parm=new HashMap();

parm.put(“code”,code);

List<EpTblCfg> tblCfgList= jdbcTemplate.qury

(“select*fromep_tbl_cfg where table_code=:code”,parm,new ObjRowMapper(EpTblCfg.class));

if(CollectionUtils.isEmpty(tblCfglist)){

throw new AmtRunExceptin(“未配置表格配置信息:”+code);

}

EpTblCfg tblCfg=tblCfgList.get(0);

String expTpCd=StringUtils.isEmpty(tblCfg.getExp-Type())?Constant.EXP_TPCD.METHOD:

tblCfg.getExpType();

If(Constant.EXP_TPCD.METHOD.equals(exp TpCd)){

Return reportByMethod(code,condStr);

}else if(Constant.EXP_TPCD.FILE.equals(exp TpCd)){

Return reportByFile(code,condStr);

}else if(Constant.EXP_TPCD.SQL.equals(exp TpCd)){

Return reportBySql(code,condStr);

}else{Throw new AmtRunException(“導出類型配置錯誤”);

}

2.6 通過反射機制實現方法調用

公共接口方法通過code值找到對應的beandefinition對象,通過反射進行查詢方法調用,獲取要導出的數據。

...

BeanDefinition beanDefinition=Constant.beanMap.get(code);

...

Object service=SpringContextUtils.getBean(beanDefinition.getBeanName());

Method method=beanDefinition.getMethod();

.....

method.invoke(service,args,parameterClass)

2.7 基于Fel動態導出實現

將上述獲取到的待導出數據進行處理,通過2.4中所配置的文件字段信息及Fel表達式計算,動態生成表頭、標題及填充數據內容。for(EpFieldcfg cfg:columnCfg){

Cell cell=bodyRow.createCell(bodyCellIdx++);

cell.setCellStyle(bodyStyle);

object result=null;

if(StringUtils.isNotEmpty(cfg.getFieldData())){

try{

result=FelUtils.getExpressionResult(cfg.get-FieldData(),mct);

}catch(Exception e){...}

if(result==null){

cell.setCellvalue(""′);

}else{

cell.setCellValue(result.toString());

}

3 結語

本文實現了一種更加高效靈活的動態Excel文件導出方法。創新點有三處:①利用自定義注解及Java反射機制,使代碼更加簡潔,而且業務代碼和導出功能代碼是獨立的,減小耦合性;②導出功能還運用了Fel表達式計算引擎的特性,支持大數據高精度計算、千萬次每秒的執行速度、而且輕量級易擴展,使Excel導出更具有靈活性、高效性和易擴展性;③導出方式有三種,支持方法導出、SQL導出、直接導出,導出報表支持xls、xlsx和csv三種格式。

猜你喜歡
信息方法
學習方法
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
信息
建筑創作(2001年3期)2001-08-22 18:48:14
健康信息
祝您健康(1987年3期)1987-12-30 09:52:32
健康信息(九則)
祝您健康(1987年2期)1987-12-30 09:52:28
主站蜘蛛池模板: 国产高清在线观看91精品| 欧美第一页在线| 波多野结衣一级毛片| 国产精品成人啪精品视频| 国产成人高精品免费视频| 日韩午夜福利在线观看| 国产成人精品视频一区二区电影| 国产精品第5页| 天天躁夜夜躁狠狠躁图片| 日韩福利视频导航| 久久免费观看视频| 色婷婷成人| 夜夜高潮夜夜爽国产伦精品| 亚洲日本中文字幕乱码中文| 亚洲精品视频免费观看| 69精品在线观看| 亚洲精品无码高潮喷水A| 国产综合精品日本亚洲777| 99精品视频播放| 欧美三级日韩三级| 国产原创第一页在线观看| 最新日本中文字幕| 成人日韩精品| 九色91在线视频| 日韩第一页在线| 在线中文字幕网| 欧美精品1区| 国产精品精品视频| AV不卡在线永久免费观看| 日本亚洲国产一区二区三区| Aⅴ无码专区在线观看| 亚洲第一黄片大全| 丁香六月综合网| 色偷偷男人的天堂亚洲av| 99精品热视频这里只有精品7| 精品国产www| 毛片免费在线| 四虎永久在线| 91福利免费| 欧美日韩第三页| 毛片网站观看| 日日拍夜夜嗷嗷叫国产| 久久国产精品电影| 亚洲中文精品人人永久免费| 九九热这里只有国产精品| 亚洲自拍另类| 日韩欧美综合在线制服| 亚洲天堂久久久| 欧美三级日韩三级| 亚洲丝袜第一页| 伊人网址在线| 婷婷六月在线| 亚洲人成影院在线观看| AV在线麻免费观看网站| 国产成人久久综合777777麻豆| 欧美色伊人| 四虎永久免费网站| 91成人在线免费视频| 91尤物国产尤物福利在线| 一级香蕉人体视频| 国产福利免费观看| 狠狠色香婷婷久久亚洲精品| 伊人色天堂| 色综合中文字幕| 免费一级毛片不卡在线播放| 国产精品短篇二区| 亚洲精品欧美重口| 亚洲无码高清一区| 人妻少妇乱子伦精品无码专区毛片| 欧美在线一二区| 成人韩免费网站| 69av在线| 久久国产乱子| 欧美国产在线一区| 国产真实二区一区在线亚洲| 久草青青在线视频| 91福利免费视频| 精品国产一区二区三区在线观看| 国产乱人伦AV在线A| 久久精品只有这里有| 久久大香伊蕉在人线观看热2| 国产精品成人第一区|