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

合集下载

(完整版)报表软件FineReport各类函数大全

(完整版)报表软件FineReport各类函数大全

(完整版)报表软件FineReport各类函数大全常用函数 (2)报表函数 (4)数组函数 (6)数学和三角函数 (8)文本函数 (16)日期和时间函数 (22)逻辑函数 (28)简单的自定义函数 (29)常用函数1. SUMSUM(number1,number2,…):求一个指定单元格区域中所有数字之和。

Num ber1,number2,…:1到30个参数或指定单元格区域中所有数字。

备注:函数将直接键入参数中的数值、逻辑值及文本表达式计算在内。

若参数是数组或引用,则只对数组或单元格引用的数值进行计算。

示例:SUM(70,80)等于150。

SUM("70",80,TRUE)等于151,逻辑值"TRU E"作为1来计算;"FALSE"作为0计算;文本"70"作为70来计算。

2. COUNTCOUNT(value1,value2,…):计算数组或数据区域中所含数字项的个数。

Val ue1,value2,…:可包含任何类型数据的参数,但此函数只将数字类型的数据计算在内。

备注:数字、日期或以文字代表的数字参数将被计算在内;但无法转换成数字的错误值或文本值参数将忽略不计。

如果数组或引用参数中包含可解析文本值、逻辑值、零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。

3. AVERAGEAVERAGE(number1,number2,…):返回指定数据的平均值。

Number1,num ber2…:用于计算平均值的参数。

备注:参数必须是数字,或是含有数字的名称,数组或引用。

如果数组或引用参数中含有文字,逻辑值,或空白单元格,这些值将被忽略;但是,单元格中的零值则参与计算。

示例:如果A1:A6被命名为“ages”,分别等于10,23,14,24,33及25,则:AVERAGE(A1:A6)等于21.5,AVERAGE(ages)等于21.5。

finereport导出原理

finereport导出原理

finereport导出原理FineReport是一款功能强大的企业报表设计和数据分析工具,它提供了丰富的导出功能,允许用户将报表数据导出为多种格式。

使得用户可以方便地进行数据交互、共享和分析。

Finereport导出原理基本分为以下几个步骤:1. 数据查询和处理:FineReport首先根据用户设定的条件,通过连接数据库或其他数据源,进行数据查询和处理。

这一步骤包括对数据的提取、筛选、排序和聚合等操作。

2. 报表模板设计:用户可以使用FineReport提供的图形界面设计工具,创建自己的报表模板。

在设计报表模板时,用户可以选择需要导出的数据字段,并设置样式、布局和排版等属性。

3. 数据填充和格式化:一旦设计好报表模板,FineReport会将查询到的数据填充到相应的位置。

同时,FineReport还会根据用户设置的格式化规则,对数据进行格式化,如数值、日期格式、文字对齐等。

4. 导出文件生成:当数据填充和格式化完成后,FineReport会根据用户的要求,将报表导出为指定的格式。

常见的导出格式包括Excel、PDF、HTML、Word等。

用户可以选择导出的数据范围、文件名以及其他选项。

5. 导出文件下载:最后,FineReport会将生成的导出文件提供给用户进行下载。

用户可以通过浏览器或其他方式直接下载导出文件,以便进一步使用和分享。

总体而言,FineReport导出原理就是通过数据查询、报表模板设计、数据填充和格式化,最终生成指定格式的导出文件。

这个过程灵活可靠,满足了用户对数据导出的各种需求,同时也提高了数据的交互和分析效率。

finereport 数据集函数

finereport 数据集函数

finereport 数据集函数摘要:一、FineReport 简介二、数据集函数的作用三、常用数据集函数介绍1.数据库查询函数2.聚合函数3.日期和时间函数4.数学和三角函数5.文本处理函数6.逻辑函数四、数据集函数在FineReport 中的应用实例五、总结正文:FineReport 是一款非常强大的企业级报表工具,广泛应用于各种业务场景。

数据集函数是FineReport 的重要组成部分,用于处理和分析报表数据,帮助用户更好地理解和呈现业务数据。

数据集函数的作用主要体现在以下几个方面:1.对数据进行筛选、排序、分组等操作,满足不同报表需求。

2.对数据进行统计、计算,生成新的字段或数据。

3.对数据进行格式化,如转换日期格式、货币格式等。

4.对数据进行条件判断,实现复杂的业务逻辑处理。

下面我们来详细了解一下FineReport 中的常用数据集函数:1.数据库查询函数:主要包括SELECT、COUNT、SUM、MAX、MIN 等,用于从数据库中查询和统计数据。

2.聚合函数:如AVG、STDEV、VAR 等,用于计算数据的平均值、标准偏差等统计量。

3.日期和时间函数:如DATE、DATETIME、TIMESTAMP、YEAR、MONTH 等,用于处理日期和时间类型的数据。

4.数学和三角函数:如SIN、COS、TAN、PI 等,用于处理数学和三角相关的计算。

5.文本处理函数:如LEN、LEFT、RIGHT、SUBSTR 等,用于处理字符串类型的数据。

6.逻辑函数:如IF、IIF、CASE 等,用于实现复杂的条件判断。

在FineReport 中,数据集函数可以广泛应用于各种报表模板,如表格报表、图表报表、交叉表等。

通过灵活使用数据集函数,用户可以轻松地实现对报表数据的处理和分析,从而更好地呈现业务数据。

总之,FineReport 的数据集函数为用户提供了丰富的数据处理能力,使得报表制作变得更加简单、高效。

finereport调用mysql函数 (2)

finereport调用mysql函数 (2)

finereport调用mysql函数引言概述:Finereport是一款强大的报表设计与生成工具,可以帮助用户快速生成各种数据报表。

在使用Finereport的过程中,我们常常需要调用数据库函数来处理数据,其中MySQL是一种常用的关系型数据库管理系统。

本文将详细阐述如何在Finereport中调用MySQL函数,以实现更加灵活和高效的报表设计。

正文内容:一、连接MySQL数据库1.1 配置数据库连接信息:在Finereport中,首先需要配置数据库连接信息。

点击“数据源”菜单,选择“新建数据源”,填写数据库连接的相关信息,包括数据库类型、主机名、端口号、数据库名、用户名和密码等。

1.2 测试数据库连接:配置完成后,可以点击“测试连接”按钮,测试数据库连接是否成功。

如果连接成功,将弹出提示框显示连接成功的信息。

二、调用MySQL函数2.1 创建数据集:在Finereport中,可以通过创建数据集来调用MySQL函数。

点击“数据集”菜单,选择“新建数据集”,填写数据集的名称和SQL语句。

2.2 使用MySQL函数:在SQL语句中,可以使用MySQL提供的各种函数来处理数据。

例如,可以使用DATE_FORMAT函数来格式化日期,使用CONCAT 函数来拼接字符串,使用SUM函数来计算总和等。

2.3 参数化查询:在SQL语句中,还可以使用参数化查询的方式来调用MySQL函数。

通过在SQL语句中使用占位符,然后在报表设计中设置参数的值,可以实现更加灵活和动态的报表设计。

