﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-KE-文章分类-JFreereport</title><link>http://www.blogjava.net/keweibo/category/30571.html</link><description>As long as you are there to lead me ,I won't lose my way </description><language>zh-cn</language><lastBuildDate>Wed, 02 Apr 2008 12:18:59 GMT</lastBuildDate><pubDate>Wed, 02 Apr 2008 12:18:59 GMT</pubDate><ttl>60</ttl><item><title>JFreeReport简介二</title><link>http://www.blogjava.net/keweibo/articles/190441.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Wed, 02 Apr 2008 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/190441.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/190441.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/190441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/190441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/190441.html</trackback:ping><description><![CDATA[<p>JFreeReport是由JFree组织开发的一个基于java的报表组件。利用JFreeReport组件可以完成大多数样式的报表，并且能够将其输出<br />
&nbsp;为pdf、xls、cvs、html等不同格式的文件和打印，为程序开发人员解决报表问题提供了很大的方便。<br />
JFreeReport组件包括一个核心包以及几个扩展包，可以到www.jfree.org网站下载。由于是开源的，所以可以直接得到其源代码。<br />
&nbsp;（后面关于PDF输出中文方面就需要修改其源代码）<br />
现在JFreeReport加入到了Pentaho，所以JFreeReport的最新版本只到jfreereport-0.8.7-9.jar，之后就以Pentaho Report Designer命名了。<br />
&nbsp;<br />
二、JFreeReport组件的结构<br />
JFreeReport组件的核心对象就是JFreeReport对象，我将其视两部分：一部分是报表格式定义，另一部分是数据存储。<br />
JFreeReport组件的数据使用的是java.swing.table.TableModel类，我们对它都非常熟悉了，用JTable做表格时都会用到，所以在此不再累述。<br />
&nbsp;我主要讲讲JFreeReport的报表格式定义以及输出方法。<br />
JFreeReport将报表分为以下几个部分：<br />
&nbsp;报头（ReportHeader）、<br />
&nbsp;报尾（ReportFooter）、<br />
&nbsp;页头（PageHeader）、<br />
&nbsp;页尾（PageFooter）、<br />
&nbsp;分组头（GroupHeader）、<br />
&nbsp;分组尾（GroupFooter）和数据域。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 表头（ReportHeader）——内容显示在整个报表的开头，可以包括报表名称等内容。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 表尾（ReportFooter）——内容显示在整个报表的末尾。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 页首（PageHeader）——内容显示在每一页的首部，第一页则显示在ReportHeader下面，可以包括报表日期、填表人等内容。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 页尾（PageFooter）——内容显示在每一页的末尾，可以包括页号等信息。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 分组头（GroupHeader）——如果将数据分组，则GroupHeadar内容会显示在每一组分组的头部。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 分组尾（GroupFooter）——如果将数据分组，则GroupHeadar内容会显示在每一组分组的头部。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; 数据域——报表数据，一般位于每页的中间部分。<br />
&nbsp;<br />
三、报表格式定义<br />
知道了JFreeReport组件的报表结构，下面该介绍如何定义了。有两种方法：一种是使用java代码实现，另一种是使用xml定义。<br />
1、代码方式实现报表格式定义<br />
使用代码方式实现步骤很简单，就是分别构造报头（ReportHeader）、报尾（ReportFooter）、页头（PageHeader）、页尾（PageFooter）、<br />
&nbsp;分组头（GroupHeader）和分组尾（GroupFooter）对象，然后使用set方法加入JFreeReport对象就可以了。<br />
上面这几个对象我们一般只会用到其addElement(Element element)方法，即将一个元素（Element）加入到指定部分。在这里，元素的意义<br />
就是显示在报表中的内容，包括文本、表格、图形、图片等等。Element是一个抽象类，他有几个子类，但我们不必直接使用这些子类，<br />
而是通过org.jfree.report.elementfactory包中的工厂类来构建。：<br />
l&nbsp;&nbsp;&nbsp;&nbsp; LabelElementFactory——标签元素工厂类，定义报表中显示的固定文本内容。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; TextElementFactory——文本元素工厂类，根据定义的域名，显示其域名下的内容。比如：tableModel中的&#8220;编号&#8221;字段下的内容。<br />
l&nbsp;&nbsp;&nbsp;&nbsp; StaticShapeElementFactory——图形元素类，可以绘制直线、矩形等图形。<br />
其他的元素我没用过，大家可以查看JFreeReport的API文档。他们的用法请看下面的例子。<br />
&nbsp; public static final int ROW_HEIGHT = 20;&nbsp;&nbsp;&nbsp; //报告：行高度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static final int HEADER_HEIGHT = 40;&nbsp;&nbsp;&nbsp; //报告：报头高度<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeReport report = new JFreeReport();&nbsp;&nbsp;&nbsp; //构造JFreeReport对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.setName("Report Name");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageDefinition pd = report.getPageDefinition();&nbsp;&nbsp;&nbsp; //取得报告页面定义<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float pageWidth = pd.getWidth();&nbsp;&nbsp;&nbsp; //取得打印材质的页宽<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义页头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageHeader header = new PageHeader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LabelElementFactory title = new LabelElementFactory();&nbsp;&nbsp;&nbsp; //标题元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setText("统计报表");&nbsp;&nbsp;&nbsp; //设置文本内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setColor(Color.BLACK);&nbsp;&nbsp;&nbsp; //设置颜色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setAbsolutePosition(new Point2D.Float(0, HEADER_HEIGHT));&nbsp;&nbsp;&nbsp; //设置显示位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setMinimumSize(new FloatDimension(pageWidth, 36));&nbsp;&nbsp;&nbsp; //设置尺寸<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setHorizontalAlignment(ElementAlignment.LEFT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setVerticalAlignment(ElementAlignment.MIDDLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title.setDynamicHeight(true);&nbsp;&nbsp;&nbsp; //设置是否动态调整高度（如果为true，当文本内容超出显示范围时高度自动加长）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; header.addElement(title.createElement());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.setPageHeader(header);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] columnNames = getColumnNames();&nbsp;&nbsp;&nbsp; //取得报表数据域的所有列名<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; if (columnNames != null &amp;&amp; columnNames.length &gt; 0) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));&nbsp;&nbsp;&nbsp; //绘制表格的横线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义报表头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportHeader reportHeader = new ReportHeader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; columnNames.length; i++) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //字段名元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LabelElementFactory col = new LabelElementFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setName(columnNames[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setColor(Color.BLACK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setHorizontalAlignment(ElementAlignment.CENTER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setVerticalAlignment(ElementAlignment.MIDDLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setDynamicHeight(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setAbsolutePosition(new Point2D.Float((pageWidth<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / (columnNames.length))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * i, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setMinimumSize(new FloatDimension(pageWidth<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / (columnNames.length), ROW_HEIGHT));&nbsp;&nbsp;&nbsp; //设置最小尺寸<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setBold(true);&nbsp;&nbsp;&nbsp; //设置是否粗体显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.setText(columnNames[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportHeader.addElement(col.createElement());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportHeader.addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), col.getAbsolutePosition().getX()));&nbsp;&nbsp;&nbsp; //元素左侧竖线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportHeader.addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));&nbsp;&nbsp;&nbsp; //元素上方横线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportHeader.addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), pageWidth));&nbsp;&nbsp;&nbsp; //元素右侧竖线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.setReportHeader(reportHeader);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //字段内容元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextFieldElementFactory data = new TextFieldElementFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setName(columnNames[i]);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setColor(Color.BLACK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setAbsolutePosition(new Point2D.Float((pageWidth<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / (columnNames.length))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * i, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setMinimumSize(new FloatDimension(pageWidth<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / (columnNames.length), ROW_HEIGHT));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setHorizontalAlignment(ElementAlignment.CENTER);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setVerticalAlignment(ElementAlignment.MIDDLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setDynamicHeight(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setWrapText(new Boolean(true));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setNullString("-");&nbsp;&nbsp;&nbsp; //如果字段内容为空，显示的文本<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setFieldname(columnNames[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(data.createElement());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), -100));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), data.getAbsolutePosition().getX()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }// end for(int i=0;i&lt;columnNames.length;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //最后的竖线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.getItemBand().addElement(StaticShapeElementFactory.createVerticalLine(null, Color.BLACK, new BasicStroke(1), pageWidth));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageFooter footer = new PageFooter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置页号<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageOfPagesFunction pageFunction = new PageOfPagesFunction("PAGE_NUMBER");&nbsp;&nbsp;&nbsp; //构造一个页号函数对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageFunction.setFormat("{0} / {1}页");&nbsp;&nbsp;&nbsp; //设置页号显示格式（此处显示的格式为&#8220;1/5页&#8221;）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.addExpression(pageFunction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextFieldElementFactory pageCount = new TextFieldElementFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setFieldname("PAGE_NUMBER");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setColor(Color.black);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setAbsolutePosition(new Point2D.Float(0, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setMinimumSize(new FloatDimension(pageWidth, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setHorizontalAlignment(ElementAlignment.RIGHT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setVerticalAlignment(ElementAlignment.MIDDLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageCount.setDynamicHeight(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; footer.addElement(pageCount.createElement());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.setPageFooter(footer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportFooter reportFooter = new ReportFooter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportFooter.addElement(StaticShapeElementFactory.createHorizontalLine(null, Color.BLACK, new BasicStroke(1), 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.setReportFooter(reportFooter);<br />
&nbsp;<br />
2、XML方式实现报表格式定义<br />
对于简单的报表，我们可以使用代码来实现，但对于复杂的报表，代码可能就无能为力了<br />
&nbsp;（虽然也可以实现，但对于读代码的人来说可能将是场灾难），那么我们就可以通过定义XML来实现报表格式的定义。<br />
&nbsp;这种方法非常方便而且清晰。<br />
JFreeReport定义了两种XML实现方法。这里我只介绍一种，因为另一种我没有用过。我直接通过例子来解释如何实现：<br />
&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />
&lt;report name="My Report" pageformat="A4" leftmargin="40" rightmargin="40"&gt;<br />
&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="com.jrefinery.report.preview.PreferredWidth"&gt;1024&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="com.jrefinery.report.preview.PreferredHeight"&gt;768&lt;/property&gt;<br />
&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!-- 报头&nbsp; --&gt;<br />
&nbsp; &lt;reportfooter height="20" fontname="宋体" fontsize="12"&gt;<br />
&nbsp; &lt;/reportfooter&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!-- 页首&nbsp; --&gt;<br />
&nbsp; &lt;pageheader fontname="宋体" fontsize="12"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- 文本域，用于显示表数据中某列的内容&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- x,y: 为坐标点（以页首区域的左上角为(0, 0)点）&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- width, height: 为文本域的宽度和高度，如果为数值则表示为绝对尺寸，如果为百分数，则自动以百分比方式调整尺寸大小&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- alignment: 排列方式 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- fieldname: 域名，即数据域的列名 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- nullstring: 当数据域内容为空时显示的字符串内容 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- alignment: 水平排列方式center，left或right --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- vertical-alignment: 竖直排列方式top、middle或bottom --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- dynamic: 是否动态调整单元格高度，如果为true，当文本内容不足以在当前尺寸中显示时将自动增加单元格高度 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field x="0" y="0" width="100%" height="30" alignment="center" fontname="黑体" fontsize="15" fieldname="report.title" nullstring=""&gt;&lt;/string-field&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- 标签域，用于在报表中显示固定文本内容&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;label x="0" y="20" width="100%" height="20" alignment="center" fontname="黑体" fontsize="15"&gt;报表&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;label x="5%" y="80" width="100%" height="20" alignment="left"&gt;统计时间：&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field x="90" y="80" width="30%" height="18" alignment="left" fieldname="report.time" nullstring=""/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;label x="70%" y="80" width="100%" height="20"&gt;统计日期：&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- 时间域，用于显示时间&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- report.date: 下面&lt;function&gt;中定义的函数，显示当前时间 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- format: 日期格式 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;date-field fieldname="report.date" format="yyyy/M/d" x="0%" y="80" width="95%" height="20" alignment="right"&gt;&lt;/date-field&gt;<br />
&nbsp; &lt;/pageheader&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!-- 页尾&nbsp; --&gt;<br />
&nbsp; &lt;pagefooter height="20" fontname="宋体" fontsize="12"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field fieldname="pageXofY" x="0" y="4" width="100%" height="18" alignment="right"/&gt;<br />
&nbsp; &lt;/pagefooter&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!-- 分组&nbsp; --&gt;<br />
&nbsp; &lt;groups&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;group name="group1"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 分组头 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupheader fontname="宋体" fontsize="10.5"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="0%" y="5" width="20%" height="40" alignment="center" vertical-alignment="middle"&gt; 结&nbsp; 论 &lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="0%" y="0" width="20%" height="50" color="#000000" draw="true" fill="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="20%" y="5" width="40%" height="20" alignment="center" vertical-alignment="middle"&gt;上 年 度&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 图形：矩形 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- color: 颜色 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- fill: 是否填充 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="20%" y="0" width="40%" height="25" color="#000000" draw="true" fill="false"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="20%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle"&gt;人 数&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="20%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="40%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle"&gt;占比(%)&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="40%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="60%" y="5" width="40%" height="20" alignment="center" vertical-alignment="middle"&gt;本 年 度&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="60%" y="0" width="40%" height="25" color="#000000" draw="true" fill="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="60%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle"&gt;人 数&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="60%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;label x="80%" y="30" width="20%" height="20" alignment="center" vertical-alignment="middle"&gt;占比(%)&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rectangle x="80%" y="25" width="20%" height="25" color="#000000" draw="true" fill="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/groupheader&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 可以还有分组尾&lt;groupfooter&gt; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/group&gt;<br />
&nbsp; &lt;/groups&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!-- 数据域&nbsp; --&gt;<br />
&nbsp; &lt;items fontname="宋体" fontsize="12"&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- 图形：直线 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;line x1="0" y1="0" x2="0" y2="100%"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;string-field fieldname="年度体检结论" x="0%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;line x1="20%" y1="0" x2="20%" y2="100%"/&gt;&lt;!-- 结论 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field fieldname="上年度" x="20%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;line x1="40%" y1="0" x2="40%" y2="100%"/&gt;&lt;!-- 上年度人数 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field fieldname="上年度(%)" x="40%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;line x1="60%" y1="0" x2="60%" y2="100%"/&gt;&lt;!-- 上年度占比 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field fieldname="本年度" x="60%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;line x1="80%" y1="0" x2="80%" y2="100%"/&gt;&lt;!-- 本年度人数 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;string-field fieldname="本年度(%)" x="80%" y="5" width="20%" height="20" alignment="center" vertical-alignment="middle" nullstring="" dynamic="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;line x1="100%" y1="0" x2="100%" y2="100%"/&gt;&lt;!-- 本年度占比 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;line x1="0" y1="100%" x2="100%" y2="100%"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;/items&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!-- 函数定义&nbsp; --&gt;<br />
&nbsp; &lt;functions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 显示当前时间的函数用法&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property-ref name="report.date"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;!-- 显示当前页码的函数用法 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;function name="PageNumber" class="org.jfree.report.function.PageFunction" deplevel="1"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;!-- 显示总页数的函数用法 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;function name="PageTotal" class="org.jfree.report.function.PageTotalFunction" deplevel="1"/&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;!-- 表达式，次表达式定义一个显示页码格式的用法 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;expression name="pageXofY" class="org.jfree.report.function.TextFormatExpression"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="pattern"&gt;{0}/{1}页&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="field[0]"&gt;PageNumber&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="field[1]"&gt;PageTotal&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/expression&gt;<br />
&nbsp; &lt;/functions&gt;<br />
&lt;/report&gt;<br />
&nbsp;另一种方法我没有用过，以后了解了再补充。<br />
四、输出<br />
定义完JFreeReport对象，就可以进行输出了。下面介绍几种输出方法。<br />
1、通过预览窗口对象输出<br />
该方式只能在Application环境中使用。通过预览窗口，用户可以自行选择打印、排版或生成各种格式的文件，这也是我们在Application中常用的方式。代码示例如下：<br />
PreviewDialog preview = null;&nbsp;&nbsp;&nbsp; //预览窗口对象<br />
&nbsp; try ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将生成的报表放到预览窗口中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview = new PreviewDialog(report);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ReportProcessingException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp; if (preview != null) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview.setDefaultCloseOperation(DISPOSE_ON_CLOSE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置报表起始点及长宽<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview.setLocation(new Point(0, 0));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dimension screen = getToolkit().getScreenSize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int width = (int) (screen.getWidth() - 2 * preview.getLocation().x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int height = (int) (screen.getHeight());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview.setSize(new Dimension(width, height));<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 显示报表预览窗口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview.setVisible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preview.requestFocus();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // preview.addWindowListener(new CloseHandler());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>2、输出HTML文本。<br />
这种方法可以将报表输出为HTML语言形成的文本，这种方式适用于在浏览器中显示报表内容。示例代码如下：<br />
ByteArrayOutputStream bo = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StreamHtmlFilesystem filesystem = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 生成Html<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bo = new ByteArrayOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final HtmlProcessor processor = new HtmlProcessor(report);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processor.setGenerateBodyFragment(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processor.setEncoding ("UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filesystem = new StreamHtmlFilesystem(bo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processor.setFilesystem(filesystem);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processor.processReport();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String htmlCode = new String(bo.toByteArray(), "UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bo.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bo = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filesystem.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filesystem = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(FileNotFoundException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(SecurityException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ReportProcessingException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
3、输出PDF文件<br />
PDF的输出方式跟HTML的差不多，但有一点，JFreeReport本身无法输出中文字符，如果想要输出中文，我没有找到更好的方法，所以更改了JFreeReport包中org.jfree.report.modules.output.support.itext.BaseFontSupport类的源码，将<br />
final BaseFont f = BaseFont.createFont(BaseFont.HELVETICA, stringEncoding, embedded,<br />
false, null, null)中的BaseFont.HELVETICA改为&#8220;STSong-Light&#8221;,另外需要到www.lowagie.com/iText网站下载iText.jar包以支持STSong-Light字体编码，这样，就可以输出中文了。示例代码如下所示：<br />
这里注意，必须将target的字体编码设为&#8220;UniGB-UCS2-H&#8221;而且使用Java1.5进行编译<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDFOutputTarget target = null;<br />
&nbsp;&nbsp; try ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成pdf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fos = new FileOutputStream("PDF.pdf");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = new PDFOutputTarget(fos);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target.configure(report.getReportConfiguration());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target.setFontEncoding("UniGB-UCS2-H");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target.open();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final PageableReportProcessor proc = new PageableReportProcessor(report);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proc.setOutputTarget(target);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proc.processReport();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target.close();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; target = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(FileNotFoundException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(SecurityException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (OutputTargetException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ReportProcessingException e) ...{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>以上就是我对JFreeReport组件的总结，写的不好希望对大家有所<br />
&nbsp;</p>
<p><br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2056738</p>
<img src ="http://www.blogjava.net/keweibo/aggbug/190441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2008-04-02 19:33 <a href="http://www.blogjava.net/keweibo/articles/190441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeReport簡介</title><link>http://www.blogjava.net/keweibo/articles/190440.html</link><dc:creator>KE</dc:creator><author>KE</author><pubDate>Wed, 02 Apr 2008 11:32:00 GMT</pubDate><guid>http://www.blogjava.net/keweibo/articles/190440.html</guid><wfw:comment>http://www.blogjava.net/keweibo/comments/190440.html</wfw:comment><comments>http://www.blogjava.net/keweibo/articles/190440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/keweibo/comments/commentRss/190440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/keweibo/services/trackbacks/190440.html</trackback:ping><description><![CDATA[报表生成一直是企业信息化过程中重要的一环，也是目前比较难于实现的一环，今天作者给大家介绍一种新的报表生成组件――JFreeReport。<br />
JFreeReport是JFreeReport.Org基于LGPL授权协议提供的一组Java包，用于生成各类报表，JFreeReport的数据继续自Swing组件的TableModel<br />
接口，使用基于XML的报表格式定义文件对报表进行格式化。JFreeReport生成的报表可以分页预览、打印，而且支持导出为多种格式的文件<br />
如pdf、Excel、CSV、Html等。更重要的是，JFreeReport不仅支持基于C/S结构的系统，而且支持基于B/S结构的系统中的在线报表显示。<br />
更具体的关于JFreeReport的介绍请大家访问JFreeReport的官方网站JFree.org。<br />
　　<br />
　　1　环境预备<br />
　　1.1　JFreeReport组件<br />
　　<br />
　　请大家到http://prdownloads.sourceforge.net/jfreereport/jfreereport-0.8.4_7.zip?download下载JFreeReport组件，<br />
&nbsp;下载的是一个ZIP文件，然后将ZIP文件解压缩到c:\jfreereport（后面的章节中将使用％jfreereport_home％表示这个目录）目录下。<br />
　　<br />
　　1.2　JFreeReport扩展组件<br />
　　<br />
　　请大家到http://www.jfree.org/jfreereport/jfreereport-ext-0.8.4_7.zip下载JFreeReport扩展组件，他用于支持JFreeReport组件生<br />
&nbsp;成的报表的在线显示。请大载后解压缩到c:\jfreereport-ext目录下（后面的章节中将使用％jfreereport_ext_home％表示这个目录）<br />
　　<br />
　　1.3　Ant工具<br />
　　<br />
　　Apache公司提供的一个基于JAVA的自动化脚本引擎，请大家到http://ant.apache.org/下载ant的可执行文件，关于如何使用ant请大家查<br />
&nbsp;看ant的帮助文档或者http://ant.apache.org/网站上的在线帮助文档。示例中主要是用ant来负责编译java代码。<br />
　　<br />
　　1.4　作者提供的代码<br />
　　<br />
　　为了运行本文中作者提到的例子和相关资源文件，请大家下载作者提供的vivianjDemo.zip文件和中文转换工具gb2unicode.jar。<br />
&nbsp;然后解压缩到％jfreereport_home％\vivianjDemo（后面的章节中将使用％demo _home％表示这个目录）目录下。<br />
　　<br />
　　2　JFreeReport生成报表的基本步骤<br />
　　我们首先演示一个简单的例子，说明使用JFreeReport生成报表的一些必要的步骤。<br />
　　<br />
　　2.1　实例说明<br />
　　<br />
　　在这个例子中，我们将循环生成100条数据放入TableModel中，然后使用JFreeReport组件提供的预览功能在屏幕上显示生成的报表。<br />
　　<br />
　　［注］ 为了简化，这里仅仅是逐条显示数据，不作任何修饰和统计工作，所以也不使用报表格式定义文件。<br />
　　<br />
　　2.2　代码编制<br />
　　<br />
　　整个演示实例（HelloWorld.java）的代码和相关注释如下，假如你执行了1.3中规定的步骤，<br />
&nbsp;你可以在％demo _home％/src/org/vivianj/jfreereport/看到这个文件。<br />
　　<br />
　　/**<br />
　　* HelloWorld.java<br />
　　*/<br />
　　<br />
　　package org.vivianj.jfreereport;<br />
　　<br />
　　import java.awt.Color;<br />
　　import java.awt.event.WindowAdapter;<br />
　　import java.awt.event.WindowEvent;<br />
　　import java.awt.geom.Point2D;<br />
　　import javax.swing.table.DefaultTableModel;<br />
　　import javax.swing.table.TableModel;<br />
　　<br />
　　import org.jfree.report.Boot;<br />
　　import org.jfree.report.ElementAlignment;<br />
　　import org.jfree.report.JFreeReport;<br />
　　import org.jfree.report.ReportProcessingException;<br />
　　import org.jfree.report.elementfactory.TextFieldElementFactory;<br />
　　import org.jfree.report.modules.gui.base.PreviewDialog;<br />
　　import org.jfree.ui.FloatDimension;<br />
　　<br />
　　/**<br />
　　* 使用JFreeReport生成报表的简单例子，用于演示使用JFreeReport生成报表的一些基本步骤<br />
　　*<br />
　　* 本例子中，为了简化操作，报表定义是使用java直接编码<br />
　　*<br />
　　* @ 作者 ： bookman<br />
　　*/<br />
　　public class HelloWorld<br />
　　{<br />
　　/**<br />
　　* 处理窗口关闭事件<br />
　　*/<br />
　　protected static class CloseHandler extends WindowAdapter<br />
　　{<br />
　　public void windowClosing(final WindowEvent event)<br />
　　{<br />
　　System.exit(0);<br />
　　}<br />
　　}<br />
　　<br />
　　/**<br />
　　* 创建和显示简单的报表<br />
　　*/<br />
　　public HelloWorld()<br />
　　{<br />
　　// 获得创建报表需要用到的数据<br />
　　final TableModel data = createData();<br />
　　//获得报表要用到的报表定义内容<br />
　　final JFreeReport report = createReportDefinition();<br />
　　//将报表定义和数据结合<br />
　　report.setData(data);<br />
　　try<br />
　　{<br />
　　//将生成的报表放到预览窗口中<br />
　　final PreviewDialog preview = new PreviewDialog(report);<br />
　　preview.addWindowListener(new CloseHandler());<br />
　　preview.pack();<br />
　　//显示报表预览窗口<br />
　　preview.setVisible(true);<br />
　　}<br />
　　catch (ReportProcessingException e)<br />
　　{<br />
　　System.out.println(e);<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　/**<br />
　　* 创建生成报表需要用到的数据<br />
　　*<br />
　　* @返回一个TableModel实例<br />
　　*/<br />
　　private TableModel createData()<br />
　　{<br />
　　<br />
　　final Object[] columnNames = new String[]{"Column1", "Column2"};<br />
　　final DefaultTableModel result = new DefaultTableModel(columnNames, 100);<br />
　　int rownum = 0;<br />
　　int colnum = 0;<br />
　　for (;rownum &lt; 100 ; rownum++)<br />
　　{<br />
　　result.setValueAt("say Hello " + rownum + "次", rownum, 0);<br />
　　result.setValueAt("say World " + rownum + "次" , rownum, 1);<br />
　　}<br />
　　<br />
　　return result;<br />
　　<br />
　　}<br />
　　<br />
　　/**<br />
　　* 创建一个报表定义<br />
　　*<br />
　　* @返回一个报表定义实例<br />
　　*/<br />
　　private JFreeReport createReportDefinition()<br />
　　{<br />
　　<br />
　　final JFreeReport report = new JFreeReport();<br />
　　report.setName("A Very Simple Report");<br />
　　/**<br />
　　* 定义要显示报表第一列的样式<br />
　　*/<br />
　　TextFieldElementFactory factory = new TextFieldElementFactory();<br />
　　factory.setName("T1");<br />
　　factory.setAbsolutePosition(new Point2D.Float(0, 0));<br />
　　factory.setMinimumSize(new FloatDimension(150, 20));<br />
　　factory.setColor(Color.black);<br />
　　factory.setHorizontalAlignment(ElementAlignment.LEFT);<br />
　　factory.setVerticalAlignment(ElementAlignment.MIDDLE);<br />
　　factory.setNullString("-");<br />
　　factory.setFieldname("Column1");<br />
　　report.getItemBand().addElement(factory.createElement());<br />
　　/**<br />
　　* 定义要显示报表第二列的样式<br />
　　*/<br />
　　factory = new TextFieldElementFactory();<br />
　　factory.setName("T2");<br />
　　factory.setAbsolutePosition(new Point2D.Float(200, 0));<br />
　　factory.setMinimumSize(new FloatDimension(150, 20));<br />
　　factory.setColor(Color.black);<br />
　　factory.setHorizontalAlignment(ElementAlignment.LEFT);<br />
　　factory.setVerticalAlignment(ElementAlignment.MIDDLE);<br />
　　factory.setNullString("-");<br />
　　factory.setFieldname("Column2");<br />
　　report.getItemBand().addElement(factory.createElement());<br />
　　/**<br />
　　* 返回一个报表定义的实例<br />
　　*/<br />
　　return report;<br />
　　<br />
　　}<br />
　　<br />
　　public static void main(final String[] args)<br />
　　{<br />
　　// 初始化JFreeReport<br />
　　Boot.start();<br />
　　<br />
　　//调用演示实例<br />
　　new HelloWorld();<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　2.3　运行例子<br />
　　<br />
　　假如你执行了1.3中规定的步骤，你可以进入命令行界面，然后进入％demo_home％目录下，修改setenv.cmd中的相关设置，<br />
&nbsp;执行serenv.cmd设置环境变量。执行java org.vivianj.jfreereport.HelloWorld查看运行结果。下面这个图片是<br />
&nbsp;作者执行后结果的屏幕截图：<br />
　　<br />
　　大家可以看到，JFreeReport已经自动帮我们实现了分页。上面这个图片显示的是第一页的数据，你可以通过工具栏中的查<br />
&nbsp;看其它页面中的内容。<br />
　　<br />
　　2.4　基本步骤解释<br />
　　<br />
　　使用JFreeReport生成报表通常需要以下三个基本步骤：<br />
　　<br />
　　生成可通过TableModel接口访问的数据，如本例中的createData方法完成的功能<br />
　　生成一个JFreeReport实例，他定义了我们如何格式化显示数据，如本例中的createReportDefinition方法完成的功能<br />
　　将数据和JFreeReport实例连接起来，并且将该JFreeReport实例传给PreviewDialog的一个实例显示给用户<br />
　　<br />
　　3　使用JFreeReport生成复杂报表<br />
　　3.1　报表定义文件<br />
　　<br />
　　报表定义文件是JFreeReport生成复杂报表的重要文件，他就是一个XML文档，主要描述如何使用指定的格式生成复杂的报表，<br />
&nbsp;同时使用报表定义文件也可以在报表格式需要修改时只需要更新该报表定义文件，而不需要修改应用代码。<br />
　　<br />
　　3.1.1　报表定义文件分类<br />
　　<br />
　　JFreeReport中使用了两种基于XML的报表定义文件来保存报表定义信息：简单格式和扩展格式．很明显,简单格式不能够完全<br />
&nbsp;的描述JFreeReport支持的全部报表定义信息,但是他更易于上手使用。而扩展格式则能够对JFreeReport的报表定义提供<br />
&nbsp;完整的支持，但是扩展格式太具体了，不太轻易使用。<br />
　　<br />
　　关于这两种报表定义格式文件所 
<img src ="http://www.blogjava.net/keweibo/aggbug/190440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/keweibo/" target="_blank">KE</a> 2008-04-02 19:32 <a href="http://www.blogjava.net/keweibo/articles/190440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>