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
主站蜘蛛池模板: V一区无码内射国产| 色窝窝免费一区二区三区| 精品黑人一区二区三区| 99资源在线| 午夜国产精品视频| 手机成人午夜在线视频| 日韩在线视频网站| 99国产精品国产高清一区二区| 波多野结衣在线se| 亚洲人成人无码www| 最新国产在线| 亚洲精品国产精品乱码不卞 | 六月婷婷精品视频在线观看| 久久久久人妻一区精品色奶水| 免费在线一区| 天天色综网| 欧美人与牲动交a欧美精品| 麻豆精品视频在线原创| 亚洲IV视频免费在线光看| 国产高颜值露脸在线观看| 亚洲第一色视频| 国产精品亚洲片在线va| 91精品伊人久久大香线蕉| 欧美日韩第二页| 国产剧情一区二区| 四虎在线观看视频高清无码 | 欧美在线视频不卡第一页| 国产一级精品毛片基地| 99资源在线| 亚洲国产精品一区二区第一页免| 久久久亚洲国产美女国产盗摄| 囯产av无码片毛片一级| 激情成人综合网| 国产亚洲欧美在线中文bt天堂| 国产欧美视频在线观看| www.狠狠| 久久久久无码国产精品不卡| 久久国产精品国产自线拍| 国产一二三区视频| 国产91在线|日本| 欧美综合成人| 一级全黄毛片| 婷婷综合缴情亚洲五月伊| 麻豆精品视频在线原创| 97成人在线视频| 91精品人妻一区二区| 美女扒开下面流白浆在线试听| 波多野吉衣一区二区三区av| 国产乱人免费视频| 五月婷婷亚洲综合| 92精品国产自产在线观看| 午夜一区二区三区| 99re热精品视频国产免费| 欧美成人亚洲综合精品欧美激情| 2021国产在线视频| 亚洲香蕉在线| 日韩精品一区二区三区swag| 国产精品分类视频分类一区| 亚洲手机在线| 青青青视频免费一区二区| 欧美国产精品拍自| 日本亚洲成高清一区二区三区| 亚洲第一国产综合| a亚洲视频| 蜜臀AVWWW国产天堂| 婷婷伊人五月| 婷婷中文在线| 国产精品19p| 亚洲天堂网站在线| 亚洲精品动漫| 成人福利在线看| 91麻豆国产视频| 久久精品一品道久久精品| 久久久亚洲色| 欧美中文字幕一区二区三区| 国产精品七七在线播放| 国产中文一区a级毛片视频| 国产成人精品免费av| 喷潮白浆直流在线播放| 日韩高清一区 | 成年网址网站在线观看| 日韩人妻无码制服丝袜视频|