三、数据处理与展示3.1 数据处理:在Finereport中,可以使用数据集中的数据进行各种数据处理操作,例如排序、筛选、分组等。

可以通过设置报表的数据处理属性,实现对数据的灵活处理。

3.2 报表设计:在Finereport中,可以使用各种报表控件来展示数据。

可以通过设置报表控件的属性,实现对数据的定制化展示,例如设置表格的列宽、设置图表的样式等。

finereport操作手册

finereport操作手册

FineReport是一款功能强大的报表工具,广泛应用于企业级报表的制作和展示。

以下是FineReport的基本操作手册:
1.启动软件:打开FineReport Designer,你将看到一个直观的用户界面,包
括菜单栏、工具栏、画布区和属性面板。

2.新建报表:在菜单栏上,选择“文件”->“新建”,然后选择报表类型。

有多种类型的报表供你选择,包括表格、图表、交叉表等。

3.数据源配置:为你的报表配置数据源。

选择“数据”->“数据源”,然后
选择适合你数据源的类型,如数据库、Excel、API等。

4.报表设计:在画布区,你可以开始设计你的报表。

使用工具栏上的工具添
加控件、调整布局和格式化数据。

5.数据绑定:将数据源中的数据绑定到报表控件上。

在属性面板中,选择数
据集和相应的字段来绑定数据。

6.报表预览:完成设计后,你可以预览报表的效果。

点击工具栏上的“预
览”按钮或从菜单栏选择“预览”->“实时预览”。

7.导出和发布:当你满意报表的设计和效果时,可以选择导出为PDF、Excel
或其他格式,或发布到FineReport Server上进行共享和查看。

8.关闭软件:完成所有操作后,选择“文件”->“关闭”来关闭当前报表。

如果你想退出软件,选择“文件”->“退出”。

帆软FineReport如何使用程序数据集

帆软FineReport如何使用程序数据集

