零基础学Struts
上QQ阅读APP看书,第一时间看更新

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显示报表