ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:291.75KB ,
资源ID:12437605      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-12437605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(FineReport报表软件API源代码之程序数据集自定义函数和导出API.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

FineReport报表软件API源代码之程序数据集自定义函数和导出API.docx

1、FineReport报表软件API源代码之程序数据集自定义函数和导出API概述随着FineReport的发展,它提供的设计器和服务器应该能够满足您绝大部分的需求,完全实现零编码的软件开发,革命性地加快软件开发速度,提高软件稳定性。但是需求是千变万化的,而FineReport所包含的功能是报表行业中比较普遍的、典型的,也许某些个性化的功能通过FineReport软件无法实现。因此FineReport开放了能够进行二次开发的接口,来更好的满足您软件产品或项目中的个性化的需求。您可以根据该引擎API文档学习各类接口的使用方法,另外若您是一名程序员,且对FineReport报表深感兴趣,希望更深入地了

2、解FineReport软件的内部原理,您也可以阅读该章节。FineReport引擎API文档对如何定义类、编译类文件及JAVA开发平台使用等JAVA基础知识未作介绍,因此在您查看引擎API文档前请确保您有一定的JAVA基础。目录1. 程序数据源2.1 简单程序数据集2.2 带参程序数据集2. 自定义函数1 2 3 3.1 自定义函数3.2 SubSection函数-Oracle查询参数个数限制3.3 自定义函数生产UPC条形码3. 导出api注:另有报表调用的相关代码,如有需要可以另行下载。程序数据集简单程序数据集FineReport报表的数据来源可以是数据库数据或是文本数据,并且还可以是其它

3、任何类型的数据,因为FineReport是通过TableData接口来读取数据源的,而上述所有的数据来源都实现了该接口,因此用户只要实现了TableData接口,也就可以用自定义类型的数据源了(程序数据集),FineReport报表引擎就能够读取定义的数据源作为报表数据源使用。TableData接口主要有5个方法,如下:/获取TableData的总列数publicintgetColumnCount();/获取TableData中第columnIndex列的列名publicStringgetColumnName(intcolumnIndex); /判断是否存在第rowIndex行,这主要是用于处

4、理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取publicbooleanhasRow(introwIndex);/获取TableData的总行数publicintgetRowCount();/获取TableData中第columnIndex列,第rowIndex行的数据publicObjectgetValueAt(introwIndex,intcolumnIndex);使用程序数据集分为如下三个步骤: 在某些应用场景中,需要在程序中对数据进行处理后再作为报表的数据源使用,以下例子即为一个简单的不带参程序数据集ArrayTableDa

5、ta的使用过程,并以此简要说明程序数据集的使用方法。1. 1.定义程序数据源由之前的概述可知,程序数据集需要实现TableData接口,可以直接继承该接口,实现其5个方法,也可以从AbstractTableData扩展,因为AbstractTableData已经实现了默认的hasRow(int rowIndex)方法。 该例中的程序数据集ArrayTableData就是直接从AbstractTableData扩展的,完整代码如下:package com.fr.data;import com.fr.data.AbstractTableData;public class ArrayTableDat

6、aDemo extends AbstractTableData /定义程序数据集的列名与数据保存位置 private String columnNames; private Object rowData; /实现构建函数,在构建函数中准备数据 public ArrayTableDataDemo() String columnNames =Name,Score; Object datas = Alex,new Integer(15),Helly,new Integer(22),Bobby,new Integer(99); this.columnNames = columnNames; this.

7、rowData = datas; /实现TableData的其他四个方法,因为AbstractTableData已经实现了hasRow方法 public int getColumnCount() return columnNames.length; public String getColumnName(int columnIndex) return columnNamescolumnIndex; public int getRowCount() return rowData.length; public Object getValueAt(int rowIndex, int columnIn

8、dex) return rowDatarowIndexcolumnIndex; 1.1 把上面代码复制到txt文档重命名为ArrayTableDataDemo.java放到报表环境/WebReport/WEB-INF/classes/com/fr/data这个目录下1.2 编译ArrayTableData.java生成ArrayTableData.class类将生成的类文件拷贝到报表工程/WEB-INF/classes目录下。由于该类是在com. fr.data包中的,因此最终应该将该ArrayTableData.class放在/WEB-INF/classes/com/fr/data下面。此时

9、该程序数据源便定义好了。2. 配置程序数据源2.1 新建报表在报表数据集中新建程序数据源,选择我们定义好的程序数据集,如下图名字可以自定义,如student2. 3.使用程序数据集配置好程序数据源后便可以使用定义的student程序数据集了,与其他类型的数据集使用方法是相同的,可以通过拖拽方法实现单元格数据列绑定。如下图带参程序数据集 在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。因为FineReport是通过TableData接口来读取数据源的,而上述所有的数据来源都实现了该接口,因此用户只要实现了TableData接

10、口,也就可以用自定义类型的数据源了(程序数据集),FineReport报表引擎就能够读取定义的数据源作为报表数据源使用。以下就对这种情况举例说明。TableData接口主要有5个方法,如下:/获取TableData的总列数publicintgetColumnCount();/获取TableData中第columnIndex列的列名publicStringgetColumnName(intcolumnIndex); /判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取publicboolea

11、nhasRow(introwIndex);/获取TableData的总行数publicintgetRowCount();/获取TableData中第columnIndex列,第rowIndex行的数据publicObjectgetValueAt(introwIndex,intcolumnIndex);使用程序数据集分为如下三个步骤: 定义程序数据源 配置程序数据源 使用程序数据集3. 1. 定义程序数据源 首先在构建函数中定义好所用的程序数据集表结构,通过参数获得表名;其次在初始化函数中准备数据并放入定义的表中;完整代码如下:package com.fr.data;import java.sq

12、l.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.Statement;import java.util.ArrayList;import java.util.logging.Level;import com.fr.base.FRContext;import com.fr.data.AbstractTableData;import com.fr.report.parameter.Parameter;public

13、 class ParamTableDataDemo extends AbstractTableData / 列名数组,保存程序数据集所有列名 private String columnNames = null; / 定义程序数据集的列数量 private int columnNum = 10; / 保存查询表的实际列数量 private int colNum = 0; / 保存查询得到列值 private ArrayList valueList = null; / 构造函数,定义表结构,该表有10个数据列,列名为column#0,column#1,。column#9 public ParamT

14、ableDataDemo() / 定义tableName参数 this.parameters = new Parameter new Parameter(tableName) ; / 定义程序数据集列名 columnNames = new StringcolumnNum; for (int i = 0; i = colNum) return null; return (Object) valueList.get(rowIndex)columnIndex; / 准备数据 public void init() / 确保只被执行一次 if (valueList != null) return; /

15、保存得到的数据库表名 String tableName = parameters0.getValue().toString(); / 构造SQL语句,并打印出来 String sql = select * from + tableName + ; FRContext.getLogger().log(Level.INFO, Query SQL of ParamTableDataDemo: n + sql); / 保存得到的结果集 valueList = new ArrayList(); / 下面开始建立数据库连接,按照刚才的SQL语句进行查询 Connection conn = this.get

16、Connection(); 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 ObjectcolNum; for (int i = 0; i colNum; i

17、+) objArrayi = rs.getObject(i + 1); / 在valueList中加入这一行数据 valueList.add(objArray); / 释放数据库资源 rs.close(); stmt.close(); conn.close(); / 打印一共取到的数据行数量 FRContext.getLogger().log( Level.INFO, Query SQL of ParamTableDataDemo: n + valueList.size() + rows selected); catch (Exception e) e.printStackTrace(); /

18、 获取数据库连接 driverName 和 url 可以换成您需要的 public Connection getConnection() String driverName = sun.jdbc.odbc.JdbcOdbcDriver; String url = jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=C:FineReport6.5WebReportFRDemo.mdb; String username = ; String password = ; Connection con = null; try Class.forNam

19、e(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; 4. 1.1 把上面代码复制到txt文档重命名为ParamTabl

20、eDataDemo.java放到报表工程WebReportWEB-INFclassescomdemo这个目录下5. 1.2 编译ParamTableDataDemo.java 将生成的ParamTableDataDemo.class类文件拷贝到报表工程/WEB-INF/classes目录下。由于该类是在com.fr.data包中的,因此最终应该将该类放在/WEB-INF/classes/com/fr/data下面。此时该程序数据源便定义好了。6. 2. 配置程序数据源新建报表在报表数据集中新建程序数据源,选择我们定义好的程序数据集,如下图名字可以自定义,如divtable7. 3. 使用程序数

21、据集 配置好程序数据源后便可以使用定义的divtable程序数据集了,选中该数据集点击预览按钮,即可以输入表名动态地获取相应的数据表,并制作模板,如下图可以看到,我们已经将stscore表中的数据提取至程序数据集表中,像其他类型的数据集一样,可以通过拖拽方法实现单元格数据列绑定。自定义函数8. 函数定义规则 FineReport已经提供了大量的自带函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足FineReport函数定义规则。FineR

22、eport函数定义规则:Functionname(Para,Para,.),其中Functionname为函数名,Para为参数。9. 函数原理在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;iargs.length;i+) if(argsi = null) continue; result += parseObject(argsi); return FunctionHelper.parsePrimitiveDouble(result); private d

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2