亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Java反射和Fel計算引擎動態(tài)導(dǎo)出Excel的實(shí)現(xiàn)

        2022-08-20 09:21:42張勝楠
        現(xiàn)代計算機(jī) 2022年12期
        關(guān)鍵詞:信息方法

        張勝楠

        (武漢光谷職業(yè)學(xué)院,武漢 430000)

        0 引言

        Web系統(tǒng)應(yīng)用中經(jīng)常會進(jìn)行Excel表格的導(dǎo)出,傳統(tǒng)的導(dǎo)出方式在導(dǎo)出不同對象時需要配置表頭并且代碼頻繁復(fù)用,導(dǎo)致代碼冗余、工作量大,導(dǎo)出流程機(jī)械,并且對于大數(shù)據(jù)表操作效率較低。本文介紹一種基于Java反射和自定義注解,結(jié)合Fel計算表達(dá)式的方法,來實(shí)現(xiàn)Excel靈活動態(tài)的導(dǎo)出效果。

        1 相關(guān)概念介紹

        1.1 Java反射

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

        1.2 自定義注解

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

        1.3 Fel計算

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

        2 實(shí)現(xiàn)步驟

        2.1 自定義注解

        構(gòu)建ExportTblAnnotation.java類,自定義類注解:構(gòu)建ExportAnnotation.java類,自定義方法注解,標(biāo)記特定的類和方法,用于導(dǎo)出文件的數(shù)據(jù)填充。

        //Excel導(dǎo)出注解

        @Target({E1ementType.TYPE})

        @Retention(RetentionPolicy.RUNTIME)

        @Documented

        public@interface ExportTblAnnotation{

        }

        //Excel導(dǎo)出注解

        @Target({E1ementType.METHOD})

        @Retention(RetentionPolicy.RUNTIME)

        @Documented

        public@interface ExportAnnotation{

        Public String code()default"";

        }

        2.2 創(chuàng)建Bean Def i nat i on對象

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

        //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、參數(shù)類型parameterClass、參數(shù)名稱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 創(chuàng)建動態(tài)導(dǎo)出文件配置表

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

        圖1 導(dǎo)出文件配置信息表

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

        //添加自定義注解

        @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導(dǎo)出方式僅需配置exp_sql,配置查詢數(shù)據(jù)的SQL語句即可,無需添加任何代碼。

        ③直接導(dǎo)出用于導(dǎo)出已生成的文件。

        (2)創(chuàng)建導(dǎo)出文件字段映射表(見圖3),用于存儲Excel表頭、標(biāo)題、列寬、行高、填充值等屬性。顯示屬性SHOW_FLAG可以動態(tài)調(diào)整數(shù)據(jù)列的顯示狀態(tài),順序?qū)傩訢ISPLAY_ORDER可以調(diào)整列的顯示順序。

        圖3 導(dǎo)出文件字段映射

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

        圖4 導(dǎo)出報表填充信息

        以上兩個步驟即可完成動態(tài)導(dǎo)出文件的相關(guān)配置,相對于傳統(tǒng)實(shí)現(xiàn)方法的業(yè)務(wù)代碼和功能代碼耦合性高,且需求變化時會修改大量代碼,本方法僅通過配置的方式即可實(shí)現(xiàn),業(yè)務(wù)代碼和導(dǎo)出邏輯完全分離,移植性好。

        2.5 添加公共導(dǎo)出接口

        用戶通過前端頁面?zhèn)魅氪龑?dǎo)出文件對應(yīng)的報表編碼值及查詢條件json串,即可根據(jù)上述配置信息表中的配置信息以及反射機(jī)制靈活導(dǎo)出多種格式文件,公共導(dǎo)出接口方法:

        @GetMapping("/export/data")

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

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

        log.info(“開始導(dǎo)出文件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(“導(dǎo)出類型配置錯誤”);

        }

        2.6 通過反射機(jī)制實(shí)現(xiàn)方法調(diào)用

        公共接口方法通過code值找到對應(yīng)的beandefinition對象,通過反射進(jìn)行查詢方法調(diào)用,獲取要導(dǎo)出的數(shù)據(jù)。

        ...

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

        ...

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

        Method method=beanDefinition.getMethod();

        .....

        method.invoke(service,args,parameterClass)

        2.7 基于Fel動態(tài)導(dǎo)出實(shí)現(xiàn)

        將上述獲取到的待導(dǎo)出數(shù)據(jù)進(jìn)行處理,通過2.4中所配置的文件字段信息及Fel表達(dá)式計算,動態(tài)生成表頭、標(biāo)題及填充數(shù)據(jù)內(nèi)容。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 結(jié)語

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

        猜你喜歡
        信息方法
        學(xué)習(xí)方法
        訂閱信息
        中華手工(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
        信息
        健康信息
        祝您健康(1987年3期)1987-12-30 09:52:32
        日本人妻伦理片在线观看| 3d动漫精品一区二区三区| 天堂网在线最新版www中文网| 国产小屁孩cao大人免费视频| 国产精品二区三区在线观看| 午夜视频在线观看一区二区小| 成人区人妻精品一区二区不卡网站 | 中文字幕色偷偷人妻久久一区| 免费国产成人肉肉视频大全| 免费无码av片在线观看| h动漫尤物视频| 老女人下面毛茸茸的视频| 亚洲av综合av成人小说| 国产精品久久久久久久久鸭| 天堂岛国精品在线观看一区二区 | 草草影院发布页| 亚洲欧美激情在线一区| 日韩欧美国产亚洲中文| 精品人妻日韩中文字幕| 一本加勒比hezyo无码专区| 中文字幕精品无码一区二区| 无码av专区丝袜专区| 日韩精品视频在线观看无| 香港台湾经典三级a视频| 亚洲精品视频久久| 亚洲图文一区二区三区四区| 麻豆国产一区二区三区四区| 国产在线不卡一区二区三区| 国产亚洲欧美日韩国产片| 日本少妇熟女一区二区| 内射人妻视频国内| 香蕉成人啪国产精品视频综合网 | 国产精品沙发午睡系列990531| 岛国精品一区二区三区| 中文字幕乱码一区在线观看| 国产精品久久久久精品一区二区| 国产普通话对白视频二区| 日韩成精品视频在线观看| 曰批免费视频播放免费| 男人边吃奶边做好爽免费视频| 国产 无码 日韩|