
- JasperReports 教程
- JasperReports - 首頁
- JasperReports - 入門
- JasperReports - 環境設定
- JasperReports - 生命週期
- JasperReports - 設計
- JasperReports - 編譯設計
- JasperReports - 填充
- JasperReports - 檢視和列印
- JasperReports - 匯出
- JasperReports - 引數
- JasperReports - 資料來源
- JasperReports - 欄位
- JasperReports - 表示式
- JasperReports - 變數
- JasperReports - 節
- JasperReports - 分組
- JasperReports - 字型
- JasperReports - Unicode 支援
- JasperReports - 樣式
- JasperReports - 指令碼
- JasperReports - 建立子報表
- JasperReports - 建立圖表
- JasperReports - 交叉表
- JasperReports - 國際化
- JasperReports 資源
- JasperReports - 快速指南
- JasperReports - 有用資源
- JasperReports - 討論
報表部分
我們在章節入門中討論了一個簡單報表模板的結構。類似地,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>
下表總結了每個部分:
序號 | 部分和描述 |
---|---|
1 | 標題 此部分僅在報表開頭出現一次。 |
2 | 頁面頁首 此部分出現在生成文件的每個頁面開頭。 |
3 | 列頁首 此部分出現在生成文件的每列開頭。如果報表僅定義了一列,則列頁首和頁尾部分將被忽略。 |
4 | 組頁首 此部分由報表組引入(章節分組)。每當分組表示式更改其值時,組頁首部分都會列印在詳細部分上方。如果定義了多個組,則組頁首將按照組定義的順序列印。 |
5 | 詳細 此部分針對報表資料來源提供的每一行資料重複。詳細部分可以由多個帶組成。 |
6 | 組頁尾 此部分由報表組引入(章節分組)。組頁尾部分列印在詳細部分下方,在分組表示式的值更改之前。組頁尾始終列印資料來源的最後一行資料。如果定義了多個組,則組頁尾將按照組定義的反向順序列印。 |
7 | 列頁尾 此部分出現在每列底部。如果報表的列數為 1,則列頁首和頁尾部分將被忽略。 |
8 | 頁面頁尾 此部分出現在每個頁面的底部。 |
9 | 最後一頁頁尾 此部分替換報表最後一頁上的常規頁面頁尾。如果也存在摘要部分,則這可能不是文件的最後一頁。當需要在最後一頁底部顯示摘要資訊時,此部分有時很有用。 |
10 | 摘要 此部分僅在報表末尾出現一次。 |
11 | 無資料 當無資料時列印報表屬性設定為無資料部分時,將列印此部分。如果報表模板中定義了<noData>部分,並且資料來源為空,則在填充時只會考慮<noData>部分,其內容將生成報表輸出。 |
12 | 背景 背景部分顯示在每個頁面上,並且不能溢位到下一頁。放置在此部分的元素在頁面初始化時進行評估,並在背景中顯示。所有其他頁面物件都顯示在背景物件之上。此部分可用於建立頁面水印。 |
部分、元素和屬性關係
下圖顯示了報表部分中的元素和屬性關係。

部分元素
所有上述報表部分都是可選的。但任何報表模板都將至少包含一個這樣的部分。這些部分中的每一個都包含一個單一的<band>元素作為其唯一的子元素。<band>可以包含零個或多個以下子元素:
<line>、<rectangle>、<ellipse>、<image>、<staticText>、<textField>、<subReport>或<elementGroup>
這些元素中的每一個都必須包含一個單一的<reportElement>作為其第一個元素(elementGroup 除外)。<reportElement>確定如何為該特定元素佈局資料。與變數和引數不同,報表元素不需要名稱,因為通常您不需要在報表模板中獲取任何單個元素。
下表總結了<reportElement>的屬性:
屬性 | 描述 | 有效值 |
---|---|---|
x | 指定帶元素的 x 座標。 | 表示元素以畫素為單位的 x 座標的整數值。此屬性是必需的。 |
y | 指定帶元素的 y 座標。 | 表示元素以畫素為單位的 y 座標的整數值。此屬性是必需的。 |
width | 指定帶元素的寬度。 | 表示元素以畫素為單位的寬度的整數值。此屬性是必需的。 |
height | 指定帶元素的高度。 | 表示元素以畫素為單位的高度的整數值。此屬性是必需的。 |
key | 帶元素的唯一識別符號。 | 唯一的字串值。 |
stretchType | 指定包含帶拉伸時元素如何拉伸 | NoStretch(預設) - 元素不會拉伸。 RelativeToTallestObject - 元素將拉伸以適應其組中最高的物體。 RelativeToBand - 元素將拉伸以適應帶的高度。 |
positionType | 指定帶拉伸時元素的位置。 | Float - 元素將根據周圍元素的大小移動。 FixRelativeToTop(預設) - 元素將相對於帶的頂部保持固定位置。 FixRelativeToBottom - 元素將相對於帶的底部保持固定位置。 |
isPrintRepeatedValues | 指定是否列印重複值。 | true(預設) - 將列印重複值。 false - 不會列印重複值。 |
mode | 指定元素的背景模式 | Opaque, Transparent |
isRemoveLineWhenBlank | 指定當元素為空且同一水平空間中沒有其他元素時是否應刪除元素。 | true, false |
isPrintInFirstWholeBand | 指定元素是否必須列印在整個帶中,即未在報表頁面或列之間分割的帶。 | true, false |
isPrintWhenDetailOverFlows | 指定當帶溢位到新頁面或列時是否列印元素。 | true, false |
printWhenGroupChanges | 指定當指定的組發生更改時列印元素。 | 字串值。 |
forecolor | 指定元素的前景色。 | 十六進位制 RGB 值(以 # 字元開頭),或以下預定義值之一:black、blue、cyan、darkGray、gray、green、lightGray、magenta、orange、pink、red、yellow、white。 |
backcolor | 指定元素的背景色。 | 與forecolor的有效值相同 |
部分屬性
以下是報表部分的屬性:
高度
部分的高度指定該特定部分以畫素為單位的高度,在整體報表設計中非常重要。
列印時表示式
確定是否應列印部分的布林表示式。
允許拆分
一個標誌,指示是否允許在部分不適合當前頁面時拆分。如果為 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\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> 元素僅在報表有多列時才會顯示。