对于报表开发,很多情况下,自带的函数就能满足大部分用户的报表制作需求,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公式可以正常使用啦。
相关推荐
在自定义函数中,我们可以利用Groovy的面向对象特性,定义类和方法来处理明细表和主表的数据交互。 2. **数据访问**:Groovy可以方便地与数据库进行交互,通过JDBC API或者ORM框架(如Hibernate)来查询明细表和主...
Java报表API源代码主要涵盖了FineReport工具的程序数据集、自定义函数和导出API的实现,旨在帮助开发者深入了解报表工具的内部工作原理,掌握二次开发技能,以应对各种个性化的业务需求。FineReport是一款强大的Java...
### VBA_Excel自定义函数大全 #### 一、引言 在日常工作中,Microsoft Excel 是一款非常重要的工具,尤其对于需要处理大量数据的人来说更是如此。为了提高工作效率,利用VBA(Visual Basic for Applications)编写...
金蝶EAS是一款针对大型企业级应用的全面企业管理软件,其强大的自定义功能为企业提供了灵活的数据处理和报表生成能力。在“金蝶EAS增加自定义取数公式范例”中,我们关注的核心知识点是如何利用EAS BOS v5.9版本及...
C#中的Linq和自定义函数可以用来实现这些操作。 3. **报表模型**:这是报表结构的定义,包含了报表的布局、样式、字段等信息。开发人员可能需要创建自定义类或使用XML来定义报表模型。 4. **报表渲染**:根据报表...
8. **自定义函数库**:为了复用代码,开发者可能创建了自定义函数库,用于处理报表中的通用任务,比如日期处理、字符串操作等。 这个压缩包中的"×Ô¶¨Ò屨±í"和"自定义报表"文件可能就是实现了上述功能的...
总的来说,UReport2作为Java开发中的一个重要工具,以其便捷的网页设计器、高性能的报表引擎和丰富的功能,为企业级报表开发提供了强大支持。对于Java开发者而言,掌握UReport2的使用将有助于提升项目中的报表设计和...
在ALV报表开发中,需要了解相关的函数,例如REUSE_ALV_GRID_DISPLAY函数、REUSE_ALV_COMMENTARY_WRITE函数、REUSE_ALV_EVENTS_GET函数、REUSE_ALV_FIELDCATALOG_MERGE函数等,这些函数可以帮助开发者更方便地实现...
在这个"Excel-VBA宏编程实例源代码-自定义函数-计算固定资产折旧.zip"压缩包中,包含了一个具体的实例,即如何使用VBA编写自定义函数来计算固定资产的折旧值。 固定资产折旧是企业财务会计中的一个重要概念,用于...
《水晶报表开发手册》是一本专注于水晶报表(Crystal Reports)开发的专业指南,它在IT行业中备受推崇,被誉为“最流行的水晶报表开发手册”。水晶报表是Business Objects公司(现为SAP的一部分)开发的一款强大的报告...
### 报表开发框架整理 #### 一、Wabacus框架详解 Wabacus作为一款专为JavaEE设计的报表开发框架,其核心优势在于极大简化了数据展示、编辑及表单处理等常见任务的开发流程。通过面向声明的开发模式,Wabacus能够...
在这个“Excel-VBA宏编程实例源代码-自定义函数-提取商品名称中汉字.zip”压缩包中,包含了一个具体的应用示例,即如何通过VBA宏来编写自定义函数,专门用于从商品名称中提取出汉字部分。这个功能对于处理大量含有中...
在IT行业中,自定义窗口预览报表是一种常见的需求,特别是在系统开发中,它能提供更加灵活和个性化的数据展示方式,提升用户体验。本模块的核心是利用Visual FoxPro(VFP)进行报表设计与预览,避免使用VFP自带的...
在功能扩展性上,DevExpress的报表工具支持自定义函数和脚本,开发者可以通过编写C#或VB.NET代码,实现更高级的计算逻辑、数据处理和交互功能。同时,还可以添加自定义控件,增强报表的交互性和用户体验。 至于...
3. **计算字段与函数**:自定义报表可能需要一些计算字段,如总计、平均值或百分比,源码中会有对应的计算逻辑。 4. **事件处理**:PB支持事件驱动编程,源码中可能会有对用户交互事件(如点击、双击)的响应函数,...
标题中的“EBS多sheet页Excel动态报表开发过程”指的是在企业资源规划系统(Enterprise Business Suite,简称EBS)中创建能够根据数据变化自动更新、包含多个工作表(sheet)的Excel报表的过程。EBS是Oracle公司提供...
报表设计器适合快速创建简单的报表,二次开发适合有编程基础且需要高级功能的用户,而接口开发与集成则更适合那些希望充分利用已有工具的企业。在实际操作中,可根据具体需求和资源状况,灵活选择适合自己的方式,以...
Java作为一门跨平台的编程语言,其丰富的库和框架为开发自定义报表提供了广泛支持。在这种环境中,开发者可以利用Java的灵活性和强大的处理能力来创建复杂的数据分析和可视化工具。描述中提到的"采用Excel的习惯来...
3. **表达式和函数**:在报表设计中,可以使用表达式和内置函数对数据进行计算、转换,如求和、平均值、条件判断等,以增强报表的计算能力。 4. **分组和汇总**:对于大量数据,可以进行分组和汇总操作,例如按类别...