Jasper Reports 简明教程

Report Sections

我们在第 Getting Started 章讨论了一个简单报表模板的结构。JasperReports 根据类似的方法,将报表模板构建为多个部分。部分是具有指定高度的报表部分,可包含报表对象,如线条、矩形、图像或文本字段。

报表引擎在报表填充时遍历所提供的报表数据源的虚拟记录。然后,根据每个部分定义的行为,引擎在适当的时候呈现每个报表部分。例如,针对数据源中的每个记录呈现详细信息部分。发生分页时,按需呈现页眉和页脚部分。

在 JasperReports 中,术语和报表部分也称为 report bands 。部分由一个或多个波段组成。这些部分在报表生成时重复填充,并准备最终的文档。

Main Sections

JasperReports 中的报表模板包含以下主要部分:−

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

下表总结了各个部分 −

S.NO

Section and Description

1

Title 此部分仅出现在报表的开头一次。

2

Page Header 此部分出现在生成文档中每页的开头。

3

Column Header 此部分出现在生成文档中每列的开头。如果报表仅定义一列,则会忽略列头和列脚部分。

4

Group Header 此部分由报表组(第 Groups 章)引入。每次分组表达式更改其值时,分组头部分都会打印在详细信息部分上方。如果定义了多个组,则会按照组定义的顺序打印组头。

5

Detail 此部分会针对报表数据源提供的每行数据重复。详细信息部分可以由多个波段组成。

6

Group Footer 本节由报表组(章节 Groups )引入。当分组表达式的值改变前,组页脚节打印在明细节下方。组页脚始终打印在数据源中的最后一行数据中。如果定义了多个组,则按相反的组定义顺序打印组页脚。

7

Column Footer 本节显示在每列底部。如果报表的列数为 1,则将忽略列头和页脚节。

8

Page Footer 本节显示在每页底部。

9

Last Page Footer 本节在报告的最后一页替换常规的页脚。如果摘要节也存在,则这可能不是文档的最后一页。当摘要信息必须显示在最后一页的底部时,本节有时很有用。

10

Summary 本节仅在报告的末尾出现一次。

11

No Data 当“没有数据打印”报表属性设置为“无数据节”时,将打印本节。如果在报表模板中定义了 <noData> 节,并且数据源为空,则 <noData> 节将是填充时唯一考虑的节,其内容将生成报表输出。

12

Background 背景部分显示在每一页上,且不能溢出至下一页。放置在本节上的元素在页面初始化时间进行评估,并在背景中显示。所有其他页面对象都会显示在背景对象之上。本节对于创建页面水印而言非常有用。

Section, Elements and Attribute Relation

下图显示报表节中元素和属性之间的关系。

report sections

Section Elements

上述所有报表节都是可选的。但是,任何报表模板至少都有一个此类节。每个此类节都包含一个单一的 <*band*> 元素作为其唯一子元素。<*band*> 可以包含零个或多个以下子元素 -

<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> 或 <elementGroup>

除了元素组外,每个此类元素都必须包含一个单一的 <*reportElement*> 作为其第一个元素。<*reportElement*> 确定为该特定元素布局数据的方式。与变量和参数不同,报表元素不需要具有名称,因为通常无需在报表模板中获取任何单个元素。

下表汇总了 <*reportElement*> 的属性 -

Attribute

Description

Valid Values

x

指定波段元素的 x 坐标。

一个整数,表示元素的像素 x 坐标。该属性为必需属性。

y

指定波段元素的 y 坐标。

一个整数,表示元素的像素 y 坐标。该属性为必需属性。

width

指定波段元素的宽度。

一个整数,表示元素的像素宽度。该属性为必需属性。

height

指定波段元素的高度。

一个表示元素高度的整型值(像素)。此属性是必需的。

key

条状元素的唯一标识符。

A unique string value.

stretchType

指定当包含条状元素的条状元素拉伸时,该元素如何拉伸

NoStretch (default) - 该元素不会拉伸。 RelativeToTallestObject - 该元素将拉伸以适合其组中最高的对象。 RelativeToBand - 该元素将拉伸以适合条状元素的高度。

positionType

指定当条状元素拉伸时,元素的位置。

Float - 该元素将根据周围元素的大小移动。 FixRelativeToTop (default) - 该元素将保持相对于条状元素顶部处于固定位置。 FixRelativeToBottom - 该元素将保持相对于条状元素底部处于固定位置。

isPrintRepeatedValues

指定是否打印重复值。

true (default) - 将打印重复值。 false - 将不打印重复值。

mode

指定元素的背景模式

Opaque, Transparent

isRemoveLineWhenBlank

指定当元素为空并且在同一水平空间中没有其他元素时,是否应删除该元素。

true, false

isPrintInFirstWholeBand

指定是否必须在整个条状元素中打印该元素,即不会在报表页或栏之间分割的条状元素。

true, false

isPrintWhenDetailOverFlows

指定当条状元素溢出到新页或新栏时是否打印该元素。

true, false

printWhenGroupChanges

指定当指定组更改时将打印该元素。

A string value.

forecolor

指定元素的前景色。