帆软FineReport如何使⽤程序数据集⼤多数情况下,FineReport直接在设计器⾥使⽤“数据集查询”,直接写SQL就能满⾜报表要求,但对于⼀些复杂的报表,有时候SQL处理并不⽅便,这时可以把查询结果在应⽤层做⼀些预处理后,再传递给报表,即所谓的“程序数据集”,FineReport的帮助⽂档上给了⼀个⽰例:1package com.fr.data;23import java.sql.Connection;4import java.sql.DriverManager;5import java.sql.ResultSet;6import java.sql.ResultSetMetaData;7import java.sql.Statement;8import java.util.ArrayList;9import com.fr.base.FRContext;10import com.fr.data.AbstractTableData;11import com.fr.base.Parameter;1213public class ParamTableDataDemo extends AbstractTableData {14// 列名数组,保存程序数据集所有列名15private String[] columnNames = null;16// 定义程序数据集的列数量17private int columnNum = 10;18// 保存查询表的实际列数量19private int colNum = 0;20// 保存查询得到列值21private ArrayList valueList = null;2223// 构造函数,定义表结构,该表有10个数据列,列名为column#0,column#1,。

column#924public ParamTableDataDemo() {25// 定义tableName参数26this.parameters = new Parameter[] { new Parameter("tableName") };27// 定义程序数据集列名28 columnNames = new String[columnNum];29for (int i = 0; i < columnNum; i++) {30 columnNames[i] = "column#" + String.valueOf(i);31 }32 }3334// 实现其他四个⽅法35public int getColumnCount() {36return columnNum;37 }3839public String getColumnName(int columnIndex) {40return columnNames[columnIndex];41 }4243public int getRowCount() {44 init();45return valueList.size();46 }4748public Object getValueAt(int rowIndex, int columnIndex) {49 init();50if (columnIndex >= colNum) {51return null;52 }53return ((Object[]) valueList.get(rowIndex))[columnIndex];54 }5556// 准备数据57public void init() {58// 确保只被执⾏⼀次59if (valueList != null) {60return;61 }62// 保存得到的数据库表名63 String tableName = parameters[0].getValue().toString();64// 构造SQL语句,并打印出来65 String sql = "select * from " + tableName + ";";66 FRContext.getLogger().info("Query SQL of ParamTableDataDemo: \n" + sql);67// 保存得到的结果集68 valueList = new ArrayList();69// 下⾯开始建⽴数据库连接,按照刚才的SQL语句进⾏查询70 Connection conn = this.getConnection();71try {72 Statement stmt = conn.createStatement();73 ResultSet rs = stmt.executeQuery(sql);74// 获得记录的详细信息,然后获得总列数75 ResultSetMetaData rsmd = rs.getMetaData();76 colNum = rsmd.getColumnCount();77// ⽤对象保存数据78 Object[] objArray = null;79while (rs.next()) {80 objArray = new Object[colNum];81for (int i = 0; i < colNum; i++) {82 objArray[i] = rs.getObject(i + 1);83 }84// 在valueList中加⼊这⼀⾏数据85 valueList.add(objArray);86 }87// 释放数据库资源88 rs.close();89 stmt.close();90 conn.close();91// 打印⼀共取到的数据⾏数量92 FRContext.getLogger().info(93 "Query SQL of ParamTableDataDemo: \n" + valueList.size()94 + " rows selected");95 } catch (Exception e) {96 e.printStackTrace();97 }98 }99100// 获取数据库连接 driverName和 url 可以换成您需要的101public Connection getConnection() {102 String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";103 String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\FineReport_7.0\\WebReport\\FRDemo.mdb";104 String username = "";105 String password = "";106 Connection con = null;107try {108 Class.forName(driverName);109 con = DriverManager.getConnection(url, username, password);110 } catch (Exception e) {111 e.printStackTrace();112return null;113 }114return con;115 }116117// 释放⼀些资源,因为可能会有重复调⽤,所以需释放valueList,将上次查询的结果释放掉118public void release() throws Exception {119super.release();120this.valueList = null;121 }122 }View Code这个⽰例我个⼈觉得有⼆个地⽅不太⽅便:1、db连接串硬编码写死在代码⾥,维护起来不太⽅便,⽬前⼤多数b/s应⽤,对于数据库连接,通常是利⽤spring在xml⾥配置datasource bean,运⾏时动态注⼊2、将查询出的结果,填充到数据集时,采⽤的是数字索引(见82⾏),代码虽然简洁,但是可读性⽐较差折腾⼀番后,于是便有了下⾯的改进版本:1package infosky.ckg.fr.data;23import infosky.ckg.utils.AppContext;4import java.sql.Connection;5import java.sql.ResultSet;6import java.sql.Statement;7import java.util.LinkedHashMap;8import java.util.LinkedHashSet;9import javax.sql.DataSource;10import com.fr.base.Parameter;11import com.fr.data.AbstractTableData;12import com.fr.general.data.TableDataException;1314public class ParameterLinkedHashSetDataDemo extends AbstractTableData {1516private static final long serialVersionUID = 8818000311745955539L;1718// 字段名枚举19enum FIELD_NAME {20 EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY21 }2223private String[] columNames;2425private LinkedHashSet<LinkedHashMap<String, Object>> rowData;2627public ParameterLinkedHashSetDataDemo() {28this.parameters = new Parameter[] { new Parameter("jobId"),29new Parameter("minSalary"), new Parameter("maxSalary") };3031// 填充字段名32 columNames = new String[FIELD_NAME.values().length];33int i = 0;34for (FIELD_NAME fieldName : FIELD_NAME.values()) {35 columNames[i] = fieldName.toString();36 i++;37 }3839 }4041 @Override42public int getColumnCount() throws TableDataException {43return columNames.length;44 }4546 @Override47public String getColumnName(int columnIndex) throws TableDataException {48return columNames[columnIndex];49 }5051 @Override52public int getRowCount() throws TableDataException {53 queryData();54return rowData.size();55 }5657 @Override58public Object getValueAt(int rowIndex, int columnIndex) {59 queryData();60int tempRowIndex = 0;61for (LinkedHashMap<String, Object> row : rowData) {62if (tempRowIndex == rowIndex) {63return row.get(columNames[columnIndex]);64 }65 tempRowIndex += 1;66 }67return null;68 }6970// 查询数据71private void queryData() {72// 确保只被执⾏⼀次73if (rowData != null) {74return;75 }7677// 传⼊的参数78 String jobId = parameters[0].getValue().toString();79float minSalary = Float.parseFloat(parameters[1].getValue().toString());80float maxSalary = Float.parseFloat(parameters[2].getValue().toString());8182// 拼装SQL83 String sql = "select * from EMPLOYEES where JOB_ID='" + jobId84 + "' and SALARY between " + minSalary + " and " + maxSalary;8586 rowData = new LinkedHashSet<LinkedHashMap<String, Object>>();8788 Connection conn = this.getConnection();89try {90 Statement stmt = conn.createStatement();91// 执⾏查询92 ResultSet rs = stmt.executeQuery(sql);93while (rs.next()) {94// 填充⾏数据95// 注:字段赋值的顺序,要跟枚举⾥的顺序⼀样96 LinkedHashMap<String, Object> row = new LinkedHashMap<String, Object>();97 row.put(FIELD_NAME.EMPLOYEE_ID.toString(),98 rs.getInt(FIELD_NAME.EMPLOYEE_ID.toString()));99 row.put(FIELD_NAME.FIRST_NAME.toString(),100 rs.getString(FIELD_NAME.FIRST_NAME.toString()));101 row.put(FIELD_ST_NAME.toString(),102 rs.getString(FIELD_ST_NAME.toString()));103 row.put(FIELD_NAME.EMAIL.toString(),104 rs.getString(FIELD_NAME.EMAIL.toString()));105 row.put(FIELD_NAME.PHONE_NUMBER.toString(),106 rs.getString("PHONE_NUMBER"));107 row.put(FIELD_NAME.HIRE_DATE.toString(),108 rs.getDate(FIELD_NAME.HIRE_DATE.toString()));109 row.put(FIELD_NAME.JOB_ID.toString(),110 rs.getString(FIELD_NAME.JOB_ID.toString()));111 row.put(FIELD_NAME.SALARY.toString(),112 rs.getFloat(FIELD_NAME.SALARY.toString()));113 rowData.add(row);114 }115 rs.close();116 stmt.close();117 conn.close();118 } catch (Exception e) {119 e.printStackTrace();120 }121122 }123124// 获取数据库连接125private Connection getConnection() {126 Connection con = null;127try {128 DataSource dataSource = AppContext.getInstance().getAppContext()129 .getBean("dataSource", DataSource.class);130 con = dataSource.getConnection();131 } catch (Exception e) {132 e.printStackTrace();133return null;134 }135return con;136 }137138// 释放资源139public void release() throws Exception {140super.release();141this.rowData = null;142 }143144 }View Code改进的地⽅:1、getConnection⽅法,利⽤Spring注⼊datasource,当然为了注⼊⽅便,还需要⼀个辅助类AppContext1package infosky.ckg.utils;23import org.springframework.context.support.AbstractApplicationContext;4import org.springframework.context.support.ClassPathXmlApplicationContext;56public class AppContext {7private static AppContext instance;89private AbstractApplicationContext appContext;1011public synchronized static AppContext getInstance() {12if (instance == null) {13 instance = new AppContext();14 }15return instance;16 }1718private AppContext() {19this.appContext = new ClassPathXmlApplicationContext(20 "spring/root-context.xml");21 }2223public AbstractApplicationContext getAppContext() {24return appContext;25 }2627 }View Codeclasses/spring/root-context.xml ⾥配置db连接1<?xml version="1.0" encoding="UTF-8"?>2<beans xmlns="/schema/beans"3 xmlns:xsi="/2001/XMLSchema-instance"4 xsi:schemaLocation="/schema/beans5 /schema/beans/spring-beans.xsd">67<bean id="dataSource"8 class="org.springframework.jdbc.datasource.DriverManagerDataSource">9<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>1011<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>12<property name="username" value="hr"/>13<property name="password" value="hr"/>14</bean>15</beans>View Code2、将原来的数组,换成了LinkedHashSet<LinkedHashMap<String, Object>>,这样db查询结果填充到"数据集"时,处理代码的可读性就多好了(见queryData⽅法),但也要注意到LinkedHashSet/LinkedHashMap的性能较Array⽽⾔,有所下降,正所谓:有所得必有得失。

finereport自定义函数

finereport自定义函数

finereport自定义函数FineReport是一款功能强大的报表工具,可以满足用户各种复杂的数据统计和展示需求。

使用FineReport,用户可以快速生成各种格式的报表,包括表格、图表、交叉报表等,让数据更加直观清晰地展现出来。

为了满足不同用户的需求,FineReport还提供了自定义函数的功能,用户可以根据自己的需求编写自定义函数,实现更加个性化的数据处理和展示。

自定义函数是FineReport的一个重要功能,它可以帮助用户更好地处理和分析数据。

通过自定义函数,用户可以根据自己的需求编写特定的数据处理逻辑,实现更加灵活和个性化的数据处理。

比如,用户可以通过自定义函数实现数据的加密解密、特定条件下的数据过滤查询、数据的格式转换等功能。

自定义函数的存在,为用户提供了更多的操作空间,让用户可以更加自由地对数据进行处理和展示。

在使用自定义函数的过程中,用户需要注意一些问题。

首先,编写自定义函数需要一定的编程能力,用户需要了解一定的编程语言知识才能编写出符合自己需求的函数。

其次,自定义函数的逻辑需要尽量简单明了,避免逻辑过于复杂导致代码难以维护和理解。

同时,需要注意函数的性能和效率,确保函数可以在较短的时间内完成数据处理,提高用户的使用体验。

除此之外,用户还可以通过FineReport提供的函数库来实现常见的数据处理逻辑,避免重复造轮子。

FineReport的函数库包含了大量常用的数据处理函数,用户可以直接调用这些函数来实现数据的处理和展示。

比如,用户可以通过函数库实现数据的加减乘除、取最大最小值、求平均数等常见的数据统计操作,节省用户编写代码的时间和精力。

梳理一下本文的重点,我们可以发现,FineReport的自定义函数功能为用户提供了更加灵活和个性化的数据处理和展示方式。

通过自定义函数,用户可以实现更加复杂和特定的数据处理逻辑,满足不同用户的需求。

同时,用户在编写自定义函数的过程中需要注意函数的简洁性、性能和可维护性,确保函数能够正常运行并满足用户的需求。

idea finereport 报表中程序数据集

idea finereport 报表中程序数据集

idea finereport 报表中程序数据集
在FineReport报表中,可以使用程序数据集来定义自己的数据集,通过程序数据集,你可以编写自定义的SQL、存储过程等来获取数据,并将其显示在报表中。

以下是创建程序数据集的一般步骤:
1. 打开FineReport Designer,并打开你要添加程序数据集的报表。

2. 在报表设计界面中,选择“数据集”选项卡。

3. 在数据集列表中,选择“程序数据集”选项。

4. 点击“添加”按钮,创建一个新的程序数据集。

5. 在程序数据集编辑器中,编写SQL语句、存储过程等来获取数据。

你可以使用Java 代码或自定义脚本语言来编写程序数据集的逻辑。

6. 配置程序数据集的其他选项,如参数、返回值等。

7. 保存并预览报表,查看程序数据集是否正确显示数据。

需要注意的是,程序数据集的编写需要一定的编程基础和数据库知识,如果你不熟悉这些技术,可能需要寻求专业人士的帮助。

finereport 自定义函数

finereport 自定义函数

finereport 自定义函数Finereport是一款著名的企业级报表工具,它具有强大的数据处理和展示能力,可以快速实现各种复杂的统计分析任务。

在finereport中,我们可以通过自定义函数的方式,扩展其功能,实现更加灵活的数据处理和报表展示操作。

本文将围绕“finereport自定义函数”的主题,为大家介绍具体实现步骤。

步骤1:新建自定义函数打开Finereport Designer,在函数窗口中找到“自定义函数处理器”,右键菜单中选择“新建”,填写自定义函数的名称以及描述信息。

注意,自定义函数名称必须唯一,而且必须以“userFunction”作为前缀。

步骤2:实现自定义函数代码在新建的自定义函数处理器中,选择“编辑”选项卡,在代码编辑器中编写自定义函数的代码。

一般而言,自定义函数的代码由Java语言编写,你需要实现自定义函数的入口方法,并且根据具体的需求编写代码段。

在编写自定义函数代码时,需要注意代码的可靠性和安全性。

为了保证函数的正确执行,你需要遵循编码规范,并在代码中加入必要的异常处理以及防御性编程措施。

步骤3:设置自定义函数参数在自定义函数处理器中,选择“参数”选项卡,填写自定义函数的参数信息。

对于每个自定义函数,都需要定义对应的输入参数和输出参数。

在输入参数中,你需要指定参数名称、参数类型、参数描述等信息。

而在输出参数中,你则需要指定函数返回值的类型。

步骤4:使用自定义函数完成自定义函数的设置之后,你可以在Finereport Designer中的任意报表中使用它。

在报表中建立公式,调用自定义函数,即可在报表展示结果中看到自定义函数的结果。

在调用自定义函数时,你需要按照自定义函数定义的方式来指定函数参数,从而确保函数的正常执行。

总结:通过上述步骤,我们可以轻松地在Finereport中实现自定义函数的功能。

自定义函数为我们提供了一种扩展Finereport功能的方式,可以满足各种复杂的数据处理和展示的需求,从而让我们更加便捷地完成各种报表工作。

finereport 公式调用数据集

finereport 公式调用数据集

finereport 公式调用数据集finereport是一款强大的报表工具,它支持使用公式来完成各种计算和数据处理操作。

在使用公式时,我们有时需要调用已经定义好的数据集(dataset)中的数据。

本文将介绍如何在finereport中使用公式调用数据集。

1. 定义数据集首先,我们需要在finereport中定义一个数据集。

具体操作为:在数据源管理器中选择相应的数据源,右键点击“数据集”节点,选择“新建数据集”,并按照提示设置数据集的相关属性。

在数据集中,我们可以通过SQL语句或存储过程来获取数据。

2. 使用公式调用数据集在finereport中,通过公式控件可以调用数据集中的数据。

在报表设计器中,将公式控件拖放到需要使用的位置,并在公式控件中输入相应的公式。

以下是一些常用的公式示例:- $F{数据集字段名}:获取数据集中指定字段的值;- $P{参数名}:获取报表参数的值;- $V{变量名}:获取报表变量的值;- $F{数据集字段名}.length():获取数据集中指定字段的长度; - $F{数据集字段名}.substring(startIndex,endIndex):获取数据集中指定字段的子字符串。

在公式中使用数据集字段名时,需要注意以下几点:- 数据集字段名需要使用大括号括起来;- 如果数据集中有多个同名的字段,需要在大括号中使用“数据集名.字段名”的方式来指定字段;- 如果数据集中有日期类型的字段,需要在公式中使用to_date 函数将其转换为日期类型。

3. 示例以下是一个简单的示例,展示如何在finereport中使用公式调用数据集:假设我们已经定义好了一个数据集,其中包含两个字段:姓名和年龄。

我们需要在报表中显示该数据集中所有人的平均年龄。

具体操作如下:- 在报表设计器中,拖放一个文本框和一个公式控件;- 在文本框中输入“平均年龄:”,并将其右侧的对齐方式设置为右对齐;- 在公式控件中输入以下公式:$F{年龄}.avg();- 在公式控件的右侧,将其数据类型设置为“数字”;- 将公式控件拖放到文本框的左侧;- 运行报表,即可看到平均年龄的数值。

finereport 数据集函数

finereport 数据集函数

finereport 数据集函数Finereport 数据集函数在Finereport中,数据集函数是一种非常强大和常用的函数工具,用于对数据集进行处理和操作。

通过使用数据集函数,用户可以轻松地实现数据的查询、过滤、排序、汇总等操作,使得数据的分析和报表生成更加方便和高效。

本文将详细介绍Finereport中的数据集函数,并逐步回答相关问题。

一、数据集函数的概述1.1 数据集在Finereport中,数据集是指从数据库或其他数据源中获取到的数据集合。

数据集可以包含多个字段,每个字段代表一项数据。

例如,在一个销售数据集中,字段可以包括产品名称、销售额、销售日期等内容。

1.2 数据集函数数据集函数是一系列特殊的函数,在Finereport中用于对数据集进行处理和操作。

数据集函数可以用于实现对数据的过滤、排序、汇总、计算等功能。

二、使用数据集函数进行数据过滤数据过滤是指根据某个条件筛选出符合条件的数据。

Finereport提供了多种数据集函数,可以方便地实现数据的过滤。

2.1 IF函数IF函数是一种常用的数据集函数,用于根据某个条件对数据集中的数据进行过滤。

IF函数的语法为IF(condition, value1, value2),其中condition 为判断条件,value1为满足条件时的值,value2为不满足条件时的值。

例如,假设要筛选出销售额大于10000的数据,可以使用IF函数完成:IF(销售额>10000, 销售额, null)。

这样可以得到满足条件的销售额,不满足条件的数据则返回null。

2.2 WHERE函数WHERE函数是另一种常用的数据集函数,用于根据多个条件对数据集进行过滤。

WHERE函数的语法为WHERE(condition1, condition2, ...),其中condition1、condition2为多个判断条件。

例如,假设要筛选出销售额大于10000且销售日期为2022年的数据,可以使用WHERE函数完成:WHERE(销售额>10000, 销售日期=2022)。

报表制作软件FineReport导出EXCEL的四种方式

报表制作软件FineReport导出EXCEL的四种方式

报表制作软件FineReport导出EXCEL的四种方式在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。

对于excel 2003版,由于限制了每个sheet的最大行数和列数,大数据量导出时会默认时分多个sheet,而excel2007不会出现这样的问题。

这些导出方式在JAVA程序中分别有不同的接口来实现:1、原样导出原样导出就是不预览直接导出excel其程序接口代码如下:outputStream = new FileOutputStream(new File("E:\\ExcelExport.xls"));ExcelExporter excel = new ExcelExporter();//导出2007版outputStream = new FileOutputStream(new File("E:\\ExcelExport.xlsx")); excel Excel2007Exporter excel = new Excel2007Exporter();excel.export(outputStream, rworkbook);效果图:2、分页导出分页导出,如果报表模版是分页的,会按照分页的结果形式导出,重复的标题等也会重复。

其程序接口代码如下:outputStream = new FileOutputStream(new File("E:\\PageExcelExport.xls")); PageExcelExporter page = new PageExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));//导出2007版outputStream = new FileOutputStream(new File("E:\\PageExcelExport.xlsx")); excel PageExcel2007Exporter page = new PageExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));page.export(outputStream, rworkbook);效果图:3、分页分sheet导出分页分Sheet导出时报表结果的每一页为一个Sheet保存在Excel文件中其代码如下:outputStream = new FileOutputStream(new File("E:\\PageSheetExcelExport.xls")); PageToSheetExcelExporter sheet = newPageToSheetExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook));//导出2007版outputStream = new FileOutputStream(new File("E:\\PageSheetExcelExport.xlsx")); excel PageToSheetExcel2007Exporter sheet = new PageToSheetExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook)); sheet.export(outputStream, rworkbook);效果图:4、大数据量导出这是比较常见的,例如以50000行为一个excel文件其代码如下:outputStream = new FileOutputStream(new File("E:\\LargeExcelExport.zip")); LargeDataPageExcelExporter large = new LargeDataPageExcelExporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook), true); //导出2007版outputStream = new FileOutputStream(new File("E:\\LargeExcelExport.xlsx")); excel LargeDataPageExcel2007Exporter large = new LargeDataPageExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook(rworkbook), true);large.export(outputStream, rworkbook);对于大数据量导出报表时,可能会出现如下两种情况:一,导出成功,数据会显示在多个Sheet中;二,二,导出失败,导出的Excel内容无效。

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

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

