程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 報表開發之自定義函數,報表自定義函數

報表開發之自定義函數,報表自定義函數

編輯:JAVA綜合教程

報表開發之自定義函數,報表自定義函數


對於報表開發,很多情況下,自帶的函數就能滿足大部分用戶的報表制作需求,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公式可以正常使用啦。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved