
使用JFreeReport生成报表(2) |
/** * 创建一个报表定义 * * @返回一个报表定义实例 */ private JFreeReport createReportDefinition() { final JFreeReport report = new JFreeReport(); report.setName("A Very Simple Report"); /** * 定义要显示报表第一列的样式 */ TextFieldElementFactory factory = new TextFieldElementFactory(); factory.setName("T1"); factory.setAbsolutePosition(new Point2D.Float(0, 0)); factory.setMinimumSize(new FloatDimension(150, 20)); factory.setColor(Color.black); factory.setHorizontalAlignment(ElementAlignment.LEFT); factory.setVerticalAlignment(ElementAlignment.MIDDLE); factory.setNullString("-"); factory.setFieldname("Column1"); report.getItemBand().addElement(factory.createElement()); /** * 定义要显示报表第二列的样式 */ factory = new TextFieldElementFactory(); factory.setName("T2"); factory.setAbsolutePosition(new Point2D.Float(200, 0)); factory.setMinimumSize(new FloatDimension(150, 20)); factory.setColor(Color.black); factory.setHorizontalAlignment(ElementAlignment.LEFT); factory.setVerticalAlignment(ElementAlignment.MIDDLE); factory.setNullString("-"); factory.setFieldname("Column2"); report.getItemBand().addElement(factory.createElement()); /** * 返回一个报表定义的实例 */ return report; } public static void main(final String[] args) { // 初始化JFreeReport Boot.start(); //调用演示实例 new HelloWorld(); } } 2.3 运行例子 如果你执行了1.3中规定的步骤,你可以进入命令行界面,然后进入%demo_home%目录下,修改setenv.cmd中的相关设置,执行serenv.cmd设置环境变量。执行java org.vivianj.jfreereport.HelloWorld查看运行结果。下面这个图片是作者执行后结果的屏幕截图: 大家可以看到,JFreeReport已经自动帮我们实现了分页。上面这个图片显示的是第一页的数据,你可以通过工具栏中的查看其它页面中的内容。 2.4 基本步骤解释 使用JFreeReport生成报表通常需要以下三个基本步骤: 生成可通过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就可以了。 5 总结 报表问题是企业信息化中比较关注的一个焦点,也比较难于实现客户化,作者在本文中给大家介绍了一个新的报表生成包-JfreeReport,他可以根据XML文档中定义的报表格式,生成符合客户要求的报表。文章中给出了2个简单的例子,演示了如何使用JFreeReport生成报表的详细步骤,希望能够帮助大家熟悉JFreeReport的工作方式。同时文章中给出了使用JFreeReport过程中可能遇到的中文问题的解决办法。 其实JFreeReport还支持在JSP、Servlet中显示报表,只是还需要用到他的扩展组件,作者这里没有给出例子,大家可以参考下载的JFreeReport的扩展组件中的例子。 参考资料: JFreeReport 在线帮助文档 http://www.jfree.org/jfreereport/index.html JFreeReport 的JavaDoc http://www.jfree.org/jfreereport/javadoc/index.html |