報表部分



我們在章節入門中討論了一個簡單報表模板的結構。類似地,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

背景

背景部分顯示在每個頁面上,並且不能溢位到下一頁。放置在此部分的元素在頁面初始化時進行評估,並在背景中顯示。所有其他頁面物件都顯示在背景物件之上。此部分可用於建立頁面水印。

部分、元素和屬性關係

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

Report Sections

部分元素

所有上述報表部分都是可選的。但任何報表模板都將至少包含一個這樣的部分。這些部分中的每一個都包含一個單一的<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 視窗,如下面的螢幕截圖所示:

Jasper Report Section Example

在這裡,我們可以看到每個部分都列印了一段文字。需要注意的是,由於 JRXML 包含一個<lastPageFooter>元素,它將顯示在報表的最後一頁,而不是顯示<pageFooter>元素。<columnHeader> 和 <columnFooter> 元素僅在報表有多列時才會顯示。

廣告