我们在使用入门一章中讨论了简单报告模板的结构.在类似的行上,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 | 标题 本节内容只在报告开头出现一次. |
2 | 页面标题 此部分显示在生成文档中每页的开头. |
3 | 列标题 此部分显示在生成的文档中每列的开头.如果报告只定义了一列,则忽略列标题和页脚部分. |
4 | 群组标题 此部分由报告组引入(章组).每次分组表达式更改其值时,组标题部分将打印在详细信息部分上方.如果定义了多个组,则按组定义的顺序打印组标题. |
5 | 明细 对报告提供的每一行数据重复此部分数据源.细节部分可以由多个波段组成. |
6 | 组页脚 本节由报告组引入(章节组).在分组表达式的值更改之前,组页脚部分将打印在详细信息部分下方.始终为数据源中的最后一行数据打印组页脚.如果定义了多个组,则按组定义的相反顺序打印组页脚. |
7 | 列页脚 此部分显示在每列的底部.如果报告的列数为1,则忽略列标题和页脚部分. |
8 | 页脚 此部分显示在每页的底部. |
9 | 最后一页页脚 此部分替换报告最后一页上的常规页脚.如果还有摘要部分,那么这可能不是文档的最后一页.当摘要信息必须显示在最后一页的底部时,此部分有时很有用. |
10 | 摘要 此部分仅在报告末尾出现一次. |
11 | 无数据 当无数据打印报告属性设置为无数据部分时,将打印此部分.如果< noData> section在报告模板中定义,如果数据源为空,则< noData>该部分将是唯一一个在填充时考虑的部分,其内容将产生报告输出. |
12 | 背景 背景部分显示在每个页面上,不能溢出到下一个页面页.放置在此部分的元素将在页面初始化时进行评估,并在后台显示.所有其他页面对象都显示在背景对象的顶部.此部分对于创建页面水印很有用. |
下图显示了报告部分中的元素和属性关系.
所有上述报告部分都是可选的.但任何报告模板都至少有一个这样的部分.这些部分中的每一部分包含单个< 带>元素作为其唯一的子元素. A< band >可以包含零个或多个以下子元素 :
< line>,< rectangle>,< ellipse>,< image>,< staticText>, < textField>,< subReport>或< elementGroup>
每个元素都必须包含一个< reportElement >作为它的第一个元素(除了elementGroup). A< reportElement >确定如何为该特定元素布置数据.与变量和参数不同,报表元素不需要具有名称,因为通常您不需要在报表模板中获取任何单个元素.
下表总结了<的属性; reportElement > :
属性 | 描述 | 有效值 |
---|---|---|
x | 指定band元素的x坐标. | 一个整数值,表示元素的x坐标(以像素为单位).此属性是必需的. |
y | 指定乐队的y坐标元素. | 一个整数值,表示元素的y坐标(以像素为单位).此属性是必需的. |
width | 指定band元素的宽度. | 一个整数值,表示元素宽度(以像素为单位).此属性是必需的. |
height | 指定band元素的高度. | 一个整数值,表示元素高度(以像素为单位).此属性是必需的. |
key | band元素的唯一标识符. | 一个唯一的字符串值. |
stretchType | 指定当包含的条带伸展时元素如何伸展 | NoStretch(默认) : 该元素不会拉伸. RelativeToTallestObject : 元素将伸展以适应其组中最高的对象. RelativeToBand : 元素将伸展以适应乐队的高度. |
positionType | 指定乐队伸展时元素的位置. | Float : 该元素将根据周围元素的大小移动. FixRelativeToTop(默认) : 该元素将保持相对于乐队顶部的固定位置. FixRelativeToBottom : 元素将保持相对于乐队底部的固定位置. |
isPrintRepeatedValues | 指定是否打印重复值. | true(默认值) : 将打印重复的值. false : 不会打印重复的值. |
mode | 指定元素的背景模式 | 不透明,透明 |
isRemoveLineWhenBlank | 指定当元素为空并且同一水平空间中没有其他元素时是否应删除该元素. | true,false |
isPrintInFirstWholeBand | 指定是否必须在整个乐队中打印元素,即乐队不在报告页面或列之间划分. | true,false |
isPrintWhenDetailOverFlows | 指定当波段溢出到新页面或列时是否打印元素. | true,false |
printWhenGroupChanges | 指定在指定的组更改时打印元素. | 字符串值. |
forecolor | 指定元素的前景色. | 十六进制RGB值以#字符开头,或以下预定义值之一:黑色,蓝色,青色,深灰色,灰色,绿色,浅灰色,品红色,橙色,粉红色,红色,黄色,白色. |
backcolor | 指定元素的背景颜色. | 与 forecolor的有效值相同 |
以下是报告部分的属性 :
该部分的高度指定该部分的高度(以像素为单位)特定部分,在整个报表设计中非常重要.
一个布尔表达式,用于确定是否应打印该部分.
一个标志,指示当我可以拆分该部分时t不适合当前页面.如果为true,则该部分将转移到下一页.请注意,如果该部分不适合下一页,则无论标志的值如何,该部分都将被拆分. 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\it352
package com.it1352; 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.it1352.JasperReportFill (viewFullReport是默认目标),如下所示 :
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.IT屋.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.IT屋.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
由于上述c ompilation,一个JasperViewer窗口打开,如下面的屏幕 :
在这里,我们可以看到每个部分都打印了一个文本.需要注意的是,由于JRXML包含< lastPageFooter>元素,它将显示在报告的最后一页而不是< pageFooter>正在显示的元素. < columnHeader>和< columnFooter>元素只会在报表上显示,如果它有多列.