主要内容参考http://blog.csdn.net/leafxx/archive/2006/03/16/626700.aspx
JasperReports的报表是用XML文件来定义的,约定用jrxml作后缀名。一个典型的jrxml文件包含以下元素:
* <jsperReport> - 根元素
* <title> - 报表的标题,一篇报表里只在开头打印一次
* <pageHeader> - 页眉,报表每页开头打印一次
* <detail> - 报表正文
* <pageFooter> - 页脚,报表每页末尾打印一次
* <band> - 定义报表部件,以上所有元素都包含一个band元素作为他们唯一的子元素
除了root元素,所有的元素都是可选的。这里是一个jrxml文件的例子,它将生成一个显示字符串“你好,世界!”的简单报表。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="structure"> <detail> <band height="20"> <staticText> <reportElement x="180" y="0" width="200" height="20"/> <textElement> <font fontName="宋体" size="12" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/> </textElement> <text><![CDATA[你好,世界!]]></text> </staticText> </band> </detail> </jasperReport>
在这个简单的例子中,我没有写可选项<title>, <pageHeader>还有<pageFooter>。<staticText>元素,顾名思义,在报表上显示静态的文本,就像你所看到的,它包含了一个单独的<text>元素定义将要显示的文本。
jrxml文件需要“编译”成JasperReports规范的二进制格式,可以调用类net.sf.jasperreports.engine.JasperCompileManager的方法compileReport()来实现。这个方法有几种重载的形式,在我们的例子中,我们将用到的是单个字符串为参数的方法。参考JasperReport文档以获得这个方法其他版本的详细信息。
package tutorial; import java.util.HashMap; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; public class Structure { @SuppressWarnings("unchecked") public static void main(String[] args) { JasperReport jasperReport; JasperPrint jasperPrint; try { //编译报表设计 jasperReport = JasperCompileManager .compileReport("reports/structure.jrxml"); //在模板中填充数据 jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), new JREmptyDataSource()); //输出pdf文件 JasperExportManager.exportReportToPdfFile(jasperPrint, "reports/structure.pdf"); } catch (JRException e) { e.printStackTrace(); } } }
一个jrxml文件只需要编译一次,但在这个简单例子中,每次执行程序都会被编译。在报表生成之前,需要用数据来“填充”它,在这里我们调用net.sf.jasperreports.engine.JasperFillManager类里的fillReport()方法。同样的,它也有许多重载的形式,这里我们用到了其中一个具有三个参数的方法,第一个是JasperReport的实例, 第二个是HashMap,它可以包含任何要传递给report的参数,第三个参数对象要实现JRDataSource接口。这个方法的使用在我们的例子里面是:
jasperPrint = JasperFillManager.fillReport(
jasperReport, new HashMap(), new JREmptyDataSource());
因为我们的例子里的report类不需要任何参数,所以传给一个它一个空的HashMap,第三个参数net.sf.jasperreports.engine.JREmptyDataSource是一个实现了JRDataSource接口的简便类,这个基本类不包含任何数据。
The parameters are self-explanatory.
最后,在例子中,我们将报表导出为PDF文件,可以用Adobe Acrobat, XPDF, Evince或其他PDF阅读工具打开。在例子中的代码是:JasperExportManager.exportReportToPdfFile(
jasperPrint, "reports/structure.pdf");