FineReport报表软件API源代码之程序数据集、自定义函数和导出APIFineReport报表软件API源代码之程序数据集、自定义函数和导出API概述随着FineReport的发展,它所提供的设计者和服务器应该能够满足您的大部分需求,完全实现零编码软件开发,革命性地加快软件开发并提高软件稳定性然而,需求是不断变化的,而FineReport中包含的功能在报告行业中是常见和典型的。

也许有些个性化功能无法通过FineReport软件实现因此,FineReport打开了一个界面,可用于二次开发,以更好地满足您的软件产品或项目的个性化需求。

您可以学习如何根据引擎的API文档使用各种接口。

此外,如果你是一名程序员,并且对FineReport报表非常感兴趣,如果你想更深入地了解FineReport软件的内部原理,你也可以阅读本章。

接口报告引擎API文档没有引入JA V A基础知识,如如何定义类、编译类文件和使用JA V A开发平台。

因此,在查看引擎应用编程接口文档之前,请确保您有一定的JA V A基础目录1。

程序数据源2.1简单程序数据集2.2带参数的程序数据集2。

自定义函数3.1自定义函数3.2子节函数-甲骨文查询参数限制3.3自定义函数生成UPC条形码3。

导出api注意:报表调用还有其他相关代码,如有必要可以单独下载程序数据集简单程序数据集报表数据源可以是数据库数据或文本数据,也可以是任何其他类型的数据,因为FineReport通过TableData接口读取数据源,并且所有上述数据源都实现了该接口。

