报告部分
我们在入门一章中讨论了简单报告模板的结构。类似地,JasperReports 将报告模板构建为多个部分。部分是具有指定高度的报告部分,可以包含报告对象,如线条、矩形、图像或文本字段。
在报告填充时,报告引擎会遍历提供的报告数据源的虚拟记录。然后,根据每个部分的定义行为,引擎会在适当的时候呈现每个报告部分。例如,为数据源中的每个记录呈现详细信息部分。当出现分页符时,将根据需要呈现页眉和页脚部分。
在 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>
下表总结了每个部分 −
S.NO | 部分和说明 |
---|---|
1 | Title(标题) 此部分仅在报告开头出现一次。 |
2 | Page Header(页眉) 此部分出现在生成的文档中每一页的开头。 |
3 | Column Header(列标题) 此部分出现在生成的文档中每一列的开头。如果报表仅定义了一列,则将忽略列标题和页脚部分。 |
4 | Group Header(组标题) 此部分由报表组引入(章节组)。每次分组表达式更改其值时,组标题部分都会打印在详细信息部分上方。如果定义了多个组,则按组定义的顺序打印组标题。 |
5 | Detail(详细信息) 此部分针对报告数据源提供的每一行数据重复出现。详细信息部分可以由多个带区组成。 |
6 | Group Footer(组页脚) 此部分由报告组引入(章节组)。在分组表达式的值更改之前,组页脚部分打印在详细信息部分下方。组页脚始终针对数据源中的最后一行数据打印。如果定义了多个组,则组页脚将按照组定义的相反顺序打印。 |
7 | Column Footer(列页脚) 此部分出现在每列的底部。如果报告的列数为 1,则将忽略列标题和页脚部分。 |
8 | Page Footer(页脚) 此部分出现在每页的底部。 |
9 | Last Page Footer(最后一页页脚) 此部分替换报告最后一页的常规页脚。如果摘要部分也存在,那么这可能不是文档的最后一页。当摘要信息必须显示在最后一页的底部时,此部分有时很有用。 |
10 | Summary(摘要) 此部分仅在报告末尾出现一次。 |
11 | No Data 当 无数据时打印报告 属性设置为 无数据 部分时,将打印此部分。如果在报告模板中定义了 <noData> 部分,并且数据源为空,则 <noData> 部分将是填充时唯一考虑的部分,其内容将产生报告输出。 |
12 | Background 背景部分显示在每一页上,不能溢出到下一页。放置在此部分上的元素在页面初始化时进行评估,并显示在背景中。所有其他页面对象都显示在背景对象的顶部。此部分对于创建页面水印很有用。 |
部分、元素和属性关系
下图显示了报告部分中的元素和属性关系。
部分元素
上述所有报告部分都是可选的。但任何报告模板都至少有一个这样的部分。这些部分中的每一个都包含一个 <band> 元素作为其唯一子元素。<band>可以包含零个或多个以下子元素 −
<line>、<rectangle>、<ellipse>、<image>、<staticText>、<textField>、<subReport> 或 <elementGroup>
这些元素中的每一个都必须包含一个 <reportElement> 作为其第一个元素(elementGroup 除外)。<reportElement> 决定了该特定元素的数据布局方式。与变量和参数不同,报告元素不需要有名称,因为通常您不需要获取报告模板内的任何单个元素。
下表总结了 <reportElement> 的属性; −
属性 | 描述 | 有效值 |
---|---|---|
x | 指定 band 元素的 x 坐标。 | 一个整数值,以像素为单位指示元素的 x 坐标。此属性是必需的。 |
y | 指定 band 元素的 y 坐标。 | 一个整数值,以像素为单位指示元素的 y 坐标。此属性是必需的。 |
width | 指定 band 元素的宽度。 | 一个整数值,以像素为单位指示元素的宽度。此属性是必需的。 |
height | 指定带区元素的高度。 | 一个整数值,以像素为单位表示元素高度。此属性是必需的。 |
key | band 元素的唯一标识符。 | 唯一的字符串值。 |
stretchType | 指定当包含的 band 拉伸时元素如何拉伸 | NoStretch(默认) − 元素不会拉伸。 RelativeToTallestObject − 元素将拉伸以容纳其组中最高的对象。 RelativeToBand − 元素将拉伸以适合 band 的高度。 |
positionType | 指定当 band 拉伸时元素的位置。 | Float −元素将根据周围元素的大小移动。 FixRelativeToTop(默认) − 元素将保持相对于带区顶部的固定位置。 FixRelativeToBottom − 元素将保持相对于带区底部的固定位置。 |
isPrintRepeatedValues | 指定是否打印重复的值。 | true(默认) − 将打印重复的值。 false − 将不打印重复的值。 |
mode | 指定元素的背景模式 | 不透明,透明 |
isRemoveLineWhenBlank | 指定当元素为空白且同一水平空间中没有其他元素时是否应删除该元素。 | true, false |
isPrintInFirstWholeBand | 指定是否必须在整个带区中打印元素,即未在报告页面或列之间划分的带区。 | true, false |
isPrintWhenDetailOverFlows | 指定当带区溢出到新页面或列时是否打印该元素。 | true, false |
printWhenGroupChanges | 指定当指定的组发生更改时打印该元素。 | 字符串值。 |
forecolor | 指定元素的前景色。 | 以 # 字符开头的十六进制 RGB 值,或以下预定义值之一:黑色、蓝色、青色、深灰色、灰色、绿色、浅灰色、洋红色、橙色、粉红色、红色、黄色、白色。 |
backcolor | 指定元素的背景色。 | 与 前景色 的有效值相同 |
部分属性
以下是报告部分的属性 −
高度
部分高度指定该特定部分的高度(以像素为单位),这在整个报告设计中非常重要。
打印时表达式
确定是否应打印部分的布尔表达式。
允许拆分
一个标志,指示当部分不适合当前页面时是否允许拆分。如果为真,则部分将转移到下一页。请注意,如果部分不适合下一页,则无论标志的值如何,部分都将被拆分。splitType 可以采用以下值 −
splitType="Stretch:" 拆分拉伸的内容。如果该部分在当前页面上延伸(如果可用空间小于声明的高度),则允许将添加到原始高度的区域拆分到下一页。
splitType="Prevent:" 第一次尝试时阻止拆分。如果该部分不适合下一页,则正常进行拆分,因为带拆分预防仅在第一次拆分尝试时有效。
splitType="Immediate:" 立即拆分。允许带在除其最顶层元素之外的任何地方拆分。
示例
为了演示每个部分,让我们编写报告模板(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 窗口打开,如下面的屏幕所示 −
在这里,我们可以看到每个部分都打印了一段文本。需要注意的是,由于 JRXML 包含 <lastPageFooter> 元素,它将显示在报告的最后一页,而不是显示的 <pageFooter> 元素。如果报告有多个列,则 <columnHeader> 和 <columnFooter> 元素将仅显示在报告上。