十六进制 RGB 值(前面有 # 字符),或以下预定义值之一:黑色、蓝色、青色、深灰色、灰色、绿色、浅灰色、紫色、橙色、粉红色、红色、黄色、白色。

backcolor

指定元素的背景色。

与前景色有效值相同

Section Attributes

下面是报表部分的属性 -

Height

指定部分的高度(像素)对于特定部分非常重要,在整体报表设计中非常重要。

Print When Expression

布尔表达式,用于确定是否打印节。

Split Allowed

用于指示是否允许节在当前页无法容纳时拆分。如果为 true,则将节转移到下一页。请注意,如果节不适应下一页,则无论标志值如何,都会拆分节。splitType 可采用以下值:

  1. splitType=“Stretch:”拆分拉伸内容。如果节在当前页上拉伸(如果可用空间小于已声明的高度),则将添加到原始高度的区域允许拆分为下一页。

  2. splitType=“Prevent:”阻止在首次尝试时拆分。如果节不适应下一页,则拆分正常进行,因为分隔带拆分预防仅在首次拆分尝试时有效。

  3. splitType=“Immediate:”立即拆分。允许在除了其最顶层元素上方任何位置拆分分隔带。

Example

为了演示每个节,让我们编写报表模板(jasper_report_template.jrxml)。将此文件保存到 C:\tools\jasperreports-5.0.1\test 目录。在此文件中,我们在每个节中显示一个文本(我们上面讨论)。文件内容如下:

<?xml version = "1.0" encoding = "UTF-8"?>

<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
   http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
   name = "jasper_report_template" pageWidth = "300" pageHeight = "300"
   columnWidth = "300" leftMargin = "0" rightMargin = "0"
   topMargin = "0" bottomMargin = "0" >

   <title>
      <band height = "50">

         <textField>
            <reportElement x = "100" y = "16" width = "100" height = "20"/>
            <textElement/>

            <textFieldExpression>
               <![CDATA["Title"]]>
            </textFieldExpression>

         </textField>

      </band>
   </title>

   <pageHeader>
      <band height = "40">

         <textField>
            <reportElement  mode = "Opaque" x = "100" y = "10"
               width = "90" height = "20"/>

            <textElement>
               <font isBold = "true"/>
            </textElement>

            <textFieldExpression>
               <![CDATA["Page Header"]]>
            </textFieldExpression>
         </textField>

      </band>
   </pageHeader>

   <columnHeader>
      <band height = "40">

         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>

            <textElement>
               <font isItalic = "true"/>
            </textElement>

            <textFieldExpression>
               <![CDATA["Column Header"]]>
            </textFieldExpression>
         </textField>

      </band>
   </columnHeader>

   <detail>
      <band height ="40">

         <textField>
            <reportElement mode = "Opaque" x = "100" y = "10"
               width = "90" height = "20" backcolor = "#99CCFF"/>
            <textElement/>

            <textFieldExpression>
               <![CDATA["Report Details"]]>
            </textFieldExpression>
         </textField>

      </band>
   </detail>

   <columnFooter>
      <band height = "40">

         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>

            <textFieldExpression>
               <![CDATA["Column Footer"]]>
            </textFieldExpression>
         </textField>

      </band>
   </columnFooter>

   <pageFooter>
      <band height = "40">

         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>

            <textFieldExpression>
               <![CDATA["Page Footer"]]>
            </textFieldExpression>
         </textField>

      </band>
   </pageFooter>

   <lastPageFooter>
      <band height = "40">

         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>

            <textFieldExpression>
               <![CDATA["Last Page Footer"]]>
            </textFieldExpression>
         </textField>

      </band>
   </lastPageFooter>

   <summary>
      <band height = "40">

         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>

            <textFieldExpression>
               <![CDATA["Summary"]]>
            </textFieldExpression>
         </textField>

      </band>
   </summary>

</jasperReport>

填充和生成报表的 Java 代码如下。让我们将此文件 JasperReportFill.java 保存到 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint 目录。

package com.tutorialspoint;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFill {
   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
         "jasper_report_template.jasper";

      try {
         JasperFillManager.fillReportToFile(sourceFileName, null,
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

在此,我们在填充报表时使用 JREmptyDataSource 的一个实例来模拟具有一个记录的数据源,但此单个记录中的所有字段均为 null。

Report Generation

我们将使用常规的 ANT 构建过程编译并执行以上文件。文件 build.xml(保存在 C:\tools\jasperreports-5.0.1\test 目录下)的内容如下。

导入文件 - baseBuild.xml 从第 Environment Setup 章中获取,并应放置在与 build.xml 相同的目录中。

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview
      the report stored in the .JRprint file.">

      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>

   </target>

   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">

      <taskdef name = "jrc"
         classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath" />
      </taskdef>

      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>

   </target>

</project>

接下来,让我们打开命令行窗口并转到放置 build.xml 的目录。最后,执行以下命令 ant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport 是默认目标) -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defau
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFac
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnviro
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnviro
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds

以上编译的结果是在屏幕下方打开一个 JasperViewer 窗口−

report sections example

在这里,我们可以在每个节中看到打印了一个文本。需要注意的是,由于 JRXML 包含一个 <lastPageFooter> 元素,它将显示在报表的最后一页,而不是显示 <pageFooter> 元素。如果报表有多个列,则只会在报表上显示 <columnHeader> 和 <columnFooter> 元素。