wuxiren123

          報表開發(fā)之自定義函數(shù)

          對于報表開發(fā),很多情況下,自帶的函數(shù)就能滿足大部分用戶的報表制作需求,F(xiàn)ineReport也不例外。但是在一些特殊領(lǐng)域,可能需要一些特殊的函數(shù),在這種情況下,F(xiàn)ineReport提供了自定義函數(shù)機制,可以由用戶根據(jù)業(yè)務(wù)需要自己來定義一些函數(shù),但這些函數(shù)必須滿足函數(shù)定義規(guī)則。

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

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

          SUM函數(shù)原理

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

          當(dāng)函數(shù)運算的時候,先根據(jù)函數(shù)名取得運算該函數(shù)的類,如SUM(2,4,true)這個函數(shù)先根據(jù)函數(shù)名取得SUM這個類,然后調(diào)用SUM類的run(Object[] args)方法,args中存放的是SUM函數(shù)的參數(shù),運算的時候可以從args中取得參數(shù)進(jìn)行運算。如執(zhí)行結(jié)果為SUM(2,4,true)=2+4+1=7。

          SUM函數(shù)所使用代碼:

          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;
              }

          }

          實現(xiàn)步驟

          編寫自定義函數(shù)

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

          StringCat函數(shù)使用規(guī)則為StringCat(Para,Para,Para…….);

          其中Para為該函數(shù)的參數(shù),個數(shù)不限。

          由概述可知AbstractFunction實現(xiàn)了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;
              }

          }

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

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

          編譯自定義函數(shù)

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

          注冊自定義函數(shù)

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


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

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

          使用自定義函數(shù)

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

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

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

          點擊分頁預(yù)覽在參數(shù)控件中,寫入?yún)?shù)值如para1為:FineReport,para2為:123。

          點擊查詢可以看到結(jié)果


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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 分宜县| 清水河县| 新巴尔虎右旗| 禄丰县| 化德县| 长宁县| 醴陵市| 罗田县| 朝阳市| 德保县| 博湖县| 泰州市| 枣阳市| 客服| 曲阜市| 简阳市| 静宁县| 庆阳市| 镇康县| 惠东县| 玉溪市| 芦山县| 德州市| 沙田区| 海口市| 湖北省| 五大连池市| 抚顺县| 西和县| 安乡县| 尉犁县| 胶州市| 固原市| 古丈县| 瓦房店市| 平果县| 山西省| 博爱县| 波密县| 油尖旺区| 普兰店市|