因此,只要用户实现了TableData接口,他们还可以使用自定义数据源(程序数据集)。

FineReport报表引擎可以读取已定义的数据源,并将其用作报表数据源对于TableData接口,主要有五种方法,如下://获取TableData公共int中的列总数GetColumnCount();//获取表数据中列索引列的列名,公共字符串列名(IntColumnDex);//判断行索引行是否存在。

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

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

FineReport报表软件API源代码之程序数据集、⾃定义函数和导出API概述随着FineReport的发展,它提供的设计器和服务器应该能够满⾜您绝⼤部分的需求,完全实现零编码的软件开发,⾰命性地加快软件开发速度,提⾼软件稳定性。

但是需求是千变万化的,⽽FineReport所包含的功能是报表⾏业中⽐较普遍的、典型的,也许某些个性化的功能通过FineReport软件⽆法实现。

因此FineReport开放了能够进⾏⼆次开发的接⼝,来更好的满⾜您软件产品或项⽬中的个性化的需求。

您可以根据该引擎API⽂档学习各类接⼝的使⽤⽅法,另外若您是⼀名程序员,且对FineReport报表深感兴趣,希望更深⼊地了解FineReport软件的内部原理,您也可以阅读该章节。

FineReport引擎API⽂档对如何定义类、编译类⽂件及JAVA开发平台使⽤等JAVA基础知识未作介绍,因此在您查看引擎API ⽂档前请确保您有⼀定的JAVA基础。

⽬录1.程序数据源2.1简单程序数据集2.2带参程序数据集2.⾃定义函数3.1⾃定义函数3.2SubSection函数-Oracle查询参数个数限制3.3⾃定义函数⽣产UPC条形码3.导出api注:另有报表调⽤的相关代码,如有需要可以另⾏下载。

程序数据集简单程序数据集FineReport报表的数据来源可以是数据库数据或是⽂本数据,并且还可以是其它任何类型的数据,因为FineReport是通过TableData接⼝来读取数据源的,⽽上述所有的数据来源都实现了该接⼝,因此⽤户只要实现了TableData接⼝,也就可以⽤⾃定义类型的数据源了(程序数据集),FineReport报表引擎就能够读取定义的数据源作为报表数据源使⽤。

