<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wuxiren123

    報表開發之自定義函數

    對于報表開發,很多情況下,自帶的函數就能滿足大部分用戶的報表制作需求,FineReport也不例外。但是在一些特殊領域,可能需要一些特殊的函數,在這種情況下,FineReport提供了自定義函數機制,可以由用戶根據業務需要自己來定義一些函數,但這些函數必須滿足函數定義規則。

    先來了解一下FineReport的函數定義規則:Functionname(Para,Para,...),其中Functionname為函數名,Para為參數。

    每一個函數都被定義成一個類,這個類必須要實現Function這個接口,在運算的時候首先通過函數名反射取得這個類,然后調用它的run(Object[] agrs)方法。下面以SUM這個函數為例。

    SUM函數原理

    由程序可以看到,SUM類用來運算SUM函數,他繼承了AbstractFunction類,而AbstractFunction實現了Function這個接口。

    當函數運算的時候,先根據函數名取得運算該函數的類,如SUM(2,4,true)這個函數先根據函數名取得SUM這個類,然后調用SUM類的run(Object[] args)方法,args中存放的是SUM函數的參數,運算的時候可以從args中取得參數進行運算。如執行結果為SUM(2,4,true)=2+4+1=7。

    SUM函數所使用代碼:

    package com.fr.report.script;
    import java.lang.reflect.Array;
    import com.fr.report.script.core.FArray;
    import com.fr.report.script.core.FunctionHelper;
    public class SUM extends AbstractFunction {
        
    public Object run(Object[] args) {
            
    double result = 0;
            
    for (int i = 0; i < args.length; i++{
                
    if (args[i] == null{
                    
    continue;
                }

                result 
    += parseObject(args[i]);
            }

            
    return FunctionHelper.parsePrimitiveDouble(result);
        }

        
    private double parseObject(Object obj) {
            
    if (obj instanceof Number) {
                
    return ((Number) obj).doubleValue();
            }
     else if (obj instanceof Boolean) {
                
    return ((Boolean) obj).booleanValue() ? 1 : 0;
            }
     else if (obj instanceof FArray) {
                FArray array 
    = (FArray) obj;
                
    double sum = 0;
                
    for (int i = 0; i < array.length(); i++{
                    sum 
    += parseObject(array.elementAt(i));
                }

                
    return sum;
            }
     else if (obj != null{
                
    try {
                    
    return Double.parseDouble(obj.toString());
                }
     catch (NumberFormatException exp) {
                    
    return 0;
                }

            }

            
    return 0;
        }

    }

    實現步驟

    編寫自定義函數

    下面以一個簡單的自定義函數例子來說明使用自定義函數。我們定義一個函數StringCat,他的作用是把所有的參數以字符串的形式連接起來。

    StringCat函數使用規則為StringCat(Para,Para,Para…….);

    其中Para為該函數的參數,個數不限。

    由概述可知AbstractFunction實現了Function這個接口,因此StringCat可以直接繼承AbstractFunction類,完整代碼如下:

    package com.fr.function;

    import com.fr.script.AbstractFunction;

    public class StringCat extends AbstractFunction {
        
    public Object run(Object[] args) {
            String result 
    = "";
            Object para;
            
    for (int i = 0; i < args.length; i++{
                para 
    = args[i];
                result 
    += para.toString();
            }

            
    return result;
        }

    }

    這里要注意,使用函數StringCat(Para,Para,Para…..)時,根據函數名取得運算該函數的類StringCat,并將參數傳入類中的args對象數組中,執行該類的run函數。

    而在run函數中即實現了將傳入的參數以字符串的形式連接起來。并返回最終形成的字符串。

    編譯自定義函數

    將編譯后的StringCat.class放到FineReport的安裝目錄WEB-INF下面的classes目錄下,因為StringCat.java屬于包com.fr.function,所以StringCat.class需要放到classes\com\fr\function目錄下。

    注冊自定義函數

    生成該函數的類后需要在設計器中進行注冊,才可以使用該函數。打開服務器|函數管理器,選擇剛剛定義好了StringCat類,如下圖


    函數名稱可以自定義,如這邊定義為StringCat;

    同時可以添加該函數的使用說明,如上圖所示的描述

    使用自定義函數

    注冊好自定義函數后,制作報表時便可直接使用了,使用方法與內置的函數是相同的。

    新建報表,定義兩個報表參數para1、para2,類型分別為字符串型與整形,默認值分別為空字符串與0

    在空白報表的任意單元格里寫入公式:=StringCat($para1,$para2)(注意:寫入公式的時候在參數名前加$,表明這是使用的參數)

    點擊分頁預覽在參數控件中,寫入參數值如para1為:FineReport,para2為:123。

    點擊查詢可以看到結果


    說明StringCat公式可以正常使用啦。

    posted on 2016-07-21 12:17 喝水居然長肉 閱讀(62) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 性短视频在线观看免费不卡流畅 | 久久WWW免费人成人片| 久久久久亚洲精品无码网址 | 亚洲国产精品成人精品无码区在线| 四虎影视在线看免费观看| 日本黄页网站免费| 国产亚洲男人的天堂在线观看| 日韩精品视频免费观看| 日韩欧美亚洲中文乱码| 免费成人av电影| 一级一级一片免费高清| 亚洲综合无码AV一区二区| 日本免费A级毛一片| 亚洲综合久久综合激情久久| 91香蕉国产线观看免费全集| 中国videos性高清免费| 亚洲中文字幕在线乱码| 日韩视频免费在线观看| 亚洲国产高清在线精品一区| 处破痛哭A√18成年片免费| 麻豆亚洲AV成人无码久久精品 | 日本一区免费电影| 特级做a爰片毛片免费看| 在线精品亚洲一区二区小说 | 中国一级全黄的免费观看| 亚洲国产女人aaa毛片在线| 亚洲啪啪免费视频| 亚洲av成人无码网站…| 亚洲中文字幕视频国产| 含羞草国产亚洲精品岁国产精品 | 国产在线观看免费视频播放器 | 深夜久久AAAAA级毛片免费看| 日韩一卡2卡3卡4卡新区亚洲| 亚洲精品视频在线观看免费| 亚洲色丰满少妇高潮18p| 亚洲乱码中文字幕综合234| 成人爽a毛片免费| 亚洲日韩国产AV无码无码精品| 免费A级毛片无码A| 一级毛片在线免费看| 亚洲码和欧洲码一码二码三码|