报告部分


我们在“入门”一章中讨论了简单报告模板的结构。类似地,JasperReports 将报告模板分为多个部分。部分是报表的一部分,具有指定的高度,可以包含报表对象,例如线条、矩形、图像或文本字段。

报告引擎在报告填充时迭代所提供的报告数据源的虚拟记录。根据每个部分定义的Behave,引擎会在适当的时候呈现每个报告部分。例如,为数据源中的每条记录呈现详细信息部分。发生分页时,将根据需要呈现页眉和页脚部分。

在 JasperReports 中,术语和报表部分也称为报表带。各部分由一个或多个频段组成。这些部分在报告生成时重复填写并准备最终文件。

主要部分

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>

下表总结了每个部分 -

序号 部分和描述
1

标题

此部分仅在报告开头出现一次。

2

页眉

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

3

列标题

此部分出现在生成的文档中每列的开头。如果报表仅定义一列,则列标题和页脚部分将被忽略。

4

组标题

本节由报告组引入(章节)。每次分组表达式更改其值时,组标题部分都会打印在详细信息部分上方。如果定义了多个组,则按组定义的顺序打印组标题。

5

细节

对于报表数据源提供的每一行数据,都会重复此部分。细节部分可以由多个带组成。

6

组页脚

本节由报告组引入(章节)。在分组表达式的值更改之前,组页脚部分打印在详细信息部分下方。始终为数据源中最后一行数据打印组页脚。如果定义了多个组,则按组定义的相反顺序打印组页脚。

7

栏页脚

此部分出现在每列的底部。如果报表的列数为 1,则忽略列标题和页脚部分。

8

页脚

此部分出现在每页的底部。

9

最后一页页脚

此部分取代了报告最后一页上的常规页脚。如果摘要部分也存在,那么这可能不是文档的最后一页。当摘要信息必须显示在最后一页的底部时,此部分有时很有用。

10

概括

此部分仅在报告末尾出现一次。

11

没有数据

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

12

背景

背景部分显示在每个页面上,并且不会溢出到下一页。放置在该部分的元素在页面初始化时进行评估并显示在后台。所有其他页面对象都显示在背景对象之上。此部分对于创建页面水印很有用。

部分、元素和属性关系

下图显示了报表的一部分中的元素和属性关系。

报告部分

部分元素

所有上述报告部分都是可选的。但任何报告模板都至少有一个这样的部分。每个部分都包含一个 < band > 元素作为其唯一的子元素。<band>可以包含零个或多个以下子元素 -

<线>、<矩形>、<椭圆>、<图像>、<静态文本>、<文本字段>、<子报表> 或 <元素组>

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

下表总结了 <reportElement> 的属性-

属性 描述 有效值
X 指定带元素的 x 坐标。 一个整数值,指示元素的 x 坐标(以像素为单位)。该属性是必需的。
y 指定带元素的 y 坐标。 一个整数值,表示元素的 y 坐标(以像素为单位)。该属性是必需的。
宽度 指定带元素的宽度。 指示元素宽度(以像素为单位)的整数值。该属性是必需的。
高度 指定带元素的高度。 指示元素高度(以像素为单位)的整数值。该属性是必需的。
钥匙 带元素的唯一标识符。 唯一的字符串值。
拉伸类型 指定当包含带拉伸时元素如何拉伸

NoStretch(默认) - 元素不会拉伸。

relativeToTallestObject - 元素将拉伸以容纳其组中最高的对象。

relativeToBand - 元素将拉伸以适合带的高度。

仓位类型 指定带拉伸时元素的位置。

浮动- 元素将根据周围元素的大小移动。

FixRelativeToTop (默认) - 元素将保持相对于带顶部的固定位置。

FixRelativeToBottom - 元素将保持相对于带底部的固定位置。

isPrintRepeatedValues 指定是否打印重复值。

true(默认) - 将打印重复的值。

false - 不会打印重复的值。

模式 指定元素的背景模式 不透明、透明
空白时删除行 指定当元素为空白并且同一水平空间中没有其他元素时是否应删除该元素。 真假
isPrintInFirstWholeBand 指定是否必须在整个带区(即未在报表页或列之间划分的带区)中打印元素。 真假
isPrintWhenDetailOverFlows 指定当区域溢出到新页面或新列时是否打印该元素。 真假
组更改时打印 指定当指定的组更改时将打印该元素。 一个字符串值。
前景色 指定元素的前景色。 前面带有 # 字符的十六进制 RGB 值,或以下预定义值之一:黑色、蓝色、青色、darkGray、灰色、绿色、lightGray、品红色、橙色、粉色、红色、黄色、白色。
背景色 指定元素的背景颜色。 与前景色的有效值相同

部分属性

以下是报告部分的属性 -

高度

部分的高度指定该特定部分的高度(以像素为单位),这在整个报告设计中非常重要。

打印 When 表达式

确定是否应打印该部分的布尔表达式。

允许拆分

一个标志,指示当该部分不适合当前页面时是否允许拆分该部分。如果为真,该部分将转移到下一页。请注意,如果该部分不适合下一页,则无论标志的值如何,该部分都将被分割。splitType可以采用以下值 -

  • splitType="Stretch:"分割拉伸的内容。如果该部分在当前页面上延伸(如果可用空间小于声明的高度),则允许添加到原始高度的区域拆分到下一页。

  • splitType="预防:"防止第一次尝试时分割。如果该部分不适合下一页,则拆分通常会发生,因为带拆分预防仅在第一次拆分尝试时有效。

  • splitType=“立即:”立即拆分。该带可以在除其最上面的元素之外的任何地方分裂。

例子

为了演示每个部分,让我们编写报告模板(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 的实例来模拟其中包含一条记录的数据源,但该单条记录中的所有字段均为空。

报告生成

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

导入文件 - baseBuild.xml 取自“环境设置”一章,并且应放置在与 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 窗口将打开,如下面的屏幕所示 -

Jasper 报告部分示例

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