TableData接⼝主要有5个⽅法,如下://获取TableData的总列数public int getColumnCount();//获取TableData中第columnIndex列的列名public String getColumnName(int columnIndex);//判断是否存在第rowIndex⾏,这主要是⽤于处理超⼤数据时,完全遍历所有数据获取总⾏数相当困难,⽤这个⽅法来判断第rowIndex⾏是否存在,存在则可读取public boolean hasRow(int rowIndex);//获取TableData的总⾏数public int getRowCount();//获取TableData中第columnIndex列,第rowIndex⾏的数据public Object getValueAt(int rowIndex, int columnIndex);使⽤程序数据集分为如下三个步骤:在某些应⽤场景中,需要在程序中对数据进⾏处理后再作为报表的数据源使⽤,以下例⼦即为⼀个简单的不带参程序数据集ArrayTableData的使⽤过程,并以此简要说明程序数据集的使⽤⽅法。

关于报表工具FineReport的自定义函数的应用

关于报表工具FineReport的自定义函数的应用

关于报表工具FineReport的自定义函数的应用很多报表工具都自带大量的函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,报表工具FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,满足用户的自定义需求。

但这些函数必须FineReport函数定义规则。

以下以两个实际案例来仔细详解。

应用一:生成cpu条形码FineReport中自带有EAN型编码,但却没有cpu条形码,但是可以通过自定义函数引用第三方包来生成cpu编码的条形码并显示出来。

如输入数值12345678912,将会得到以下UPC条形码:具体步骤怎么实现?1、编写自定义函数●导入第三方包在eclipse中导入第三方包(barcode4j-light.jar,可在帆软论坛上下载),barcode4j是一款开源的条形码生成库,能够生成很多种编码的条形码,包括UPC码。

自定义函数中可以直接调用该包中现成的方法来生成UPC条形码。

●自定义函数类新建一个类Upc,完整代码如下:// 自定义函数生成UPC条形码package com.fr.function;import java.awt.image.BufferedImage;import org.krysalis.barcode4j.impl.upcean.UPCABean;import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;import org.krysalis.barcode4j.tools.UnitConv;import com.fr.script.AbstractFunction;public class Upc extends AbstractFunction {public Object run(Object[] args) {if (args == null || args.length < 1) {return "参数不对,必须有一个参数";}try {// 创建一个UPC编码生成器UPCABean bean = new UPCABean();// 设置条形码高度,BufferedImage.TYPE_BYTE_BINARY代表常量值12,可直接使用常量值final int dpi = Integer.parseInt(args[1].toString());bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi));bean.doQuietZone(false);BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi,BufferedImage.TYPE_BYTE_BINARY, false, 0);// 创建条形码bean.generateBarcode(canvas,args[0].toString());canvas.finish();// 返回图片显示return canvas.getBufferedImage();} catch (Exception e) {e.printStackTrace();}return args[0];}}2、编译自定义函数编译Upc.java生成Upc.class文件,拷贝至报表环境目/WebReport/WEB-INF/classes/com/fr/function下;将第三方包barcode4j-light.jar放在报表环境目录/WebReport/WEB-INF/lib文件夹下。

图表制作软件FineReport中程序数据集传参使用解决方案

图表制作软件FineReport中程序数据集传参使用解决方案

通过TableData接口可以读取任何形式的数据源,FineReport图表制作软件的数据来源可以是数据库数据或是文本数据,并且还可以是其它任何类型的数据,因为这些所有的数据来源都实现了TableData接口,所以用户只要实现了TableData接口,也就可以用自定义类型的数据源了。

对于传参,我们可以在程序数据集中写入传入的参数,此方案传入的参数为tableName和columnNames两项;即传入数据库表名以及所需要的列名取出所需要的值;这里连的数据库为FineReport报表的内置数据库,适用时可输入表名:stscore列名name;sex。

具体步骤如下:1.定义程序数据源1.1TableData接口简介TableData接口所需实现的方法只要实现了TableData接口,FineReport报表引擎就能够读取数据源作为报表数据源使用。

TableData接口主要有5个方法,如下:1).public int getColumnCount();//获取TableData的总列数2).public String getColumnName(int columnIndex);//获取TableData中第columnIndex列的列名。

3).public boolean hasRow(int rowIndex);//判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取。

4).public int getRowCount();//获取TableData的总行数。

5).public Object getValueAt(int rowIndex,int columnIndex);//获取TableData 中第columnIndex列,第rowIndex行的数据。

1.2以PramTableDataDemo为例描述如何实现TableData接口因为AbstractTableData已经实现了默认的hasRow(int rowIndex)方法,所以可以从AbstractTableData扩展,定义ParamTableDataDemo,代码如下:private String splitMark=“;”;//自定义间隔符暂定为‘;’即输入列名参数时需像如此name;sex;age;private String[]columnNames=null;//列字段名数组保存在数据集窗口下一开始显示的数据列名称private int columnNum=10;//自定义需要列出的列数量即在数据集窗口列出的数据集下的字段数量String[]colNames=null;//保存取到的字段即输入的参数字段,假如是name;sex参数字段即为name 和sex两项private ArrayList valueList=null;//保存查询得到的值列1.3构造函数public ParamTableDataDemo(){//定义需要的参数tablename columnNamesthis.parameters=new Parameter[]{new Parameter(“tableName”),new Parameter(“columnNames”)};//初始化下列名,暂定为columnName#0,columnName#1……显示在数据集窗体中的columnNames=new String[columnNum];for(int i=0;i<columnNum;i++){columnNames[i]=“columnNames#”+String.valueOf(i);}}1.4匹配取值for(int i=0;i<parameters.length;i++){if(parameters[i].getName().equals(“tableName”))//做匹配tableName=parameters[i].getValue().toString();else colNames=this.getParameters()[i].getValue().toString().split( splitMark);}1.5构造SQL语句String sql=“select“;//传入参数中输入的字段for(int i=0;i<colNames.length;i++){colNames[i].trim();if(i==colNames.length–1)sql+=colNames[i];else{sql+=colNames[i]+“,”;}}sql+=”from”+tableName+“;”;1.6获得数据库连接public Connection getConnection(){String driverName=“sun.jdbc.odbc.JdbcOdbcDriver”;//加载驱动String url=“jdbc:odbc:Driver={Microsoft Access Driver(*.mdb)};DBQ=D:\ProgramFiles\finereport\FineReport6.5\WebReport\WEB-IN F\resources\data\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;}具体实现代码如附件所示编译ParamTableDataDemo.java,将生成的ParamTableDataDemo.class文件放到报表服务器的%FineReport6.5WebReportWEB-INFclasses目录;注意:如该例子所示,其包名为com.demo,所以其类所在路径为comdemo2.配置程序数据集•步骤一:选择“服务器|服务器数据集”,在弹出的窗口左上角点击,选择添加程序,可以把默认名字更改为恰当的名字,如下图所示:•步骤二:点击选择您定义好的类文件,此处选择上面定义好的ParamTableDataDemo.class,点击下方的确定即添加完成。

finereport 数据集函数

finereport 数据集函数

finereport 数据集函数finereport数据集函数是一种用于处理和操作数据的功能,可以在finereport报表设计软件中使用。

它提供了一系列的函数和方法,用于从数据源中获取、过滤、计算和组织数据,以便在报表中展示和分析。

本文将介绍一些常用的finereport数据集函数,并说明它们的用途和使用方法。

数据集函数是在数据集中使用的函数,用于对数据进行处理和操作。

