对于报表开发,很多情况下,自带的函数就能满足大部分用户的报表制作需求,FineReport也不例外。但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足函数定义规则。先来了 ...
对于报表开发,很多情况下,自带的函数就能满足大部分用户的报表制作需求,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; }}
原标题:报表开发之自定义函数
关键词:函数
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。