我們將在本章開始,一個簡單的報表模板的結構看。依樣畫葫蘆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>
下表總結了每個部分:
Section | 描述 |
---|---|
Title | 本節中只出現一次在報表的開頭。 |
Page Header | 這部分出現在每一頁的開頭生成的文件中。 |
Column Header | 這部分顯示在生成的文件中的每一列的開頭。如果報表只有一個定義列,那麼列標題和註腳部分被忽略。 |
Group Header | 這部分是由一個報告組(組章)引入。每次分組表示式改變其值,組頁首部分上面印的細節部分。在情況下,如果超過一個組被定義,組頁首列印在組定義的順序。 |
Detail | 這部分是重複的報表的資料源提供的資料的每一行。細節部分可以由多個頻段。 |
Group Footer | 這部分是由一個報告組(組章)引入。該組頁尾節印下的分組表示式的值更改前的細節部分。組頁尾始終列印在資料源的資料的最後一行。在情況下,如果超過一個組被定義,組頁尾列印在組定義的順序相反。 |
Column Footer | 本節將出現在每一列的底部。如果報告的列數為1,則列標題和註腳部分被忽略。 |
Page Footer | 本節出現在每個頁面的底部。 |
Last Page Footer | 這部分取代了報表的最後一頁上的常規頁頁尾。在情況下,摘要部分也存在,那麼這可能不是該檔案的最後一頁。這部分有時是有用的,當匯總資訊具有在最後一頁的底部顯示。 |
Summary | 本節中只出現一次在報告的末尾。 |
No Data | 這部分被列印時,當無資料列印報表屬性設定為無資料段。如果<noData>部在報告模板中定義,並且如果資料源是空的,那麼<noData>部分將是唯一一個在填充時考慮,其含量將產生報表輸出。 |
Background | 背景部分會顯示每一頁上,並不能溢位到下一個頁面。放在這一部分的元素在頁面初始化的時候求值,並顯示在背景中。所有其他的頁面物件被顯示在背景上物件的頂部。這部分是用於建立頁面水印有用。 |
下圖顯示的元素和屬性在報表中的部分關係。
所有上述報表部分都是可選的。但任何報表模板將至少有一個這樣的部分。每一節都包含一個單一的<band>元素作為其唯一的子元素。一個<band>可以包含零個或多個下列子元素:
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport>, or <elementGroup>這些元素都必須包含一個<reportElement>作為其第一個元素(除了elementGroup)。一個<reportElement>決定了資料是如何奠定了該特定元素。與變數和引數,不要求報表內容有一個名字,因為通常不需要獲得一個報表模板內的任何單個元素。
下表總結了<reportElement>屬性:
屬性 | 描述 | 有效值 |
---|---|---|
x | 指定頻帶元件的x坐標。 | 一個整數值,表示以畫素為單位的元素的x坐標。此屬性是必需的。 |
y | 指定頻帶元件的y坐標。 | 一個整數值,表示在y以畫素為元素的坐標。此屬性是必需的。 |
width | 指定頻帶元件的寬度。 | 一個整數值,表示該元素的寬度以畫素為單位。此屬性是必需的。 |
height | 指定頻帶元件的高度。 | 一個整數值,表示以畫素為元素的高度。此屬性是必需的。 |
key | 帶元素的唯一識別符號。 | 唯一字串值。 |
stretchType | 指定包含帶延伸當元素如何延伸 |
NoStretch (default): 該元素不會延長。 RelativeToTallestObject: 該元素將伸展以適應它的組的最高的物件。 RelativeToBand: 該元素將延伸到適合帶的高度。 |
positionType | 指定當頻帶延伸元素的位置。 |
Float: 元素將取決於周圍元件的尺寸移動。 FixRelativeToTop (default): 該元素將保持一個固定的位置相對於帶的頂部。 FixRelativeToBottom: 該元素將保持一個固定的位置相對於帶的底部。 |
isPrintRepeatedValues | 如果指定的值重複列印。 |
true (default): 重複的值將被列印出來。 false: 重複的值將不被列印出來。 |
mode | 指定元素的背景模式 | 不透明的,透明的 |
isRemoveLineWhenBlank | 如果指定了當它是空白,並有在相同的水平空間沒有其他元素的元素應被刪除。 | true, false |
isPrintInFirstWholeBand | 如果指定的元素必須列印在整個頻段,也就是說,未被報表的頁面或列之間分割的波段。 | true, false |
isPrintWhenDetailOverFlows | 指定是否當頻帶溢位到新頁或列中的元素將被列印出來。 | true, false |
printWhenGroupChanges | 指定在指定的組改變元素將被列印。 | string值 |
forecolor | 指定元素的前景色。 | 無論前面加上#字元,或以下預定義值中的一個十六進位制RGB值:black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, yellow, white. |
backcolor | 指定元素的背景顏色。 | 同樣作為有效值的前景色 |
以下是報表的部分屬性:
該部分的高度指定高度,該特定部分的畫素,是非常重要的在整體報表設計。
布林表示式,確定該部分是否應列印或不列印。
一個標誌,指示該部分是否允許分裂時,它不適合在當前頁面上。如果為true,該部分將被轉移到下一個頁面。注意,如果一節不適合下頁上,那麼將會考慮該標誌的值的拆分。 splitType可以利用以下值:
splitType="Stretch" : 拆分拉伸內容。如果該部分在當前頁上延伸(如果可用空間小於宣高度),這是新增到原始高度的區域是否允許分割到下頁
splitType="Prevent" : 避免在第一次嘗試分割。如果部分不適合在下一頁中,分割通常發生,預防頻帶分割是有效的只有在第一次分割嘗試。
splitType="Immediate" : 立即繪製。該頻段允許的任何地方,除了分割高於其最頂端的元素。
為演示開始每個部分讓我們編寫報表模板(jasper_report_template.jrxml)。將此檔案儲存到C: oolsjasperreports-5.0.1 est目錄。在這個檔案中,我們將顯示在每個部分的文字(上面所討論的)。該檔案的內容如下所述:
<?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: oolsjasperreports-5.0.1 estsrccomyiibai 目錄.
package com.yiibai; 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的欄位。
將編譯和執行使用常規Ant構建過程上面的檔案build.xml檔案中的內容(根據目錄儲存:C: oolsjasperreports-5.0.1 est)情況如下。(saved under directory C: oolsjasperreports-5.0.1 est) 如下.
<?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.yiibai.JasperReportFill(viewFullReport是預設的目標),如下所示:
C: oolsjasperreports-5.0.1 est>ant -Dmain-class=com.yiibai.JasperReportFill Buildfile: C: oolsjasperreports-5.0.1 estuild.xml clean-sample: [delete] Deleting directory C: oolsjasperreports-5.0.1 estclasses [delete] Deleting: C: oolsjasperreports-5.0.1 estjasper_report_template.jasper [delete] Deleting: C: oolsjasperreports-5.0.1 estjasper_report_template.jrprint compile: [mkdir] Created dir: C: oolsjasperreports-5.0.1 estclasses [javac] C: oolsjasperreports-5.0.1 estaseBuild.xml:28: warning: 'includeantruntime' was not set, defau [javac] Compiling 1 source file to C: oolsjasperreports-5.0.1 estclasses 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.htmll#noconfig for more info. [jrc] File : C: oolsjasperreports-5.0.1 estjasper_report_template.jrxml ... OK. run: [echo] Runnin class : com.yiibai.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>元素將只顯示在報告中。