常见的数据集函数包括求和函数、平均函数、最大值函数、最小值函数等。

这些函数可以对数据进行统计和计算,帮助用户快速获得需要的数据结果。

一、求和函数求和函数是最常用的数据集函数之一,用于计算一组数据的总和。

在finereport中,可以使用SUM函数来实现求和操作。

例如,SUM(Salary)表示对数据集中的Salary字段进行求和。

二、平均函数平均函数用于计算一组数据的平均值。

在finereport中,可以使用AVG函数来实现平均操作。

例如,AVG(Salary)表示对数据集中的Salary字段进行求平均。

三、最大值函数最大值函数用于找出一组数据中的最大值。

在finereport中,可以使用MAX函数来实现最大值操作。

例如,MAX(Salary)表示找出数据集中的Salary字段的最大值。

四、最小值函数最小值函数用于找出一组数据中的最小值。

在finereport中,可以使用MIN函数来实现最小值操作。

例如,MIN(Salary)表示找出数据集中的Salary字段的最小值。

以上是一些常用的finereport数据集函数,它们可以帮助用户对数据进行统计和计算,从而更好地理解和分析数据。

除了上述函数之外,finereport还提供了许多其他的数据集函数,如COUNT函数用于计算数据的数量,DISTINCT函数用于去重,等等。

用户可以根据实际需求选择合适的函数进行使用。

在使用finereport数据集函数时,需要注意以下几点:1. 函数的参数应该是合法的字段名或者表达式,不要使用无效的参数。

报表开发工具FineReport中js自定义按钮导出

报表开发工具FineReport中js自定义按钮导出

js自定义按钮导出1. 描述FineReport支持多种不同的导出方式,直接使用FineReport内置导出按钮可以非常快捷方便的来对各种格式的输出,但是我们在web页面集成中的时候,往往只想讲报表内容嵌入到iframe中,而工具栏以及工具栏上的按钮都会隐藏掉,而使用web页面自定义的按钮,那么,此时,这种自定义按钮如何实现导出呢,如下图所示:2. 示例如上图所示,我们新建一个html页面,定义一个工具栏和一个iframe,工具栏中定义上图所示的按钮,iframe 中嵌入FR中的报表,如下图:2.1 FR报表设置打开设计器,找到上面web页面中嵌入的那张模板,由于要使用自定义按钮作为工具栏,那么FR报表内置的工具栏就无需显示出来。

点击模板>模板web属性>分页预览设置,去掉使用工具栏前面的勾选,如下图:2.2 自定义导出按钮web页面中定义了6个自定义导出按钮,那么怎样才能实现导出操作呢?FineReport导出操作的js接口为:导出PDF:exportReportToPDF()导出[Excel](分页):exportReportToExcel('page')导出[Excel](原样):exportReportToExcel('simple')导出[Excel](分页分sheet):exportReportToExcel('sheet')导出[图片]:exportReportToImage('gif')【括号里面可以更换参数,比如说png,jpg等等图片类型】导出[word]:exportReportToWord()故,各个按钮的点击事件应该调用上述的js接口来实现其对应的导出格式,比如说导出PDF,那么其按钮的onclikc事件为:注:document.getElementById('reportFrame')是获取到iframe框架,然后通过contentWindow得到报表窗口,并拿到contentPane这个报表容器,最后就可以从容器中调用各种导出接口的方法了。

数据展示工具FineReport的JS API开发教程(一)

数据展示工具FineReport的JS API开发教程(一)

数据展示工具FineReport的JS API开发教程(一)很多报表软件可以利用JS接口来实现更多更复杂的功能。

以FineReport为例,开放了大量的JS API给用户,根据执行JS的主体不同可以将分为三大类:FR、FS和contentWindow。

在js语句中执行可以使用FR的方法或者属性,比如说FR.Msg.alert,FR中的方法比如引入finereport.js。

FS的方法可以用于数据决策系统中的js接口,比如说FS.tabPane.addItem。

而contentWindow是在web页面集成的时候,将F报表嵌入在iframe中,调用报表对象时使用的接口,比如说:document.getElementById('reportFrame').contentWindow,其中document.getElementById('reportFrame')是获取iframe对象,contentWindow是报表对象,相当于html中的window对象。

由于篇幅,这里先介绍FRFR大家知道,预览报表时,报表servlet会将cpt模板转为html,在这个html的head头部中会引入FR的js,如下:<script type="text/javascript"src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script>这个finereport.js中包含了许多内置的function以及一些公有的属性,不管在模板中还是其他网页中,只要引入了finereport.js,就能够通过FR.xxx的形式调用公有的属性与方法比如,在模板中使用,访问模板时会自动引入finereport.js,因此在模板的js脚本中可以直接使用FR.xxx来调用方法,如下图:或者需要在自己的网页如某个jsp页面中调用FR的方法,要先引入finereport.js,再通过FR.xxx来调用,如下:<html><head><script type="text/javascript"src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script><script type="text/javascript">var url = FR.cjkEncode("/WebReport/ReportServer?reportlet=Gettingstarted.cpt&地区=华东");window.open(url);</script></head><body></body></html>这里主要细讲一下Msg和Ajax方法。

利用开源报表FineReport实现自定义附件处理

利用开源报表FineReport实现自定义附件处理

利用开源报表FineReport实现自定义附件处理1、问题描述在定时任务完成之后,在导出文件之前可能需要进行进一步处理,比如说修改某些数据,或者是将导出文件固定导出在某个目录下等等后续操作,这时候就可以用自定义附件处理来实现。

2、解决思路编写java类文件,在类文件中实现对数据进行处理操作,然后在定时任务的第四步勾选是否自定义附件处理,并正确填写类名。

(一)自定义上传文件至磁盘1.问题描述在定时任务完成之后,有时候需要将文件导出至自定义位置,而不是系统默认位置%FR%WebReport\WEB-INF\schedule,这时候就可以通过自定义附件来处理,通过自定义类文件修改文件导出的位置。

2.示例导出excel和pdf,并把生成的对应文件保存在指定路径中去,本例中的路径是放在D盘中。

