14

2024-05

当前位置: 一佳范文网 > 范文大全 > 公文范文 >

报表开发之自定义函数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 公式可以正常使用啦。

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

相关推荐

最新推荐New Ranking

1幼儿园中班六一活动方案

温暖的阳光,诱人的花香,激动的脸庞,六一国际儿童节在小朋友和老师的热烈期盼中来到了我们的身旁。...

2某市医疗保障工作要点

2022年是党的二十大召开之年,也是医保助力共同富裕的奋进之年。2022年全市医疗保障工作的总体要求是...

3区委书记在市委招商专题汇报会上讲话提纲

今年来,XX区积极响应中央、省、市号召,立足当前经济形势,抢抓发展机遇,充分挖掘中心城区区位优势...

4在局推进基层正风反腐工作会议上讲话

同志们:今天召开这次会议主要是贯彻落实3月24日我区基层正风反腐专项治理工作会议精神,部署开展我局...

5农村“五治”工作实施方案

为深入学习贯彻XXX关于实施乡村振兴战略重要讲话精神,打赢改善农村人居环境这场硬仗,践行为民宗旨、厚...

6在市政协五届一次会议开幕会上讲话

市政协四届一次会议以来的五年,是XX砥砺前行、克难攻坚的五年,也是拼搏进取、满载荣光的五年。五年...

7市全面推行证明事项告知承诺制工作实施方案

为进一步深化“放管服”改革,深入开展“减证便民”行动,优化营商环境,激发市场主体活力和社会创造...

8党课讲稿:意识形态领域形势何以发生全局性根本性转变

党的十九届六中全会通过的《中共中央关于党的百年奋斗重大成就和历史经验的决议》(以下简称《决议》...

9研讨发言:科技创新引领,构建现代产业体系(集团公司董事长,党委书记)

中央经济工作会议把“强化国家战略科技力量”“增强产业链供应链自主可控能力”提到了前所未有的战略...

10在全省药品监管工作会议上经验交流发言

2021年,全市市场监管系统在省药监局和市委、市政府的正确领导下,坚持以XXX“四个最严”为指导,聚焦...