12.1 初涉JasperReports
12.1.1 JasperReports简介
本章来推荐一款非常好的报表生成工具JasperReports。和JFreeChart一样,JasperReports同样是开源项目,可以免费使用。并且该项目完全由Java编写,使用它可以在Java桌面程序或者Java Web应用中生成报表。
JasperReports功能是非常强大的,而且其非常容易上手。只用给出一份XML格式的报表设计文件,对其进行编译、填充、导出,就可以生成多种格式的报表文件,包括PDF、HTML、Excel、XLS等。相比传统的只能生成HTML文档或其他单一格式文档的报表生成工具,JasperReports显得非常强大。
通过Struts 2提供的JasperReports插件,可以非常方便和简单地通过JasperReports生成报表。
12.1.2 下载并安装JasperReports和iReport
首先登录JasperReports的官方站点http://www.jasperforge.org,下载JasperReports和iReport,如图12.1所示。
Ireport是可以用来可视化的设计报表设计文件,借助iReport可以非常方便和快捷地设计出精美的报表。
JasperReports和iReport的最新版本为2.0.5,下载其压缩包。解压缩其中的“jasperreports-2.0.5-project.zip”文件,如图12.2所示。
“jasperreports-2.0.5-project.zip”文件中包含如下文件及目录。
❑ src:该文件夹用来存放JasperReports项目的源代码。
❑ lib:该文件夹用来存放JasperReports项目的编译和运行所需的第三方JAR文件。
❑ docs:该文件夹用来存放JasperReports的说明文档。
❑ dist:该文件夹用来存放JasperReports项目的JAR文件以及其API文档。
❑ demo:该文件夹用来存放JasperReports项目的演示文件。
❑ build:该文件夹用来存放JasperReports项目编译后的class文件。
图12.1 JasperReports的官方站点
图12.2 “jasperreports-2.0.5-project.zip”文件结构
安装JasperReports非常简单,如果是创建Java应用程序,则只需将dist目录下的“jasperreports-2.0.5.jar”添加到classpath下或者使用Eclipse导入JAR。如果是开发Web应用,则只需将lib目录下的“jasperreports-2.0.5.jar”复制到Web项目的WEB-INF\lib目录下。解压缩“iReport-2.0.5.zip”文件,如图12.3所示。
图12.3 “iReport-2.0.5.zip”文件结构
iReport是和Office中的Word类似的编辑工具。而且还是一款绿色软件,无需安装,直接双击其中的iReport.exe就可以将其打开。
12.1.3 设计报表
下面来创建一份报表设计文档“myFirst.jrxml”,该文档中包含大量的JasperReports标签,标签非常之多,用户没必要也不可能去一一记住,代码如下所示。
<? xml version="1.0" encoding="UTF-8" ? > <! -- Created with iReport - A designer for JasperReports --> <! DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="myFirst" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535" columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false"> <property name="ireport.scriptlethandling" value="0" /> <property name="ireport.encoding" value="UTF-8" /> <import value="java.util.*" /> <import value="net.sf.jasperreports.engine.*" /> <import value="net.sf.jasperreports.engine.data.*" /> <background> <band height="0" isSplitAllowed="true" > </band> </background> <title> <band height="50" isSplitAllowed="true" > <staticText> <reportElement x="162" y="4" width="232" height="42" key="staticText-1"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size= "24" isBold="true" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[XXX企业人员报表]]></text> </staticText> </band> </title> <pageHeader> <band height="50" isSplitAllowed="true" > </band> </pageHeader> <columnHeader> <band height="30" isSplitAllowed="true" > </band> </columnHeader> <detail> <band height="286" isSplitAllowed="true" > <staticText> <reportElement x="18" y="18" width="70" height="34" key="staticText-2"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size="18" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[张三]]></text> </staticText> <staticText> <reportElement x="18" y="63" width="70" height="34" key="staticText-3"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size= "18" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[李四]]></text> </staticText> <staticText> <reportElement x="18" y="109" width="70" height="34" key="staticText-4"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size= "18" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[王五]]></text> </staticText> <staticText> <reportElement x="116" y="18" width="70" height="34" key="staticText-5"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size= "18" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[男]]></text> </staticText> <staticText> <reportElement x="116" y="63" width="70" height="34" key="staticText-6"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size= "18" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[男]]></text> </staticText> <staticText> <reportElement x="116" y="109" width="70" height="34" key="staticText-7"/> <box></box> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="宋体" pdfFontName="STSong-Light" size= "18" pdfEncoding ="UniGB-UCS2-H"/> </textElement> <text><! [CDATA[男]]></text> </staticText> </band> </detail> <columnFooter> <band height="30" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> <band height="50" isSplitAllowed="true" > </band> </pageFooter> <lastPageFooter> <band height="50" isSplitAllowed="true" > </band> </lastPageFooter> <summary> <band height="50" isSplitAllowed="true" > </band> </summary> </jasperReport>
从上面的代码可以看出,编写这么多的代码非常困难。不过后面会介绍如何通过iReport来设计该报表设计文件,到时候就简单多了。
要显示报表必须经过以下流程。
12.1.4 显示报表
❑ 使用JasperCompileManager类编译报表设计文件,并生成jasper文件后缀名的报表文件。
❑ 使用JasperFillManager填充编译后的报表文件,并生成jrprint后缀名的文件。
❑ 使用JasperExportManager将jrprint文件导出成各种格式报表文件,或直接使用JRViewer显示报表。通过该流程编写显示报表程序,代码如下所示。
import javax.swing.JFrame; import net.sf.jasperreports.engine.JREmptyDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.view.JRViewer; public class TestmyFirst { public static void main(String[] args) throws JRException { //编译myFirst.jrxml设计文件,生成myFirst.jasper报表文件 JasperCompileManager.compileReportToFile("myFirst.jrxml", "myFirst.jasper"); //填充数据,用来负责填充数据源查询结果和参数等 //因为该项目并没有使用数据源,所以填充空数据源JREmptyDataSource JasperFillManager.fillReportToFile("myFirst.jasper", null, new JREmptyDataSource()); //使用JRViewer来查看显示报表 JRViewer jr = new JRViewer("myFirst.jrprint", false); JFrame frame = new JFrame("显示报表"); frame.add(jr); frame.pack(); frame.setVisible(true); } }
运行该Java程序,通过JRViewer显示报表,如图12.4所示。
图12.4 通过JRViewer显示报表