3.实现步骤3.1编写类文件定义一个OutputExcel类文件,实现AbstractOutputFileAction接口,具体代码如下:package com.fr.output;import java.io.*;import com.fr.json.JSONException;import com.fr.json.JSONObject;import com.fr.schedule.output.AbstractOutputFileAction;import com.fr.schedule.output.OutputFileAction;public class OutputExcel extends AbstractOutputFileAction{@Overridepublic File[]getFilesToDealWith(File[]files){return files;}@Overridepublic void doFileAction(File[]files){//OutputStream out=new BufferedOutputStream(new FileOutputStream(newFile(files.)));;System.out.println(files[0].getName());for(int i=0;i<files.length;i++){String name=files[i].getName();String path="D:/"+name;BufferedInputStream in=null;OutputStream out=null;try{out=new BufferedOutputStream(new FileOutputStream(new File(path)));in=new BufferedInputStream(new FileInputStream(files[i]));byte[]ba=new byte[in.available()];in.read(ba);out.write(ba);}catch(Exception e){//TODO Auto-generated catch blocke.printStackTrace();}finally{try{if(in!=null){in.close();}if(out!=null){out.close();}}catch(IOException e){//TODO Auto-generated catch blocke.printStackTrace();}}}}@Overridepublic boolean isEmailNotification(){//TODO Auto-generated method stubreturn false;}@Overridepublic OutputFileAction analyzeJSON(JSONObject arg0){//TODO Auto-generated method stubreturn null;}@Overridepublic JSONObject createJSONConfig()throws JSONException{//TODO Auto-generated method stubreturn null;}@Overridepublic String getJsonTag(){//TODO Auto-generated method stubreturn null;}}编译类文件,将生成的OutputExcel.class放在%FineReport_home%\WebReport\WEB-INF\classes\com\fr\output文件夹下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

概述随着FineReport的发展,它提供的设计器和服务器应该能够满足您绝大部分的需求,完全实现零编码的软件开发,革命性地加快软件开发速度,提高软件稳定性。

但是需求是千变万化的,而FineReport所包含的功能是报表行业中比较普遍的、典型的,也许某些个性化的功能通过FineReport软件无法实现。

因此FineReport开放了能够进行二次开发的接口,来更好的满足您软件产品或项目中的个性化的需求。

您可以根据该引擎API文档学习各类接口的使用方法,另外若您是一名程序员,且对FineReport报表深感兴趣,希望更深入地了解FineReport软件的内部原理,您也可以阅读该章节。

FineReport引擎API文档对如何定义类、编译类文件及JAVA开发平台使用等JAVA基础知识未作介绍,因此在您查看引擎API文档前请确保您有一定的JAVA基础。

目录1.程序数据源2.1简单程序数据集2.2带参程序数据集2.自定义函数3.1自定义函数3.2SubSection函数-Oracle查询参数个数限制3.3自定义函数生产UPC条形码3.导出api注:另有报表调用的相关代码,如有需要可以另行下载。

程序数据集简单程序数据集FineReport报表的数据来源可以是数据库数据或是文本数据,并且还可以是其它任何类型的数据,因为FineReport是通过TableData接口来读取数据源的,而上述所有的数据来源都实现了该接口,因此用户只要实现了TableData接口,也就可以用自定义类型的数据源了(程序数据集),FineReport报表引擎就能够读取定义的数据源作为报表数据源使用。

TableData接口主要有5个方法,如下://获取TableData的总列数public int getColumnCount();//获取TableData中第columnIndex列的列名public String getColumnName(int columnIndex);//判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取public boolean hasRow(int rowIndex);//获取TableData的总行数public int getRowCount();//获取TableData中第columnIndex列,第rowIndex行的数据public Object getValueAt(int rowIndex, int columnIndex);使用程序数据集分为如下三个步骤:在某些应用场景中,需要在程序中对数据进行处理后再作为报表的数据源使用,以下例子即为一个简单的不带参程序数据集ArrayTableData的使用过程,并以此简要说明程序数据集的使用方法。

1. 定义程序数据源由之前的概述可知,程序数据集需要实现TableData接口,可以直接继承该接口,实现其5个方法,也可以从AbstractTableData扩展,因为AbstractTableData已经实现了默认的hasRow(int rowIndex)方法。

该例中的程序数据集ArrayTableData就是直接从AbstractTableData扩展的,完整代码如下:package com.fr.data;import com.fr.data.AbstractTableData;public class ArrayTableDataDemo extends AbstractTableData {//定义程序数据集的列名与数据保存位置private String[] columnNames;private Object[][] rowData;//实现构建函数,在构建函数中准备数据public ArrayTableDataDemo(){String[] columnNames ={"Name","Score"};Object[][] datas = {{"Alex",new Integer(15)},{"Helly",newInteger(22)},{"Bobby",new Integer(99)}};this.columnNames = columnNames;this.rowData = datas;}//实现TableData的其他四个方法,因为AbstractTableData已经实现了hasRow方法public int getColumnCount(){return columnNames.length;}public String getColumnName(int columnIndex){return columnNames[columnIndex];}public int getRowCount(){return rowData.length;}public Object getValueAt(int rowIndex, int columnIndex){return rowData[rowIndex][columnIndex];}}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下面。

此时该程序数据源便定义好了。

2. 配置程序数据源2.1 新建报表在报表数据集中新建程序数据源,选择我们定义好的程序数据集,如下图名字可以自定义,如student3. 使用程序数据集配置好程序数据源后便可以使用定义的student程序数据集了,与其他类型的数据集使用方法是相同的,可以通过拖拽方法实现单元格数据列绑定。

如下图带参程序数据集在实际应用中,可能需要根据表名动态地改变数据源,比如在程序数据集中,通过传进的表名参数,到数据库取出对应的表作为数据源。

因为FineReport是通过TableData接口来读取数据源的,而上述所有的数据来源都实现了该接口,因此用户只要实现了TableData接口,也就可以用自定义类型的数据源了(程序数据集),FineReport报表引擎就能够读取定义的数据源作为报表数据源使用。

以下就对这种情况举例说明。

TableData接口主要有5个方法,如下://获取TableData的总列数public int getColumnCount();//获取TableData中第columnIndex列的列名public String getColumnName(int columnIndex);//判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取public boolean hasRow(int rowIndex);//获取TableData的总行数public int getRowCount();//获取TableData中第columnIndex列,第rowIndex行的数据public Object getValueAt(int rowIndex, int columnIndex);使用程序数据集分为如下三个步骤:►定义程序数据源►配置程序数据源►使用程序数据集1. 定义程序数据源首先在构建函数中定义好所用的程序数据集表结构,通过参数获得表名;其次在初始化函数中准备数据并放入定义的表中;完整代码如下:package com.fr.data;import java.sql.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 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#9public ParamTableDataDemo() {// 定义tableName参数this.parameters = new Parameter[] { new Parameter("tableName") };// 定义程序数据集列名columnNames = new String[columnNum];for (int i = 0; i < columnNum; i++) {columnNames[i] = "column#" + String.valueOf(i);}}// 实现其他四个方法public int getColumnCount() {return columnNum;}public String getColumnName(int columnIndex) {return columnNames[columnIndex];}public int getRowCount() {init();return valueList.size();}public Object getValueAt(int rowIndex, int columnIndex) {init();if (columnIndex >= colNum) {return null;}return ((Object[]) valueList.get(rowIndex))[columnIndex];}// 准备数据public void init() {// 确保只被执行一次if (valueList != null) {return;}// 保存得到的数据库表名String tableName = parameters[0].getValue().toString();// 构造SQL语句,并打印出来String sql = "select * from " + tableName + ";";FRContext.getLogger().log(,"Query SQL of ParamTableDataDemo: \n" + 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(,"Query SQL of ParamTableDataDemo: \n" + valueList.size()+ " rows selected");} catch (Exception e) {e.printStackTrace();}}// 获取数据库连接driverName 和url 可以换成您需要的public Connection getConnection() {String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";String url = "jdbc:odbc:Driver={Microsoft Access Driver(*.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目录下。

相关文档
最新文档