报表开发之自定义函数x

 报表开发之自定义函数 对于报表开发,很多情况下,自带的函数就能满足大部分用户的报表制作需求,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 公式可以正常使用啦。

推荐访问:自定义 报表 函数