报表开发之自定义函数

简介:

对于报表开发,很多情况下,自带的函数就能满足大部分用户的报表制作需求,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函数所使用代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
packagecom.fr.report.script;
importjava.lang.reflect.Array;
importcom.fr.report.script.core.FArray;
importcom.fr.report.script.core.FunctionHelper;
public  class  SUM extendsAbstractFunction {
          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]);
                    }
                    returnFunctionHelper.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  {
                                      returnDouble.parseDouble(obj.toString());
                             catch  (NumberFormatException exp) {
                                      return  0 ;
                             }
                    }
                    return  0 ;
          }
}

实现步骤

编写自定义函数

下面以一个简单的自定义函数例子来说明使用自定义函数。我们定义一个函数StringCat,他的作用是把所有的参数以字符串的形式连接起来。

StringCat函数使用规则为StringCat(Para,Para,Para…….);

其中Para为该函数的参数,个数不限。

由概述可知AbstractFunction实现了Function这个接口,因此StringCat可以直接继承AbstractFunction类,完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package  com.fr.function;
  
importcom.fr.script.AbstractFunction;
  
public  class  StringCatextends 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公式可以正常使用啦。



本文转自 雄霸天下啦 51CTO博客,原文链接:http://blog.51cto.com/10549520/1828359,如需转载请自行联系原作者
相关文章
|
2月前
|
分布式计算 DataWorks 大数据
maxcompute函数问题之自定义函数报错如何解决
MaxCompute函数包括内置函数和自定义函数(UDF),它们用于在MaxCompute平台上执行数据处理和分析任务;本合集将介绍MaxCompute函数的使用方法、函数编写和优化技巧,以及常见的函数错误和解决途径。
|
小程序 数据库 开发者
小程序云开发联表数据查询以及云函数中的应用
1、联表查询 (1)lookup联接两个表格 (2)使用match进行条件查询 (3)直接返回学生成绩平均值 (4)只显示teacher和score这两个值 2、在云函数中的应用 (1)在云数据库中添加数据 (2)创建云函数并初始化数据库 (3)编辑云函数入口函数 (4)上传部署云函数
848 0
小程序云开发联表数据查询以及云函数中的应用
|
3月前
|
数据可视化 安全 数据挖掘
Tableau进阶--Tableau数据故事慧(20)解构Tableau的绘图逻辑
Tableau进阶--Tableau数据故事慧(20)解构Tableau的绘图逻辑
|
9月前
|
SQL 数据采集 数据挖掘
自定义 UDF、UDTF【重点】
自定义 UDF、UDTF【重点】
135 0
|
10月前
|
BI 数据库 C++
报表制作简化版
前言: 机房收费系统无论是重构还是第一版,都用到了报表,为什么在一个系统中要添加报表呢?报表的作用是什么呢?报表百科。我理解的报表是:向上级报告情况的一个媒介,没有固定的格式。之前在项目中,我们真正给企业做过一次报表,是以导出word的形式生成的,大概格式如图:
|
11月前
|
存储 SQL Oracle
Oracle存储过程和自定义函数
Oracle存储过程和自定义函数
64 0
【SQL开发实战技巧】系列(二十七):数仓报表场景☞通过对移动范围进行聚集来详解分析函数开窗原理以及如何一个SQL打印九九乘法表
本篇文章讲解的主要内容是:***通过执行计划看开窗函数开窗语法rows\range between preceding and current row以及rows\range between unbounded preceding and unbounded following对移动范围的值进行聚集的原理以及区别】、如何通过一个SQL打印九九乘法口表!!!***
【SQL开发实战技巧】系列(二十七):数仓报表场景☞通过对移动范围进行聚集来详解分析函数开窗原理以及如何一个SQL打印九九乘法表
|
数据可视化 数据挖掘 大数据
好用的报表工具推荐(报表工具功能)
在这个大数据时代,大数据计算机已成为数据分析人员必备的工具,熟悉数据分析,并从数据快速抽取出经营问题,快速响应市场,才能让数据成为第一生产力。
好用的报表工具推荐(报表工具功能)
|
数据管理 大数据 开发者
R 高级数据管理--数学函数、统计函数和概率函数| 学习笔记
快速学习 R 高级数据管理--数学函数、统计函数和概率函数
|
大数据 开发者
R 的用户自定义函数| 学习笔记
快速学习 R 的用户自定义函数
113 0