return null; }
return ((Object[]) valueList.get(rowIndex))[columnIndex]; }
// 准备数据
public void init() {
// 确保只被执行一次 if (valueList != null) { return; }
// 保存得到的数据库表名
String tableName = parameters[0].getValue().toString(); // 构造SQL语句,并打印出来
String sql = \ + tableName + \; FRContext.getLogger().log(Level.INFO,
\ + sql); // 保存得到的结果集
valueList = new ArrayList();
// 下面开始建立数据库连接,按照刚才的SQL语句进行查询 Connection conn = this.getConnection(); try {
Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 获得记录的详细信息,然后获得总列数
ResultSetMetaData rsmd = rs.getMetaData(); colNum = rsmd.getColumnCount(); // 用对象保存数据
Object[] objArray = null; while (rs.next()) {
objArray = new Object[colNum]; for (int i = 0; i < colNum; i++) {
objArray[i] = rs.getObject(i + 1); }
// 在valueList中加入这一行数据 valueList.add(objArray); }
// 释放数据库资源 rs.close(); stmt.close(); conn.close();
// 打印一共取到的数据行数量 FRContext.getLogger().log( Level.INFO,
\ + valueList.size() + \); } catch (Exception e) { e.printStackTrace(); } }
// 获取数据库连接 driverName 和 url 可以换成您需要的 public Connection getConnection() {
String driverName = \; String url = \(*.mdb)};DBQ=C:\\\\FineReport6.5\\\\WebReport\\\\FRDemo.mdb\; String username = \; String password = \; Connection con = null; try {
Class.forName(driverName);
con = DriverManager.getConnection(url, username, password); } catch (Exception e) { e.printStackTrace(); return null; }
return con; }
// 释放一些资源,因为可能会有重复调用,所以需释放valueList,将上次查询的结果释放掉
public void release() throws Exception { super.release(); this.valueList = null; } }
1.1 把上面代码复制到txt文档重命名为ParamTableDataDemo.java
放到报表工程\\WebReport\\WEB-INF\\classes\\com\\demo这个目录下
1.2 编译ParamTableDataDemo.java
将生成的ParamTableDataDemo.class类文件拷贝到报表工程
/WEB-INF/classes目录下。由于该类是在com.fr.data包中的,因此最终应该将该类放在/WEB-INF/classes/com/fr/data下面。此时该程序数据源便定义好了。
2. 配置程序数据源
新建报表
在报表数据集中新建程序数据源,选择我们定义好的程序数据集,如下图 名字可以自定义,如divtable
3. 使用程序数据集
配置好程序数据源后便可以使用定义的divtable程序数据集了,选中该数据集点击预
览按钮,即可以输入表名动态地获取相应的数据表,并制作模板,如下图
可以看到,我们已经将stscore表中的数据提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。
自定义函数
函数定义规则
FineReport已经提供了大量的自带函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足FineReport函数定义规则。
FineReport函数定义规则:Functionname(Para,Para,...),其中Functionname为函数名,Para为参数。
函数原理
在FineReport中,每一个函数都被定义成一个类,这个类必须要实现Function这个接口,在运算的时候首先通过函数名反射取得这个类,然后调用它的run(Object[] agrs)方法。下面以SUM这个函数为例。 package com.fr.report.script;
import com.fr.report.script.core.FArray; import com.fr.report.script.core.FunctionHelper;
public class SUM extends NormalFunction { public Object run(Object[] args) { double result = 0;
for(int i=0;i
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
sum += parseObject(array.elementAt(i)); }
return sum; }else if(obj != null){ try{
return Double.parseDouble(obj.toString()); }catch(NumberFormatException exp){ return 0; } }
return 0; } }
由程序可以看到,SUM类用来运算SUM函数,他继承了NormalFunction类,而NormalFunction实现了Function这个接口。
当函数运算的时候,先根据函数名取得运算该函数的类,如SUM(2,4,true)这个函数先根据函数名取得SUM这个类,然后调用SUM类的run(Object[] args)方法,args中存放的是SUM函数的参数,运算的时候可以从args中取得参数进行运算。如执行结果为SUM(2,4,true)=2+4+1=7。
自定义函数使用步骤
自定义函数 编译自定义函数 注册自定义函数 使用自定义函数
自定义函数使用分为四个步骤,如下:
简单的自定义函数
下面以一个简单的自定义函数例子来说明使用自定义函数的四个步骤。我们定义一个函数STRINGCAT,他的作用是把所有的参数以字符串的形式连接起来。 STRINGCAT函数使用规则为STRINGCAT(Para,Para,Para…….); 其中Para为该函数的参数,个数不限。
1. 定义自定义函数
由概述可知NormalFunction实现了Function这个接口,因此STRINGCAT可以直接继承NormalFunction类,完整代码如下:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库FineReport报表软件API源代码之程序数据集、自定义函数和导出API(2)在线全文阅读。
相关推荐: