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>

下表總結了每個部分:

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 背景部分會顯示每一頁上,並不能溢位到下一個頁面。放在這一部分的元素在頁面初始化的時候求值,並顯示在背景中。所有其他的頁面物件被顯示在背景上物件的頂部。這部分是用於建立頁面水印有用。

部分,元素和屬性的關係

下圖顯示的元素和屬性在報表中的部分關係。

Report Sections

section元素

所有上述報表部分都是可選的。但任何報表模板將至少有一個這樣的部分。每一節都包含一個單一的<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 指定元素的背景顏色。 同樣作為有效值的前景色

段屬性

以下是報表的部分屬性:

高度

該部分的高度指定高度,該特定部分的畫素,是非常重要的在整體報表設計。

列印當表示式

布林表示式,確定該部分是否應列印或不列印。

SPLIT ALLOWED

一個標誌,指示該部分是否允許分裂時,它不適合在當前頁面上。如果為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視窗開啟如下面的螢幕:

Jasper Report Viewer

在這裡,我們可以在每個文字被列印的部分看到。但應當注意的是,作為JRXML包含<lastPageFooter>元件,它將被顯示在報表,而不是所顯示的<pageFooter>元素的最後一頁。如果有多個列的<columnHeader>和<columnFooter>元素將只顯示在報告中。