- 生成可通过tablemodel接口访问的数据,如本例中的createdata方法完成的功能
- 生成一个jfreereport实例,他定义了我们如何格式化显示数据,如本例中的createreportdefinition方法完成的功能
- 将数据和jfreereport实例连接起来,并且将该jfreereport实例传给previewdialog的一个实例显示给用户
3 使用jfreereport生成复杂报表
3.1 报表定义文件
报表定义文件是jfreereport生成复杂报表的重要文件,他就是一个xml文档,主要描述如何使用指定的格式生成复杂的报表,同时使用报表定义文件也可以在报表格式需要修改时只需要更新该报表定义文件,而不需要修改应用代码。
3.1.1 报表定义文件分类
jfreereport中使用了两种基于xml的报表定义文件来保存报表定义信息:简单格式和扩展格式.很明显,简单格式不能够完全的描述jfreereport支持的全部报表定义信息,但是他更易于上手使用。而扩展格式则能够对jfreereport的报表定义提供完整的支持,但是扩展格式太详细了,不太容易使用。
关于这两种报表定义格式文件所支持的标签内容以及如何编写这两种格式的报表定义文件请大家参考%jfreereport_home%下的jfreereport-0.8.3-a4.pdf中的相关部分,该文件附录中还包括了这两种格式的报表定义文件的dtd文档供大家参考.当然大家也jfreereport的例子中提供了多种形式的报表定义文件,基本上涵盖了常用的报表格式定义,大家可以参考这些例子编写自己的报表定义文件,。
3.2 代码编制
这个例子和2.2中的代码基本一致,只是报表定义内容不再由java编码实现,而是由报表定义文件提供,所以调用方面稍微有点不同,详细的代码如下,请大家注意其中加粗显示的部分:
/**
* jfreereport.java
*/
package org.vivianj.jfreereport;
import java.io.file;
import java.text.messageformat;
import javax.swing.table.tablemodel;
import javax.swing.jframe;
import org.jfree.ui.refineryutilities;
import org.jfree.report.boot;
import org.jfree.report.modules.gui.base.previewframe;
import org.jfree.report.modules.parser.base.reportgenerator;
import org.jfree.report.jfreereport;
import org.vivianj.jfreereport.tablemodel.sampledata;
/**
* 使用jfreereport生成复杂报表的例子,
* 用于演示使用jfreereport生成复杂报表的一些基本步骤
*
* 本例子中,报表定义使用了报表定义文件,该文件是保存在c:\下的report3.xml文件
* 本例中使用的报表定义使用了简单报表定义格式
*
* @ 作者 : bookman
*/
public class jfreetest
{
public jfreetest(final string urlname, final tablemodel data)
{
//创建对报表定义文件的引用
final file in = new file(urlname);;
if (in == null)
{
system.out.print(" in is null");
return;
}
system.out.print("processing report: " + in);
final reportgenerator gen = reportgenerator.getinstance();
try
{
//从报表定义文件中获得要用到的报表定义内容
final jfreereport report1 = gen.parsereport(in);
if (report1 == null)
{
system.out.print(" report1 is null");
return;
}
//将报表定义和数据结合
report1.setdata(data);
//将生成的报表放到预览窗口中
final previewframe frame1 = new previewframe(report1);
frame1.setdefaultcloseoperation(jframe.exit_on_close);
frame1.pack();
refineryutilities.positionframerandomly(frame1);
frame1.setvisible(true);
frame1.requestfocus();
}
catch (exception e)
{
system.out.print("report.definitionfailure-----------------------\r\n" + e);
}
}
public static void main(string[] args)
{
boot.start();
final tablemodel data3 = new sampledata();
jfreetest jft = new jfreetest("c:\\report3.xml",data3);
}
}
4 中文乱码问题
大家在参看报表定义文件的时候会发现,里面的报表头定义中有一些显示内容,如果你直接将他修改成中文,显示在报表上就会乱码,这是因为这些报表定义文件都是xml文档,他的encoding默认设置是iso-8859-1,所以出现了中文乱码的问题,解决办法有两个:
1.最简单的方法就是将encoding的设置修改为gb2312
2.还有一个方法就是不修改encoding的设置,而是将这些中文内容使用他们的unicode码来代替。
[注] 作者提供了一个gui的界面提供这种转化功能,你只需要输入中文就可以获得对应的unicode码,请大家下载作者提供的gb2unicode.jar,设置好java运行环境,然后执行java -jar gb2unicode.jar就可以了。