概述
随着 FineReport 的发展,它提供的设计器和服务器应该能够满足您绝大部分的需求,
完全实现零编码的软件开发,革命性地加快软件开发速度,提高软件稳定性。但是需求是千
变万化的,而 FineReport 所包含的功能是报表行业中比较普遍的、典型的,也许某些个性
化的功能通过 FineReport 软件无法实现。因此 FineReport 开放了能够进行二次开发的接口,
来更好的满足您软件产品或项目中的个性化的需求。您可以根据该引擎 API 文档学习各类接
口的使用方法,另外若您是一名程序员,且对 FineReport 报表深感兴趣,希望更深入地了
解 FineReport 软件的内部原理,您也可以阅读该章节。
FineReport 引擎 API 文档对如何定义类、编译类文件及 JAVA 开发平台使用等 JAVA 基
础知识未作介绍,因此在您查看引擎 API 文档前请确保您有一定的 JAVA 基础。
目录
1. 报表调用
1.1 读取编辑报表
1.2 创建程序报表
1.3 单元格格式设置
1.4 程序报表添加单元格
1.5 遍历读取单元格内容
1.6 读取报表参数并赋值
注:另有报表程序数据集、自定义函数和导出 API 的相关代码,如有需要可以另行下载。
报表调用
读取编辑报表
通过内核结构的介绍,可知我们能在程序中修改报表的属性,下面我们就以一个完整的
例子说明如何在程序中读取一张报表,修改后重新导出。
1. 读取报表
读取某一路径下的模板 cpt 文件,并将其转为 WorkBook 对象,有两种读取报表的方法:
一、直接以文件绝对路径读取;二、先定义报表运行环境,然后从运行环境中直接读取
相对路径下的模板。
1.1 绝对路径读取模板
// 读取模板
File cptfile = new
File("C:\\FineReport6.5\\WebReport\WEB-INF\\reportlets\\gettingstarted.cpt");
TemplateImporter tplimp = new TemplateImporter();
WorkBook workbook = tplimp.generateTemplate(cptfile);
1.2 读取报表运行环境下的模板
//定义报表运行环境,读取环境下的报表
String envPath = " C:\\FineReport6.5\\WebReport \\WEB-INF";
FRContext.setCurrentEnv(new LocalEnv(envPath));
TemplateWorkBook workbook =
FRContext.getCurrentEnv().readTemplate("gettingstarted.cpt");
2. 编辑报表属性
//获得 WorkBook 中的 WorkSheet,进而修改 A2 单元格的前景色为红色
Report report = workbook.getReport(0);
//getCellElement(int column, int row),column 和 row 都从 0 开始,因此 A2 单元格便是
第 0 列第 1 行
CellElement cellA2 = report.getCellElement(0,1);
FRFont frFont = FRFont.getInstance();
frFont = frFont.applyForeground(Color.red);
Style style = Style.getInstance();
style = style.deriveFRFont(frFont);
cellA2.setStyle(style);
3. 导出报表
// 保存模板
FileOutputStream outputStream = new FileOutputStream(new
File("D:\\newGettingStarted.cpt"));
TemplateExporter templateExporter = new TemplateExporter();
templateExporter.export(outputStream, workbook);
具体的执行代码如下:
package com.fr.demo;
import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import com.fr.base.FRFont;
import com.fr.base.Style;
import com.fr.report.CellElement;
import com.fr.report.Report;
import com.fr.report.WorkBook;
import com.fr.report.io.TemplateExporter;
import com.fr.report.io.TemplateImporter;
public class SimpleDemo {
public static void main(String[] args) {
try {
// 读取模板
File cptfile = new
File("C:\\FineReport6.5\\WebReport\\WEB-INF\\reportlets\\gettingstarted.cpt");
TemplateImporter();
tplimp.generateTemplate(cptfile);
TemplateImporter tplimp = new
WorkBook workbook =
A2 单元格的前景色为红色
//获得 WorkBook 中的 WorkSheet,进而修改
Report report = workbook.getReport(0);
//getCellElement(int column, int
row),column 和 row 都从 0 开始,因此 A2 单元格便是第 0 列第 1 行
CellElement cellA2 =
report.getCellElement(0,1);
frFont.applyForeground(Color.red);
FRFont frFont = FRFont.getInstance();
frFont =
Style style = Style.getInstance();
style = style.deriveFRFont(frFont);
cellA2.setStyle(style);
// 保存模板
FileOutputStream outputStream = new
FileOutputStream(new File("D:\\newGettingStarted.cpt"));
TemplateExporter templateExporter = new
templateExporter.export(outputStream,
} catch (Exception e) {
e.printStackTrace();
}
TemplateExporter();
workbook);
}
}
4. 查看导出结果
编译运行上述代码,将会在 D 盘根目录下输出报表 newGettingStarted.cpt,我们用设计器
打开导出模板,可以看到,A2 单元格的前景色变成了红色。
创建程序报表
由服务器原理章节,我们可以了解到所谓的网络报表就是指实现了 Reportlet 接口的文件,
程序网络报表的存在可以用来解决某些特殊应用,而由于程序网络报表需要自己来实现
Reportlet 接口,接下来我们给以详细说明。
建议在开始本章节钱稍微了解一下 FineReport 提供的 API 学习,当然需要一定的程序语言
基础。
FineReport 报表设计器可以设计出绝大多数的报表而不用写一行代码,只有少部分的报表
由于有特殊需求需要用写程序的方式来设计,FineReport 提供了丰富的 API 接口可以让用户很
轻松的做出需要的报表,下面这个例子就是要新建一个报表,在(1,1)单元格内插入 FineReport
这个字符串,对字符串进行格式设置,在其中(4,5)单元格内插入一个 FineReport 的 log 标
志,用 J2EE 服务器来发布,通过浏览器来浏览,下面以这个简单的例子来详细的介绍如何创建
程序网络报表。
1.新建 JAVA 类文件
创建程序网络报表需要新建一个 JAVA 类,我们把这个类命名成 SimpleReportletDemo,这个类
需要实现 com.fr.web.Reportlet 这个接口,并且需要实现 public Report
createReport(ReportletRequest reportletRequest)这个方法。
► 实现 com.fr.web.Reportlet 接口,格式如下:
public class SimpleReportletDemo implements Reportlet {
public SimpleReportletDemo() {
}
public WorkBookTemplate createReport(ReportletRequest reportletRequest)
{
}
► 实现 public Report createReport(ReportletRequest reportletRequest)方法,
这个方法需要返回一个 Report 类型的对象,代码格式如下:
public
Report createReport(ReportletRequest
reportletRequest){
WorkBook
wb=new
WorkBook();
WorkBook
wb=new
WorkBook();
WorkSheet
workSheet=new
WorkSheet();
return
wb;
}
下面我们可以给 workSheet 加上一些需要的单元格内容。
♦ 我们现在可以给这个 workSheet 的(1,1)格子内加上一个字符串,如下所示:
//new a cellElement with String "FineReport"
CellElement cellElement1 = new DefaultCellElement(1, 1,
"FineReport");
//add the cellElement to the workSheet
workSheet.addCellElement(cellElement1);
♦ 然后可以给这个 workSheet 调整列宽和行高,如下所示:
//set the columnWidth of 1 to 200px,rowHeight of 1 to 30px
workSheet.setColumnWidth(1, 200);
workSheet.setRowHeight(1, 30);
♦ 给这个单元格设置字体,样式,颜色还有前景色等等。
//set the font of cellElement1
Style style = Style.getInstance();
FRFont frFont = FRFont.getInstance("Tahoma", Font.BOLD | Font.ITALIC,
20);
frFont = frFont.applyForeground(Color.red);
style = style.deriveFRFont(frFont);
cellElement1.setStyle(style);
完整代码如下所示:
package com.fr.demo;
import java.awt.Color;
import java.awt.Font;
import com.fr.base.FRFont;
import com.fr.base.Style;
import com.fr.report.CellElement;
import com.fr.report.DefaultCellElement;
import com.fr.report.WorkBook;
import com.fr.report.WorkBookTemplate;
import com.fr.report.WorkSheet;
import com.fr.web.Reportlet;
import com.fr.web.ReportletRequest;
/**
* ReportletFromTemplateDemo.
* @author marks
*/
public class SimpleReportletDemo implements Reportlet {
public SimpleReportletDemo() {
}
//建立新报表需要传参(ReportletRequest reportletRequest)
public WorkBookTemplate createReport(ReportletRequest reportletRequest) {
//new a WorkSheet
WorkBook wb = new WorkBook();
WorkSheet workSheet = new WorkSheet();
//new a cellElement with String "FineReport"
CellElement cellElement1 = new DefaultCellElement(1, 1, "FineReport");
//add the cellElement to the workSheet
workSheet.addCellElement(cellElement1);
//set the columnWidth of 1 to 200px,rowHeight of 1 to 30px
workSheet.setColumnWidth(1, 200);
workSheet.setRowHeight(1, 30);
//set the font of cellElement1
Style style = Style.getInstance();
FRFont frFont = FRFont.getInstance("Tahoma", Font.BOLD,Font.ITALIC,
20);
frFont = frFont.applyForeground(Color.red);
style = style.deriveFRFont(frFont);
cellElement1.setStyle(style);
//set the columnWidth of 4 to 200px,rowHeight of 5 to 50px
workSheet.setColumnWidth(4, 200);
wb.addReport(workSheet);
return wb;
}
}
2.编译 JAVA 文件
下面命令用于编译 JAVA 文件:
注意在编译时将 fr-server-6.5.jar 放置在当前目录
C:\>javac -classpath fr-server-6.5.jar SimpleReportletDemo.java
将编译后的 SimpleReportletDemo.class 放到网络报表根目录下,存放地址如下:
WEB-INF\classes\com\fr\demo
3.发布并浏览
首先启动报表服务器,既 FineReport 安装目录下面的 Jetty 服务器,Jetty 服务器启动完毕后
打开浏览器,在浏览器中输入下列地址:
http://localhost:8079/WebReport/ReportServer?reportlet=com.fr.demo.SimpleReportletD
emo
结果如下所示:
单元格格式设置
// 新建一个单元格, 位置为(2, 2), 列宽为 2
// 行高为 2, 值为文本 "FineReport"
CellElement cellElement
=
new CellElement(2,
2,
2,
2,
"FineReport");
// 得到 CellElement 的样式,如果没有新建默认样式
Style style
=
cellElement.getStyle();
if(style ==
null)
{
style
=
Style.getInstance();
}
// 设置字体和前景的颜色
FRFont frFont =
FRFont.getInstance("Dialog",
Font.BOLD,
14);
frFont =
frFont.applyForeground(new
Color(21,
76,
160));
style =
style.deriveFRFont(frFont);
// 设置背景
ColorBackground background
=
ColorBackground.getInstance(new Color(255,
25
5,
177));
style =
style.deriveBackground(background);
// 设置水平居中
style =
style.deriveHorizontalAlignment(Constants.CENTER);
// 设置边框
style =
style.deriveBorder(Constants.LINE_DASH_DOT,
Color.red,
Constants.LI
NE_DASH_DOT,
Color.yellow,
Constants.LINE_DASH_DOT,
Color.BLUE,
Constants.L
INE_DASH_DOT,
Color.CYAN);
// 改变单元格的样式
cellElement.setStyle(style);
改变单元格的格式,应先取出该单元格(CellElement)的格式(Style)。在默认的情况下 Style
是 null,故当取出 Style 后应先判断其值是否为 null,如果这个值为空,则需先新建一个
Style,然后再将该值赋给 CellElement。最后根据 Style 和 FRFont 中的方法进一步地设置
该单元格的各种属性。
可执行代码如下:
package com.fr.demo;
import java.awt.Color;
import java.awt.Font;
import com.fr.base.Constants;
import com.fr.base.FRFont;
import com.fr.base.Style;
import com.fr.base.background.ColorBackground;
import com.fr.report.CellElement;
import com.fr.report.DefaultCellElement;
import com.fr.report.WorkBook;
import com.fr.report.WorkBookTemplate;
import com.fr.report.WorkSheet;
import com.fr.web.Reportlet;
import com.fr.web.ReportletRequest;
/**
* ReportletFromTemplateDemo.
* @author marks
* 设置单元格格式
*/
public class CellElementStyleDemo implements Reportlet {
public CellElementStyleDemo() {
}
//建立新报表需要传参(ReportletRequest reportletRequest)
public WorkBookTemplate createReport(ReportletRequest reportletRequest)
{
//new a WorkSheet
WorkBook wb = new WorkBook();
WorkSheet workSheet = new WorkSheet();
"FineReport");
//new a cellElement with String "FineReport"
CellElement cellElement1 = new DefaultCellElement(1, 1,
//add the cellElement to the workSheet
workSheet.addCellElement(cellElement1);
//set the columnWidth of 1 to 200px,rowHeight of 1 to 30px
workSheet.setColumnWidth(1, 200);
workSheet.setRowHeight(1, 30);
//set the font of cellElement1
Style style = Style.getInstance();
FRFont frFont = FRFont.getInstance("Tahoma", Font.BOLD | Font.ITALIC,
20);
frFont = frFont.applyForeground(Color.red);
style = style.deriveFRFont(frFont);
// 设置背景
ColorBackground background = ColorBackground.getInstance(new Color(255,
255, 177));
style = style.deriveBackground(background);
// 设置水平居中
style = style.deriveHorizontalAlignment(Constants.CENTER);
// 设置边框
style = style.deriveBorder(Constants.LINE_DASH_DOT, Color.red,
Constants.LINE_DASH_DOT, Color.yellow, Constants.LINE_DASH_DOT, Color.BLUE,
Constants.LINE_DASH_DOT, Color.CYAN);