JasperReports 快速指南



JasperReports - 入門

什麼是報表

報表是對資訊進行有意義、明確定義和總結的呈現。通常,日常活動會被自動化,資料會被彙總成支援決策的“報表”。報表將通常雜亂無章的資料轉換為圖表、圖形和其他形式的圖形表示。

報表模板

通常,大多數商業報表生成工具都採用以下佈局來生成報表。

標題
頁首
列標題
明細
列腳註
頁腳註
彙總

以下是圖表中每個元素的描述:

序號 元素和描述
1

標題

標題包含報表的“標題”。它僅在報表的開頭出現一次,例如,“教程點報表”。

2

頁首

頁首可能包含日期和時間資訊和/或組織名稱。這出現在每一頁的頂部。

3

列標題

列標題列出您希望在報表中顯示的特定欄位的名稱,例如,“作者姓名”、“開始時間”、“結束時間”、“工作時長”、“日期”等。

4

明細

明細是顯示特定欄位(列出在列標題中)的條目部分,例如“Manisha”、“9:00”、“18:00”、“9”、“2013年2月10日”。

5

列腳註

列腳註可能顯示任何欄位的總和,例如,“總工作時長:180”。

6

頁腳註

頁腳註可能包含頁碼資訊。它出現在每一頁的底部,例如,“1/23”。

7

彙總

彙總包含從“明細”部分推斷出的資訊,例如,在列出每個作者的工作時長後,可以將每個作者的總工作時長放入餅圖、圖形等視覺化圖表中,以便更好地進行比較。

JasperReports

以下是報表開發過程中遇到的常見問題:

  • 核心更改 - 通常,反映業務更改或增強,需要更改報表的核心邏輯。

  • 結果匯出 - 報表可以匯出到各種格式,例如:HTML、文字、PDF、MS Excel、RTF、ODT、逗號分隔值、XML 或影像。

  • 複雜報表 - 子報表和交叉表報表是良好的示例。

  • 圖表報表 - 視覺化圖表,例如,圖形、餅圖、XY 線、條形圖、儀表和時間序列。

為了消除上述問題的開銷並促進報表過程,引入了許多框架、工具、庫和第三方應用程式。JasperReports 就是其中之一。

JasperReports 是一個開源的 Java 報表引擎。它是基於 Java 的,並且沒有自己的表示式語法。JasperReports 能夠將豐富的內容傳遞到螢幕、印表機或 PDF、HTML、XLS、RTF、ODT、CSV、TXT 和 XML 檔案中。由於它不是一個獨立的工具,因此無法單獨安裝。相反,它透過將它的庫包含在應用程式的 CLASSPATH 中來嵌入到 Java 應用程式中。

JasperReports 是一個 Java 類庫,並非面向終端使用者,而是面向需要在其應用程式中新增報表功能的 Java 開發人員。

JasperReports 的功能

JasperReports 的一些重要功能包括:

  • 它具有靈活的報表佈局。

  • 它可以以文字或圖形方式呈現資料。

  • 開發人員可以透過多種方式提供資料。

  • 它可以接受來自多個數據源的資料。

  • 它可以生成水印(水印就像覆蓋在主影像上的輔助影像)。

  • 它可以生成子報表。

  • 它能夠以多種格式匯出報表。

JasperReports - 環境設定

JasperReports 是一個純 Java 庫,而不是一個獨立的應用程式。它不能單獨執行,因此需要嵌入到另一個客戶端或伺服器端的 Java 應用程式中。由於它是基於 Java 的,因此它可以在任何支援 Java 的平臺上執行(JDK 1.3 及更高版本)。所有 JasperReport 的功能都集中在一個 JAR 檔案中,即 jasperreports-x.x.x.jar。此 JAR 以及所需的和可選的庫(.ZIP 檔案)可以從以下網站下載:JasperReport 庫連結。從此連結下載最新版本。

ZIP 檔案包含 JasperReports JAR 檔案以及 JasperReports 原始碼、依賴的 JAR 和許多演示 JasperReport 功能的示例。

JasperReport 環境

要開始建立報表,我們需要準備好環境。將下載的 JasperReport.ZIP 檔案解壓縮到任何位置(在本例中,我們將其解壓縮到 C:\tools\jasperreports-5.0.1)。解壓縮檔案的目錄結構與如下所示相同:

Jasper directory structure

以下是所有目錄的詳細資訊:

  • build - 包含編譯後的 JasperReport 類檔案。

  • demo - 包含各種示例,演示 JasperReports 功能的各個方面。

  • dist - 包含 jasperreports-x.x.x.jar 檔案。我們將此 JAR 檔案新增到我們的 CLASSPATH 中以利用 JasperReports。

  • docs - 包含 JasperReports 文件的本地副本。

  • lib - 包含所有需要的 JAR,用於構建 JasperReports 並在我們的應用程式中使用它。

  • src - 包含 JasperReports 原始碼。

  • build.xml - 一個 ANT 構建檔案,用於構建 JasperReports 原始碼。如果我們不打算修改 JasperReports,則不需要使用此檔案,因為 JasperReports 以編譯形式分發。

  • changes.txt - 一個文字文件,解釋當前版本和先前版本的 JasperReports 類庫之間的差異。

  • license.txt - 一個包含 LGPL(較少通用公共許可證)許可證全文的文字文件。

  • readme.txt - 一個文字文件,包含有關如何構建和執行提供的示例的說明。

基本上,我們僅使用dist 下的 jasperreports-x.x.x.jar 和lib 目錄下的 JAR 來生成報表。由於 JasperReports 是一個開源工具,如果在 jasperreports-x.x.x.jar 中執行期間發現任何缺陷或錯誤,我們可以修復它並使用 build.xml 檔案重新構建 JAR。

設定 CLASSPATH

要使用 JasperReport,我們需要將以下檔案設定為我們的 CLASSPATH:

  • jasperreports-x.x.x.jar,其中 x.x.x 是 JasperReports 版本。(位於目錄 C:\tools\jasperreports-x.x.x\dist 下)。

  • lib 子目錄(C:\tools\jasperreports-x.x.x\lib)下的所有 JAR 檔案。

在安裝過程中,我們使用了 JasperReport 5.0.1 版本。右鍵單擊“我的電腦”並選擇“屬性”,單擊“高階”選項卡下的“環境變數”按鈕。現在使用此C:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib更新“Path”變數。現在您已準備好建立報表。

在本教程中的所有示例中,我們都使用了 ANT 任務來生成報表。build 檔案負責匯入生成報表所需的所有必需的 JAR。因此,如上所述設定 CLASSPATH 僅適用於那些希望在不使用 ANT 的情況下生成報表的使用者。

構建設定

本教程中的所有示例:

  • 使用簡單的文字編輯器編寫。

  • 儲存在目錄 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint 下。

  • 使用 Apache ANT 從命令提示符編譯和執行。我們將使用一個baseBuild.xml檔案,我們將在後續章節中將其匯入 ANT build.xml檔案中。將此檔案儲存到 C:\tools\jasperreports-5.0.1\test。以下是 baseBuild.xml 檔案的內容:

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportExample" basedir = ".">
   <description>Previews our JasperReport XML Design</description>
   <property name = "file.name" value = "jasper_report_template" />
   
   <!-- Directory where the JasperReports project file was extracted
   needs to be changed to match the local environment -->
   <property name = "jasper.dir" value = "../" />
   <property name = "dist.dir" value = "${jasper.dir}/dist" />
   <property name = "lib.dir" value = "${jasper.dir}/lib" />
   <property name = "src.dir" value = "src" />
   <property name = "classes.dir" value = "classes" />
   <property name = "main-class" value = "com.tutorialspoint.HelpMe" />

   <path id = "classpath">
      <pathelement location = "./" />
      <pathelement location = "${classes.dir}" />
	  
      <fileset dir = "${lib.dir}">
         <include name = "**/*.jar" />
      </fileset>
	  
      <fileset dir = "${dist.dir}">
         <include name = "**/*.jar" />
      </fileset>
   </path>
   
   <target name = "compile" depends = "clean-sample">
      <mkdir dir = "${classes.dir}"/>
		
      <javac srcdir = "${src.dir}" destdir = "${classes.dir}" 
         classpathref = "classpath" />
   </target>
   
   <target name = "run" depends = "compile">
      <echo message = "Running class : ${main-class}"/>
	  
      <java fork = "true" classname = "${main-class}">
         <classpath>
            <path refid = "classpath" />
         </classpath>
      </java>
   </target>
   
   <target name = "clean-sample">
      <delete dir = "${classes.dir}" />
      <delete file = "./${file.name}.jasper" />
      <delete file = "./${file.name}.jrprint" />
   </target>
   
</project>

此檔案包含所有必需的目標,例如清理目錄、編譯 Java 檔案和執行類檔案。

以下是 baseBuild.xml 中各個目錄的詳細資訊。(假設當前目錄為 C:\tools\jasperreports-5.0.1\test):

  • jasper.dir - 是 C:\tools\jasperreports-5.0.1 目錄

  • lib.dir - 是 C:\tools\jasperreports-5.0.1\lib 目錄

  • src.dir - 是 C:\tools\jasperreports-5.0.1\test\src

  • classes.dir - 是 C:\tools\jasperreports-5.0.1\test\classes

  • main-class - com.tutorialspoint.HelpMe。當沒有從命令列傳遞類檔名時,此類是一個簡單執行的類。將此檔案儲存到 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint。

package com.tutorialspoint;

public class HelpMe {
   public static void main(String[] args) {
      System.out.println("This is the default class executed."
         + "Please pass the fully qualified class" + " name to be executed as command line"
         + " parameter, for example," + " com.tutorialspoint.HelpMe ");
   }
}

Jasper 管理器類

有一些類將用於編譯 JRXML 報表設計、填充報表、列印報表、匯出到 PDF、HTML 和 XML 檔案、檢視生成的報表和報表設計。

Manager Classes

這些類的列表如下:

  • net.sf.jasperreports.engine.JasperCompileManager - 用於編譯 JRXML 報表模板。

  • net.sf.jasperreports.engine.JasperFillManager - 用於使用資料來源中的資料填充報表。

  • net.sf.jasperreports.engine.JasperPrintManager - 用於列印由 JasperReports 庫生成的文件。

  • net.sf.jasperreports.engine.JasperExportManager - 用於獲取報表填充過程生成的文件的 PDF、HTML 或 XML 內容。

  • net.sf.jasperreports.view.JasperViewer - 它表示一個簡單的 Java Swing 應用程式,可以載入和顯示報表。

  • net.sf.jasperreports.view.JasperDesignViewer - 在設計時用於預覽報表模板。

設定 Apache ANT

我們將使用 Apache ANT 構建所有示例。因此,請檢視ANT - 環境設定章節,在您的系統上設定 Apache ANT。

JasperReports - 生命週期

JasperReports 的主要目的是以簡單靈活的方式建立面向頁面、可列印的文件。以下流程圖描述了建立報表時的典型工作流程。

Jasper Life Cycle

如影像所示,生命週期具有以下不同的階段 -

  • 設計報表 - 在此步驟中,我們建立 JRXML 檔案,它是一個 XML 文件,其中包含報表佈局的定義。我們可以使用任何文字編輯器或iReportDesigner手動建立它。如果使用 iReportDesigner,則以視覺化方式設計佈局,因此可以忽略 JRXML 的實際結構。

  • 編譯報表 - 在此步驟中,JRXML 編譯成稱為 Jasper 檔案(*.jasper)的二進位制物件。進行此編譯是為了提高效能。為了執行報表,您需要將 Jasper 檔案與應用程式一起釋出。

  • 執行報表(填充資料到報表) - 在此步驟中,應用程式中的資料將填充到已編譯的報表中。類 net.sf.jasperreports.engine.JasperFillManager 提供了填充報表資料所需的函式。將建立一個 Jasper 列印檔案(*.jrprint),該檔案可用於列印或匯出報表。

  • 將報表匯出到所需格式 - 在此步驟中,我們可以使用 JasperExportManager 將上一步中建立的 Jasper 列印檔案匯出到任何格式。由於 Jasper 提供了各種匯出形式,因此使用相同的輸入,我們可以建立資料的多種表示形式。

後續章節將詳細概述上述每個步驟。

JasperReports - 設計

JasperReport 中的 JRXML 模板(或 JRXML 檔案)是標準的 XML 檔案,副檔名為 .jrxml。所有 JRXML 檔案都包含標籤 <jasperReport> 作為根元素。這反過來又包含許多子元素(所有這些都是可選的)。JasperReport 框架可以處理不同型別的資料來源。在本教程中,我們將展示如何僅透過將 Java 資料物件(使用 Java Bean)的集合傳遞到 JasperReport 引擎來生成基本報表。最終報表將顯示人員列表及其姓名和國家/地區等類別。

本章介紹以下步驟,以描述如何設計 JasperReport -

  • 建立 JRXML 報表模板和。
  • 預覽 XML 報表模板。

建立 JRXML 報表模板

建立 JRXML 檔案,即使用文字編輯器建立jasper_report_template.jrxml,並根據我們的環境設定將此檔案儲存在C:\tools\jasperreports-5.0.1\test中。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">
  
   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
	
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
	
   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535" 
               height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
			
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
  
      </band>
   </columnHeader>
 
    <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" 
               height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
			
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>

      </band>
   </detail>
	
</jasperReport>

以下是上述報表模板中主要欄位的詳細資訊 -

  • <queryString> - 此處為空(因為我們透過 Java Bean 傳遞資料)。通常包含檢索報表結果的 SQL 語句。

  • <field name> - 此元素用於將資料從資料來源或查詢對映到報表模板。name在報表主體中重複使用,並且區分大小寫。

  • <fieldDescription> - 此元素將欄位名稱與 XML 檔案中的相應元素對映。

  • <staticText> - 這定義了不依賴於任何資料來源、變數、引數或報表表示式的靜態文字。

  • <textFieldExpression> - 這定義了結果欄位的外觀。

  • $F{country} - 這是一個變數,包含結果的值,即標籤 <field name> 中預定義的欄位。

  • <band> - 區域包含報表中顯示的資料。

報表設計完成後,將其儲存在 C:\ 目錄中。

預覽 XML 報表模板

JasperReports JAR 檔案中提供了一個實用程式net.sf.jasperreports.view.JasperDesignViewer,它有助於預覽報表設計,而無需編譯或填充它。此實用程式是一個獨立的 Java 應用程式,因此可以使用 ANT 執行。

讓我們編寫一個 ANT 目標viewDesignXML來檢視 JRXML。因此,讓我們建立並儲存build.xml到 C:\tools\jasperreports-5.0.1\test 目錄下(應放置在與 JRXML 相同的目錄中)。以下是 build.xml 檔案 -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesignXML" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesignXML" description = "Design viewer is 
      launched to preview the JXML report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-XML" />
         <arg value = "-F${file.name}.jrxml" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

接下來,讓我們開啟一個命令提示符並轉到放置 build.xml 的目錄。執行命令ant(因為 viewDesignXML 是預設目標)。輸出如下 -

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

viewDesignXML:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.

可以忽略 Log4j 警告,並且作為上述執行的結果,將開啟一個標記為“JasperDesignViewer”的視窗,顯示我們的報表模板預覽。

Jasper Design Viewer

正如我們所看到的,僅顯示了獲取資料的報表表示式,因為 JasperDesignViewer 無法訪問實際的資料來源或報表引數。透過關閉視窗或在命令列視窗中按 Ctrl-c 來終止 JasperDesignViewer。

JasperReports - 編譯報表設計

我們在上一章中生成了 JasperReport 模板(JRXML 檔案)。此檔案不能直接用於生成報表。它必須編譯成 JasperReport 的原生二進位制格式,稱為Jasper檔案。在編譯時,我們將 JasperDesign 物件轉換為 JasperReport 物件 -

Jasper Report Compiling

介面net.sf.jasperreports.engine.design.JRCompiler在編譯過程中起著核心作用。此介面有幾個實現,具體取決於用於報表表示式的語言,報表表示式可以用 Java、Groovy、JavaScript 或任何其他指令碼語言編寫,只要編譯器實現可以在執行時對其進行評估。

我們可以透過以下兩種方式編譯 JRXML 檔案 -

  • 程式化編譯。
  • 透過 ANT 任務編譯。

JRXML 的程式化編譯

JasperReports API 提供了一個外觀類net.sf.jasperreports.engine.JasperCompileManager用於編譯 JasperReport。此類包含用於編譯報表模板的幾個公共靜態方法。模板的源可以是檔案、輸入流和/或記憶體物件。

JRXML 檔案(jasper_report_template.jrxml)的內容如下。它儲存在目錄C:\tools\jasperreports-5.0.1\test中 -

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
   
   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>

            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height = "16">
		
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

以下程式碼演示了上述jasper_report_template.jrxml檔案的編譯。

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class JasperReportCompile {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test" + 
         "/jasper_report_template.jrxml";

      System.out.println("Compiling Report Design ...");
      try {
          /**
          * Compile the report to a file name same as
          * the JRXML file name
          */
         JasperCompileManager.compileReportToFile(sourceFileName);
      } catch (JRException e) {
         e.printStackTrace();
      }
      System.out.println("Done compiling!!! ...");
   }
}

模板編譯

下一步,讓我們將上述內容儲存在檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.java中,並在 build.xml 檔案中按如下所示匯入baseBuild.xml。baseBuild.xml 已經包含compilerun目標 -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">

   <import file = "baseBuild.xml"/>

</project>

接下來,讓我們開啟命令列視窗並轉到放置 build.xml 的目錄。最後,執行命令ant -Dmain-class = com.tutorialspoint.JasperReportCompile如下 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportCompile
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
compile:
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
   warning: 'includeantruntime' was not set, defaulting to
   build.sysclasspath=last;set to false for repeatable builds
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportCompile
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done compiling!!! ...

BUILD SUCCESSFUL
Total time: 8 seconds

作為上述編譯的結果,您將看到模板檔案jasper_report_template.jasper已在 C:\tools\jasperreports-5.0.1\test 目錄中生成。

預覽已編譯的報表模板

net.sf.jasperreports.view.JasperDesignViewer可用於預覽已編譯的報表模板和 JRXML 模板。

為了進一步操作,讓我們向上述 build.xml 檔案新增一個新的目標viewDesign,這將允許我們預覽已編譯的報表。以下是修改後的 build.xml -

匯入檔案 - baseBuild.xml 從章節環境設定中獲取,應放置在與 build.xml 相同的目錄中。

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesign" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description="Design viewer is launched 
      to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

讓我們執行命令 - ant(viewDesign 是預設目標)在命令提示符下。JasperDesignViewer 視窗開啟,顯示 Jasper 檔案,如下所示 -

Jasper Design Viewer

透過 ANT 任務編譯

由於報表模板編譯更像是一個設計時作業而不是執行時作業,因此 JasperReport 庫有一個自定義 ANT 任務。對於某些情況下,當 JRXML 檔案在執行時建立時,我們無法使用此 ANT 任務。自定義 ANT 任務稱為 JRC,由類:net.sf.jasperreports.ant.JRAntCompileTask實現。其語法和行為與內建的<javac>ANT 任務非常相似。

模板編譯

讓我們向現有的 build.xml 新增新的目標compilereportdesing。在這裡,原始檔夾使用巢狀的 <src> 標籤和檔案集指定。巢狀的源標籤允許編譯散佈在許多不同位置且未分組在單個根報表原始檔夾下的報表模板。以下是修改後的 build.xml -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "compilereportdesing" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description = "Design viewer is 
      launched to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <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(compilereportdesing 是預設目標);輸出如下 -

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [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.

BUILD SUCCESSFUL
Total time: 5 seconds

檔案jasper_report_template.jasper在檔案系統中生成(在本例中為 C:\tools\jasperreports-5.0.1\test 目錄)。此檔案與透過呼叫 net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile() 以程式設計方式生成的檔案相同。我們可以預覽此 jasper 檔案,執行ant viewDesign

JasperReports - 填充報表

任何報表工具的主要目的是生成高質量的文件。報表填充過程透過操作資料集來幫助報表工具實現此目的。

報表填充過程所需的主要輸入為 -

  • 報表模板 - 這是實際的 JasperReport 檔案。

  • 報表引數 - 這些基本上是在報表填充時傳遞給引擎的命名值。我們將在報表引數章節中討論它們。

  • 資料來源 - 我們可以從各種資料來源填充 Jasper 檔案,例如 SQL 查詢、XML 檔案、csv 檔案、HQL(Hibernate 查詢語言)查詢、Java Bean 集合等。這將在報表資料來源章節中詳細討論。

此過程生成的輸出是一個.jrprint文件,該文件已準備好檢視、列印或匯出到其他格式。外觀類net.sf.jasperreports.engine.JasperFillManager通常用於使用資料填充報表模板。此類具有各種fillReportXXX()方法,用於填充報表模板(模板可以位於磁碟上、從輸入流中獲取或直接作為記憶體中的提供)。

此外觀類中有兩類 fillReportXXX() 方法 -

  • 第一種型別,接收 java.sql.Connection 物件作為第三個引數。大多數情況下,報表都是使用來自關係資料庫的資料填充的。這可以透過 -

    • 透過 JDBC 連線到資料庫。

    • 在報表模板中包含 SQL 查詢。

    • JasperReports 引擎使用傳遞的連線並執行 SQL 查詢。

    • 因此,將生成一個報表資料來源以填充報表。

  • 第二種型別,接收 net.sf.jasperreports.engine.JRDataSource 物件,當需要填充的資料以其他形式提供時。

填充報表模板

讓我們編寫一個報表模板。JRXML 檔案(C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml)的內容如下 -

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>

   <columnHeader>
      <band height = "23">
  
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
			
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

接下來,讓我們將 Java 資料物件(Java Bean)的集合傳遞到 JasperReport 引擎,以填充此已編譯的報表。

編寫一個 POJO DataBean.java,它表示資料物件(Java Bean)。此類定義了兩個 String 物件,即“name”和“country”。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint中。

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

編寫一個類 DataBeanList.java,它具有生成 Java Bean 物件集合的業務邏輯。這將進一步傳遞到 JasperReports 引擎,以生成報表。在這裡,我們在列表中添加了 4 個 DataBean 物件。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint中。

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

編寫一個主類檔案JasperReportFill.java,它從類(DataBeanList)獲取 Java Bean 集合並將其傳遞到 JasperReports 引擎,以填充報表模板。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint中。

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "c://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);
      Map parameters = new HashMap();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

生成報表

我們現在將使用常規的 ANT 構建過程編譯並執行這些檔案。build.xml 檔案如下所示 -

匯入檔案 - baseBuild.xml 從章節環境設定中獲取,應放置在與 build.xml 相同的目錄中。

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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.JasperReportFillexecutereport是預設目標)如下 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

compile:
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
   warning: 'includeantruntime' was not set, defaulting to
   build.sysclasspath=last; set to false for repeatable builds
   [javac] Compiling 1 source file to
   C:\tools\jasperreports-5.0.1\test\classes

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 8 seconds

作為上述執行的結果,檔案jasper_report_template.jrprint將在與.jasper檔案相同的目錄中生成(在本例中,它將在 C:\tools\jasperreports-5.0.1\test 中生成)。

Jasper 報表 - 檢視和列印報表

報表填充過程的輸出JasperPrint 物件可以使用內建的檢視器元件進行檢視,或者列印,或者匯出到更流行的文件格式,如 PDF、HTML、RTF、XLS、ODT、CSV 或 XML。本章將討論 Jasper 文件的檢視和列印,下一章將討論匯出,即 '匯出報表。'

檢視報表

JasperReport 提供了一個內建的檢視器,用於以其原始格式檢視生成的報表。它是一個基於 Swing 的元件,其他 Java 應用程式可以整合此元件,而無需將文件匯出到其他格式即可檢視或列印。net.sf.jasperreports.view.JRViewer 類表示此可視元件。此類還可以根據應用程式需求進行自定義,方法是將其子類化。

JasperReports 還帶有一個 Swing 應用程式,它使用可視元件來檢視報表。此應用程式有助於以與 *.jrprint 生成的相同格式檢視報表。此 Swing 應用程式在net.sf.jasperreports.view.JasperViewer 類中實現。要使用此類檢視報表,我們需要將其包裝到一個 ANT 目標中。

檢視生成的報表

以下示例演示瞭如何使用 JasperViewer 類檢視報表 -

讓我們編寫一個報表模板。JRXML 檔案 (C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml) 的內容如下所示 -

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
   
   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

接下來,讓我們將 Java 資料物件(Java Bean)的集合傳遞給 JasperReports 引擎,以填充此已編譯的報表。

編寫一個 POJO DataBean.java,它表示資料物件(Java Bean)。此類定義了兩個 String 物件,即“name”和“country”。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

編寫一個類 DataBeanList.java,它具有生成 Java Bean 物件集合的業務邏輯。這將進一步傳遞給 JasperReports 引擎,以生成報表。在這裡,我們在列表中添加了 4 個 DataBean 物件。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

編寫一個主類檔案JasperReportFill.java,它從類(DataBeanList)獲取 Java Bean 集合並將其傳遞到 JasperReports 引擎,以填充報表模板。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint中。

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "c://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

讓我們編寫一個目標viewFillReport到 build.xml 檔案。build.xml 檔案如下所示 -

匯入檔案 - 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(viewFillReport 是預設目標)。結果,我們將看到如下螢幕所示的 JasperViewer 視窗 -

Jasper Report Viewer

列印報表

我們可以使用net.sf.jasperreports.engine.JasperPrintManager類列印由 JasperReports 庫生成的文件(以其專有格式,即JasperPrint物件)。這是一個外觀類,它依賴於 Java 2 列印 API。在將 JasperReport 文件匯出到其他格式(如 HTML 或 PDF)後,我們也可以列印這些文件。

列印生成的報表

以下程式碼演示瞭如何列印報表。讓我們更新現有的類 JasperReportFill。我們將使用JasperPrintManager.printReport()方法。此方法將原始檔名(此處我們傳遞.jrprint檔案,我們在上一步中使用方法 JasperFillManager.fillReportToFile() 生成)作為第一個引數。第二個引數是顯示標準列印對話方塊的布林值(我們在此處將其設定為true)。

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = "c://tools/jasperreports-5.0.1/" +
         "test/jasper_report_template.jasper";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
    	   printFileName = JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
         if(printFileName != null){
            JasperPrintManager.printReport( printFileName, true);
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

現在,讓我們將此檔案儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint。我們將使用 ANT 編譯並執行此檔案。build.xml 的內容如下所示 -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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.JasperReportPrint。結果,將出現一個列印對話方塊。單擊確定列印文件。

JasperReports - 匯出報表

我們在上一章中看到了如何列印和檢視 JasperReport 生成的文件。在這裡,我們將看到如何將這些報表轉換為或匯出到其他格式,如 PDF、HTML 和 XLS。提供了外觀類net.sf.jasperreports.engine.JasperExportManager來實現此功能。匯出意味著將JasperPrint物件(.jrprint 檔案)轉換為不同的格式。

以下程式碼(JasperReportExport.java)演示了 JasperReport 文件的匯出過程。JasperExportManager 提供了僅將報表匯出到 PDF、HTML 和 XML 的方法。要匯出到 XLS 格式,我們使用了net.sf.jasperreports.engine.export.JRXlsExporter類。此程式碼生成以下三個檔案 -

  • sample_report.pdf
  • sample_report.html
  • sample_report.xls

匯出到其他格式

讓我們編寫一個報表模板。JRXML 檔案(C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml)的內容如下 -

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
   
   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
            <text><![CDATA[]]> </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

接下來,POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示 -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

編寫一個主類檔案JasperReportFill.java,它從類(DataBeanList)獲取 Java Bean 集合並將其傳遞到 JasperReports 引擎,以填充報表模板。將其儲存到目錄C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint中。

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = "c://tools/jasperreports-5.0.1/"
         + "test/jasper_report_template.jasper";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource =
         new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
         printFileName = JasperFillManager.fillReportToFile(sourceFileName,
            parameters, beanColDataSource);
         if (printFileName != null) {
            /**
             * 1- export to PDF
             */
            JasperExportManager.exportReportToPdfFile(printFileName,
               "C://sample_report.pdf");

            /**
             * 2- export to HTML
             */
            JasperExportManager.exportReportToHtmlFile(printFileName,
               "C://sample_report.html");

            /**
             * 3- export to Excel sheet
             */
            JRXlsExporter exporter = new JRXlsExporter();

            exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME,
               printFileName);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
               "C://sample_report.xls");

            exporter.exportReport();
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

在這裡,我們包含了將 jasper 列印檔案匯出到 pdf、html 和 xls 格式的邏輯。

生成報表

讓我們使用我們常規的 ANT 構建過程編譯並執行上述檔案。build.xml 檔案如下所示 -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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>

轉到命令提示符,然後轉到目錄 C:\tools\jasperreports-5.0.1\test,其中放置了 build.xml。最後,執行命令ant -Dmain-class=com.tutorialspoint.JasperReportFill。輸出如下所示 -

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, defaulting t
   [javac] Compiling 4 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

executereport:
   [echo] Im here

BUILD SUCCESSFUL
Total time: 32 seconds

上述執行的結果是,您將在 C:\ 目錄中找到三個檔案 sample_report.pdf、sample_report.html、sample_report.xls。

報表引數

填充報表的 主要輸入是 - 報表模板、引數和資料來源。本章將描述引數,下一章我們將討論資料來源。

引數是物件引用,它們在報表填充操作期間傳遞給報表引擎。無法透過資料來源傳遞的資料可以透過引數傳遞。諸如作者姓名、報表標題等資料可以透過引數傳遞。JasperReports 模板或 JRXML 模板可以具有零個或多個引數元素。

引數宣告

引數宣告如下 -

<parameter name = "exampleParameter" class = "java.lang.String" />

名稱屬性

<parameter> 元素的name屬性是必需的。它透過名稱在報表表示式中引用引數。引數名稱應為單個單詞。它不應包含任何特殊字元,如點或逗號。

類屬性

class屬性也是必需的,它指定引數值的類名。其預設值為java.lang.String。這可以更改為執行時可用的任何類。無論報表引數的型別是什麼,引擎都會在使用 $P{} 令牌的報表表示式中處理強制轉換,因此無需進行手動強制轉換。

報表引數值始終打包在 java.util.Map 物件中,該物件以引數名稱作為其鍵。報表引數可以在報表的查詢字串中使用,以便進一步自定義從資料庫檢索的資料集。它們充當查詢中的動態過濾器,為報表提供資料。

內建引數

以下是預定義的報表引數,可以在表示式中使用 -

序號 引數名稱和描述
1

REPORT_PARAMETERS_MAP

包含一個包含所有使用者定義和內建引數的對映。

2

REPORT_CONNECTION

這指向使用者提供的類 java.sql.Connection,用於 JDBC 資料來源。

3

REPORT_DATA_SOURCE

這是使用者提供的 JRDataSource 例項,表示內建資料來源型別之一或使用者定義的資料來源。

4

REPORT_MAX_COUNT

這是一個java.lang.Integer值,允許使用者限制資料來源中的記錄。

5

REPORT_SCRIPTLET

這指向net.sf.jasperreports.engine.JRAbstractScriptlet,幷包含使用者提供的報表指令碼的例項。

6

REPORT_LOCALE

這是一個java.util.Locale例項,包含所需的資源包區域設定。

7

REPORT_RESOURCE_BUNDLE

這指向java.util.ResourceBundle物件,幷包含本地化訊息。

8

REPORT_TIME_ZONE

這是一個java.util.TimeZone例項,用於日期格式化。

9

REPORT_VIRTUALIZER

這是net.sf.jasperreports.engine.JRVirtualizer物件的例項,用於頁面虛擬化(最佳化記憶體消耗)。

10

REPORT_CLASS_LOADER

這是一個java.lang.ClassLoader例項,在報表填充過程中用於載入資源,例如影像、字型和子報表模板

11

IS_IGNORE_PAGINATION

如果設定為java.lang.Boolean.TRUE,則報表將在一個長頁面上生成,並且不會發生分頁。

示例

讓我們將ReportTitleAuthor傳遞到報表(由 JasperReportFill.java 生成)。修改後的檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示 -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

讓我們將引數<ReportTitle>和<Author>新增到我們現有的報表模板(章節報表設計)。報表標題和作者將顯示在報表的開頭。修改後的報表模板(jasper_report_template.jrxml)如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄 -

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>

   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
           
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
				
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

報表生成

我們將使用我們常規的 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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

上述編譯的結果是,將開啟一個 JasperViewer 視窗,如下面的螢幕所示 -

Jasper Report Parameter Example

在這裡,我們看到報表標題“聯絡人列表”和作者“由 Manisha 準備”顯示在報表的開頭。

報表資料來源

資料來源是結構化資料容器。在生成報表時,JasperReports 引擎從資料來源獲取資料。可以從資料庫、XML 檔案、物件陣列和物件集合中獲取資料。我們在章節填充報表中看到了,fillReportXXX() 方法期望接收要填充的報表的 資料來源,其形式為net.sf.jasperreports.engine.JRDataSource物件或java.sql.Connection(當報表資料位於關係資料庫中時)。

JRDataSource 介面只有兩個方法需要實現 -

  • public boolean next() throws JRException;

    • 在報表填充時,當報表引擎遍歷資料時,將在資料來源物件上呼叫此方法。

  • public Object getFieldValue(JRField jrField) throws JRException;

    • 此方法提供當前資料來源記錄中每個報表欄位的值。

檢索資料來源中的資料的唯一方法是使用報表欄位。根據獲取資料來源中記錄的方式,JRDataSource 介面有幾個預設實現。

資料來源實現

下表總結了資料來源及其實現類:

資料來源 實現類
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
基於 Map 的 net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModel net.sf.jasperreports.engine.data.JRTableModelDataSource
XML net.sf.jasperreports.engine.data.JRXmlDataSource
CSV net.sf.jasperreports.engine.data.JRCsvDataSource
XLS net.sf.jasperreports.engine.data.JRXlsDataSource
net.sf.jasperreports.engine.JREmptyDataSource

JDBC 資料來源

JRResultSetDataSource封裝了一個java.sql.ResultSet物件。當報表資料從關係資料庫中提取時,這是最常用的資料來源實現。如果將java.sql.Connection傳遞給引擎,則引擎首先執行相關的查詢並將返回的java.sql.ResultSet物件儲存在 JRResultSetDataSource 例項中。

JavaBean 資料來源

JRBeanArrayDataSourceJRBeanCollectionDataSource表示可以封裝 JavaBean 物件的陣列和集合的實現。陣列或集合中的每個物件將在此型別的資料來源中被視為一條記錄。特定 JavaBean 屬性與相應報表欄位之間的對映是透過命名約定進行的。報表欄位的名稱必須與 JavaBean 規範中指定的 JavaBean 屬性的名稱相同。

在本教程的所有示例中,我們都使用了 JRBeanCollectionDataSource。

基於 Map 的資料來源

如果父應用程式已經將報表資料儲存在記憶體中作為java.util.Map 物件,則實現類JRMapArrayDataSourceJRMapCollectionDataSource很有用。封裝的陣列或集合中的每個 Map 物件都被視為資料來源中的一個虛擬記錄,並且每個報表欄位的值都是使用報表欄位(作為鍵的名稱)從 map 中提取的。

TableModel 資料來源

在許多客戶端應用程式中,資料以表格格式顯示。許多應用程式中的一個常見需求是允許使用者將此表格格式列印為報表。實現類JRTableModelDataSource使從表格格式生成報表的任務對於 Swing 應用程式來說變得微不足道。此類封裝了一個 javax.swing.table.TableModel 物件。可以按名稱或按其基於 0 的索引訪問封裝的 TableModel 物件中的列。

XML 資料來源

JRXmlDataSource是基於 DOM 的資料來源實現,它使用 XPath 表示式從 XML 文件中選擇資料。XML 資料來源中的記錄由透過 XPath 表示式選擇的節點元素表示。使用欄位描述(JRXML 中的<fieldDescription>元素)提供的 XPath 表示式從每個記錄中檢索欄位值。

XPath 是一種用於遍歷 XML 文件的屬性和元素的語言。有關 XPath 的更多資訊,請訪問http://www.w3.org/TR/xpath.

CSV 資料來源

JRCsvDataSource表示資料來源的實現,這些資料來源從結構化文字檔案(通常是 CSV)中檢索其資料。使用它們的列索引檢索欄位值。

XLS 資料來源

JRXlsDataSource表示資料來源的實現,這些資料來源從 Excel 文件中檢索其資料。此資料來源實現的報表欄位對映也基於欄位列索引。

空資料來源

JREmptyDataSource模擬一個具有給定數量的虛擬空記錄的資料來源。它由 UI 工具用於提供基本的報表預覽功能,或在特殊的報表模板中,或用於測試和除錯目的。

可回退資料來源

net.sf.jasperreports.engine.JRRewindableDataSource擴充套件了基本JRDataSource介面。它僅向介面添加了一個名為 moveFirst() 的方法。此方法旨在將游標移動到資料來源中的第一個元素。

當處理放置在不允許拆分的波段內的子報表時,可回退資料來源很有用,因為 isSplitAllowed="false" 設定且當前頁面上沒有足夠的空間來呈現子報表。

JRResultSetDataSource外,所有上述資料來源實現都是可回退的,因為它不支援將記錄指標移回。只有在手動使用此資料來源包裝 java.sql.ResultSet 然後將其傳遞給子報表時,這才會帶來問題。如果 SQL 查詢位於子報表模板中,則不會出現問題,因為引擎將在下一頁面重新啟動子報表時再次執行它。

資料來源提供程式

JasperReports 庫有一個介面net.sf.jasperreports.engine.JRDataSourceProvider。這有助於建立和處置資料來源物件。使用 GUI 工具建立報表模板時,需要一個特殊的工具來自定義報表的 ​​資料來源。JRDataSourceProvider 是將自定義資料來源插入設計工具的標準方法。此介面的自定義實現應實現以下方法,這些方法允許建立和處置資料來源物件,以及如果可能,列出資料來源內可用報表欄位的方法:

public boolean supportsGetFieldsOperation();

public JRField[] getFields(JasperReport report)
   throws JRException, UnsupportedOperationException;

public JRDataSource create(JasperReport report) throws JRException;

public void dispose(JRDataSource dataSource) throws JRException;

報表欄位

報表欄位是表示資料來源和報表模板之間資料對映的元素。欄位可以在報表表示式中組合以獲得所需的輸出。報表模板可以包含零個或多個<field>元素。宣告報表欄位時,資料來源應提供與報表模板中定義的所有欄位相對應的資料。

欄位宣告

欄位宣告如下所示:

<field name = "FieldName" class = "java.lang.String"/>

名稱屬性

<field>元素的name屬性是必需的。它透過名稱在報表表示式中引用欄位。

類屬性

class屬性指定欄位值的類名。其預設值為java.lang.String。這可以更改為執行時可用的任何類。無論報表欄位的型別如何,引擎都會在使用 $F{} 令牌的報表表示式中處理轉換,從而使手動轉換變得不必要。

欄位描述

<fieldDesciption>元素是一個可選元素。在實現自定義資料來源時,這非常有用。例如,我們可以儲存一個鍵或一些資訊,透過這些資訊,我們可以在執行時從自定義資料來源中檢索欄位的值。透過使用<fieldDesciption>元素而不是欄位名稱,您可以輕鬆克服在從資料來源檢索欄位值時對欄位命名約定的限制。

以下是我們現有 JRXML 檔案(第 報表設計 章)中的一段程式碼。在這裡,我們可以看到nameclassfieldDescription元素的使用。

<field name = "country" class = "java.lang.String">
   <fieldDescription><![CDATA[country]]></fieldDescription>
</field>

<field name = "name" class = "java.lang.String">
   <fieldDescription><![CDATA[name]]></fieldDescription>
</field>

排序欄位

在需要資料排序並且資料來源實現不支援排序(例如 CSV 資料來源)時,JasperReports 支援基於記憶體的欄位資料來源排序。可以使用報表模板中的一個或多個<sortField>元素進行排序。

如果指定了至少一個排序欄位,則在報表填充過程中,資料來源將傳遞給JRSortableDataSource例項。然後,它從資料來源中獲取所有記錄,根據指定的欄位在記憶體中執行排序,並替換原始資料來源。

排序欄位名稱應與報表欄位名稱相同。用於排序的欄位應具有實現 java.util.Comparable 的型別。對所有欄位執行自然順序排序,除了 java.lang.String 型別的欄位(對於 String 型別,使用與報表填充區域設定相對應的校對器)。當指定多個排序欄位時,將使用這些欄位作為排序鍵按其在報表模板中出現的順序執行排序。以下示例演示了排序功能。

排序報表示例

讓我們將<sortField>元素新增到我們現有的報表模板中(第 報表設計 章)。讓我們按降序對欄位country進行排序。修改後的報表模板(jasper_report_template.jrxml)如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄下:

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595" pageHeight = "842" 
   columnWidth = "515" leftMargin = "40" rightMargin = "40" 
   topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
  
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
            
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>
  
   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

報表填充的 Java 程式碼保持不變。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示:

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

我們將使用常規的 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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Field Sort Example

在這裡,我們可以看到國家/地區名稱按字母順序以降序排列。

報表表示式

報表表示式是 JasperReports 的強大功能,它允許我們在報表上顯示計算資料。計算資料不是靜態資料,也不是作為報表引數或資料來源欄位專門傳遞的資料。報表表示式是透過組合報表引數、欄位和靜態資料構建的。預設情況下,Java 語言用於編寫報表表示式。JasperReports 編譯器支援其他用於報表表示式的指令碼語言,如 Groovy 指令碼語言、JavaScript 或 BeanShell 指令碼。

本章將向您解釋:報表表示式是如何工作的,假設它們僅使用 Java 語言編寫。在 JRXML 報表模板中,有幾個元素定義了表示式,例如:

  • <variableExpression>
  • <initialValueExpression>
  • <groupExpression>
  • <printWhenExpression>
  • <imageExpression>
  • <textFieldExpression>

表示式宣告

基本上,所有報表表示式都是 Java 表示式,它們可以引用報表欄位、報表變數和報表引數。

表示式中的欄位引用

要在表示式中使用報表欄位引用,必須將欄位的名稱放在$F{}字元序列之間,如下所示:

<textfieldexpression>
   $F{Name}
</textfieldexpression>

以下是我們現有 JRXML 檔案(第 報表設計 章)中的一段程式碼:

<textFieldExpression class = "java.lang.String">
   <![CDATA[$F{country}]]>
</textFieldExpression>

表示式中的變數引用

要在表示式中引用變數,必須將變數的名稱放在$V{}之間,如下面的示例所示:

<textfieldexpression>
   "Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>

表示式中的引數引用

要在表示式中引用引數,應將引數的名稱放在$P{}之間,如下面的示例所示:

<textfieldexpression>
   "ReportTitle : " + $P{Title}
</textfieldexpression>

以下是我們現有 JRXML 檔案中的一段程式碼,它演示了在表示式中引用引數的方法。(JRXML 來自章節 報表設計)−

<textField isBlankWhenNull = "true" bookmarkLevel = "1">
   <reportElement x = "0" y = "10" width = "515" height = "30"/>
   
   <textElement textAlignment = "Center">
      <font size = "22"/>
   </textElement>
   
   <textFieldExpression class = "java.lang.String">
      <![CDATA[$P{ReportTitle}]]>
   </textFieldExpression>
   
   <anchorNameExpression>
      <![CDATA["Title"]]>
   </anchorNameExpression>
</textField>

<textField isBlankWhenNull = "true">
   <reportElement  x = "0" y = "40" width = "515" height = "20"/>
   
   <textElement textAlignment = "Center">
      <font size = "10"/>
   </textElement>
   
   <textFieldExpression class = "java.lang.String">
      <![CDATA[$P{Author}]]>
   </textFieldExpression>
</textField>

如上所述,引數、欄位和變數引用實際上是真正的 Java 物件。透過報表模板中引數、欄位或變數宣告中得知其類,我們甚至可以在表示式中呼叫這些物件引用的方法。

以下示例展示瞭如何從 java.lang.String 報表欄位“Name”中提取並顯示首字母−

<textFieldExpression>
   $F{Name}.substring(0, 1)
</textFieldExpression>

表示式中的資源包引用

要在表示式中引用資源,應將放在$R{}之間,如下面的示例所示−

<textfieldexpression>
   $R{report.title}
</textfieldexpression>

根據執行時提供的區域設定和report.title鍵,載入與報表模板關聯的資源包。因此,報表標題透過從資源包中提取字串值來顯示。有關國際化的更多資訊,請參閱章節 國際化

計算器

計算器是 JasperReports 中的一個實體,它在報表填充時計算表示式並遞增變數或資料集。在編譯過程中,編譯器會生成資訊並將其儲存在編譯後的報表中。此資訊在報表填充時用於構建 net.sf.jasperreports.engine.fill.JRCalculator 類的例項。

Java 原始檔由基於 Java 的報表編譯器動態生成和編譯。此生成的類是 JRCalculator 的子類,編譯生成的位元組碼儲存在 JasperReport 物件中。此位元組碼在報表填充時載入,並例項化生成的類以獲得表示式計算所需的計算器物件。

條件表示式

JasperReports 在定義變量表達式時不支援 if-else 語句。相反,您可以使用三元運算子{cond} ? {statement 1} : {statement 2}。此運算子可以巢狀在 Java 表示式中,以根據多個條件獲得所需的輸出。

報表中條件表示式的示例

讓我們修改現有的報表模板(章節 報表設計)併為欄位 country 新增條件表示式。修改後的報表模板(jasper_report_template.jrxml)如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄下−

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595" pageHeight = "842" 
   columnWidth = "515" leftMargin = "40" rightMargin = "40" 
   topMargin = "50" bottomMargin = "50">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <queryString>
      <![CDATA[]]>
   </queryString>
   
   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>
   
   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>
   
   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}.isEmpty() ? "NO COUNTRY" : $F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
			
      </band>
   </detail>
	
</jasperReport>

報表填充的 Java 程式碼如下所示。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java的內容如下−

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下−

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

我們將在 Java Bean 列表中新增一條新的記錄,其中 country 欄位為空。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下−

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));
      dataBeanList.add(produce("Tanmay", ""));
      
      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

我們將使用常規的 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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 3 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
    [java] log4j:WARN No appenders could be found for logger
    (net.sf.jasperreports.extensions.ExtensionsEnvironment).
    [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 5 minutes 5 seconds

C:\tools\jasperreports-5.0.1\test>

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Expression Example

在這裡,我們可以看到,對於最後一條記錄,我們沒有為 country 欄位傳遞任何資料,“NO COUNTRY”正在列印。

報表變數

報表變數是在報表表示式之上構建的特殊物件。

報表變數簡化了以下任務−

  • 報表表示式在整個報表模板中大量使用。這些表示式可以透過使用報表變數僅宣告一次。

  • 報表變數可以根據相應的表示式值執行各種計算,例如計數、求和、平均值、最小值、最大值、方差等。

如果在報表設計中定義了變數,則表示式中的新變數可以引用這些變數。因此,在報表設計中宣告變數的順序很重要。

變數宣告

變數宣告如下−

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

如上所示,<variable> 元素包含多個屬性。這些屬性總結如下−

名稱屬性

引數欄位類似,</variable> 元素的name屬性是必需的。它允許在報表表示式中透過其宣告名稱引用變數。

類屬性

class屬性也是必需的,它指定變數值的類名。其預設值為java.lang.String。這可以更改為類路徑中可用的任何類,在報表編譯時和報表填充時均可。引擎負責在使用 $V{} 令牌的報表表示式中進行型別轉換,因此不需要手動型別轉換。

計算

此屬性確定在填充報表時對變數執行什麼計算。以下小節描述了 <variable> 元素的 calculation 屬性的所有可能值。

  • Average − 變數值是變量表達式每個非空值的平均值。僅對數字變數有效。

  • Count − 變數值是變量表達式非空例項的計數。

  • First − 變數值是變量表達式的第一個例項的值。後續值將被忽略。

  • Highest − 變數值是變量表達式的最高值。

  • Lowest − 變數值是報表中變量表達式的最低值。

  • Nothing − 對變數不執行任何計算。

  • StandardDeviation − 變數值是與報表表示式匹配的所有非空值的標準差。僅對數字變數有效。

  • Sum − 變數值是報表表示式返回的所有非空值的總和。

  • System − 變數值是自定義計算(使用 JasperReports 的指令碼程式功能自己計算該變數的值)。

  • Variance − 變數值是報表變量表達式求值返回的所有非空值的方差。

Incrementer FactoryClass

此屬性確定在填充報表上的當前記錄時用於計算變數值的類。預設值為實現net.sf.jasperreports.engine.fill.JRIncrementerFactory的任何類。工廠類將由引擎在執行時根據為變數設定的calculation屬性例項化遞增器物件。

IncrementType

這決定何時重新計算變數的值。此屬性使用以下值−

  • Column − 在每列結束時重新計算變數值。

  • Group − 當由 incrementGroup 指定的組發生更改時重新計算變數值。

  • None − 每次記錄都重新計算變數值。

  • Page − 在每頁結束時重新計算變數值。

  • Report − 僅在報表結束時重新計算變數值一次。

IncrementGroup

incrementTypeGroup時,這確定重新計算變數值的組的名稱。這採用 JRXML 報表模板中宣告的任何組的名稱。

ResetType

這決定何時重置變數的值。此屬性使用以下值−

  • Column − 在每列開始時重置變數值。

  • Group − 當由 incrementGroup 指定的組發生更改時重置變數值。

  • None − 從不重置變數值。

  • Page − 在每頁開始時重置變數值。

  • Report − 僅在報表開始時重置變數值一次。

ResetGroup

resetTypeGroup時,這確定重置變數值的組的名稱。此屬性的值將是 JRXML 報表模板中宣告的任何組的名稱。

內建報表變數

有一些內建系統變數,可以在表示式中直接使用,如下所示−

序號 變數名稱和描述
1

PAGE_NUMBER

此變數的值是其當前頁碼。它可以用來顯示當前頁碼和總頁碼,使用 JasperReports 文字欄位元素的一個特殊功能,即evaluationTime屬性。

2

COLUMN_NUMBER

此變數包含當前列號。

3

REPORT_COUNT

此報表變數包含已處理的記錄總數。

4

PAGE_COUNT

此變數包含生成當前頁面時已處理的記錄數。

5

COLUMN_COUNT

此變數包含生成當前列時已處理的記錄數。

6

GroupName_COUNT

此變數的名稱派生自其對應的組的名稱,字尾為_COUNT序列。此變數包含當前組中的記錄數。

示例

讓我們向現有的報表模板(章節 報表設計)新增一個變數(countNumber)。我們將為每條記錄新增字首計數。修改後的報表模板(jasper_report_template.jrxml)如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄下−

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription>
         <![CDATA[country]]>
      </fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription>
         <![CDATA[name]]>
      </fieldDescription>
   </field>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
			
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535"	height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA["  " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

報表填充的 Java 程式碼保持不變。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示:

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

我們將使用常規的 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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

上述編譯的結果是,一個 JasperViewer 視窗開啟,如下面的螢幕所示−

Jasper Report Variable Example

在這裡,我們看到每條記錄都添加了字首計數。

報表節

我們在章節 入門中討論了簡單報表模板的結構。類似地,JasperReports 將報表模板結構化為多個節。節是報表的一部分,具有指定的的高度,並且可以包含報表物件,例如線條、矩形、影像或文字欄位。

在報表填充時,報表引擎會遍歷提供的報表資料來源的虛擬記錄。根據每個節的定義行為,引擎會在適當的時候渲染每個報表節。例如,詳細資訊節為資料來源中的每條記錄渲染。當發生分頁符時,頁面頁首和頁面頁尾節會根據需要渲染。

在 JasperReports 中,術語和報表章節也被稱為 **報表段(report bands)**。章節由一個或多個報表段組成。這些章節在報表生成時重複填充,並最終生成報表文件。

主要章節

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

標題(Title)

此章節僅在報表開頭出現一次。

2

頁面頁首(Page Header)

此章節出現在生成文件的每個頁面開頭。

3

列頁首(Column Header)

此章節出現在生成文件的每一列開頭。如果報表僅定義了一列,則列頁首和頁尾章節將被忽略。

4

組頁首(Group Header)

此章節由報表組引入(章節 )。每當分組表示式值發生變化時,組頁首章節就會列印在明細章節上方。如果定義了多個組,則組頁首按組定義的順序列印。

5

明細(Detail)

此章節針對報表資料來源提供的每一行資料重複出現。明細章節可以由多個報表段組成。

6

組頁尾(Group Footer)

此章節由報表組引入(章節 )。組頁尾章節列印在明細章節下方,並在分組表示式的值發生變化之前列印。組頁尾始終列印資料來源中的最後一行資料。如果定義了多個組,則組頁尾按組定義的逆序列印。

7

列頁尾(Column Footer)

此章節出現在每一列底部。如果報表的列數為 1,則列頁首和頁尾章節將被忽略。

8

頁面頁尾(Page Footer)

此章節出現在每個頁面底部。

9

最後一頁頁尾(Last Page Footer)

此章節替換報表最後一頁上的常規頁面頁尾。如果也存在彙總章節,則此章節可能不是文件的最後一頁。當需要在最後一頁底部顯示彙總資訊時,此章節有時很有用。

10

彙總(Summary)

此章節僅在報表末尾出現一次。

11

無資料(No Data)

當“無資料時列印報表”屬性設定為“無資料”章節時,將列印此章節。如果在報表模板中定義了 <noData> 章節,並且資料來源為空,則在填充時僅考慮 <noData> 章節,其內容將生成報表輸出。

12

背景(Background)

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

章節、元素和屬性關係

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

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的有效值相同

章節屬性

以下是報表章節的屬性:

高度(Height)

章節的高度指定該特定章節的高度(以畫素為單位),在整個報表設計中非常重要。

列印時表示式(Print When Expression)

確定是否應列印章節的布林表示式。

允許分割(Split Allowed)

指示是否允許在章節不適合當前頁面時進行分割的標誌。如果為 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> 元素僅在報表包含多列時才會顯示。

報表組

JasperReports 中的組有助於以邏輯方式組織報表上的資料。報表組表示資料來源中連續記錄的序列,這些記錄具有某些共同點,例如某個報表欄位的值。報表組由 <group> 元素定義。報表可以包含任意數量的組。聲明後,可以在整個報表中引用組。

報表組包含三個元素:

  • 組表示式 - 指示必須更改以啟動新資料組的資料。

  • 組頁首章節 - 幫助在分組資料的開頭放置標籤。

  • 組頁尾章節 - 幫助在分組資料的末尾放置標籤。

在報表填充時遍歷資料來源的過程中,如果組表示式的值發生變化,則會發生組中斷,並且相應的 <groupFooter> 和 <groupHeader> 章節將插入到生成的文件中。

報表組機制不會對資料來源提供的資料執行任何排序。僅當資料來源中的記錄已根據報表中使用的組表示式排序時,資料分組才能按預期工作。

組屬性

<group> 元素包含允許我們控制分組資料佈局方式的屬性。下表總結了這些屬性:

序號 屬性及描述
1

name

這是必須的。它透過名稱在報表表示式中引用組。它遵循我們為報表引數、欄位和報表變數提到的相同命名約定。當您想引用特定報表組時,可以在其他 JRXML 屬性中使用它。

2

isStartNewColumn

設定為 true 時,每個資料組都將在新列中開始。預設值為 false

3

isStartNewPage

設定為true時,每個資料組將從新的一頁開始。預設值為false

4

isResetPageNumber

設定為true時,每次新組開始時,報表頁碼將重置。預設值為false

5

isReprintHeaderOnEachPage

設定為true時,組標題將列印在每一頁上。預設值為false
6

minHeightToStartNewPage

定義列底部需要保留的最小垂直空間,以便將組標題放置在當前列中。該空間以報表單位指定。

7

footerPosition

呈現組頁尾在頁面上的位置,以及它與後續報表部分的關係。其值可以是:NormalStackAtBottomForceAtBottomCollateAtBottom。預設值為Normal

8

keepTogether

設定為true時,可防止組在其第一次斷開嘗試時被分割。

示例

讓我們向現有的報表模板(第 報表設計 章)新增一個組(CountryGroup)。計算每個國家/地區的出現次數,並將計數顯示為組頁尾。在組標題中,每個記錄的計數都帶有字首。修改後的報表模板 (jasper_report_template.jrxml) 如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄中 -

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <variable name = "CountryNumber" class = "java.lang.Integer"
      incrementType = "Group" incrementGroup = "CountryGroup"
      calculation = "Count">
      <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
   </variable>
   
   <group name = "CountryGroup" minHeightToStartNewPage = "60">
      <groupExpression><![CDATA[$F{country}]]></groupExpression>
      
      <groupHeader>
         <band height = "20">
            
            <textField evaluationTime = "Group" evaluationGroup = "CountryGroup"
               bookmarkLevel = "1">
               <reportElement mode = "Opaque" x = "0" y = "5" width = "515"
                  height = "15" backcolor = "#C0C0C0"/>
               
               <box leftPadding = "10">
                  <bottomPen lineWidth = "1.0"/>
               </box>
               <textElement/>
               
               <textFieldExpression class = "java.lang.String">
                  <![CDATA["  " + String.valueOf($V{CountryNumber}) + ". "
                  + String.valueOf($F{country})]]>
               </textFieldExpression>
               
               <anchorNameExpression>
                  <![CDATA[String.valueOf($F{country})]]>
               </anchorNameExpression>
            </textField>
         
         </band>
      </groupHeader>
      
      <groupFooter>
         <band height = "20">
            
            <staticText>
               <reportElement x = "400" y = "1" width = "60" height = "15"/>
               <textElement textAlignment = "Right"/>
               <text><![CDATA[Count :]]></text>
            </staticText>
            
            <textField>
               <reportElement x = "460" y = "1" width = "30" height = "15"/>
               <textElement textAlignment = "Right"/>
               
               <textFieldExpression class = "java.lang.Integer">
                  <![CDATA[$V{CountryGroup_COUNT}]]>
               </textFieldExpression>
            </textField>
         
         </band>
      </groupFooter>
   
   </group>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" width = "535" height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
               <text><![CDATA[]]>
            </text>
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" width = "535" height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>  
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "414" y = "0" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
	
</jasperReport>

報表填充的 Java 程式碼保持不變。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示 -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

我們將使用我們常規的 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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

上述編譯的結果是,一個 JasperViewer 視窗開啟,如下面的螢幕所示−

Jasper Report Groups Example

在這裡,我們看到每個國家/地區都被分組,並且每個國家/地區的出現次數都顯示在每個組的頁尾中。

報表字型

報表包含文字元素,並且每個元素都可以具有自己的字型設定。可以使用 <font> 標籤(在 <textElement> 標籤中可用)來指定這些設定。報表可以定義多個字型。定義後,它們可以用作整個報表中其他字型定義的預設或基本字型設定。

報表字型

報表字型是字型設定的集合,在報表級別宣告。在設定文字元素的字型屬性時,可以在整個報表模板中重複使用報表字型。

報表字型現已棄用。不要使用文件本身中宣告的 <reportFont/> 元素。請改用 <style/> 元素。

字型屬性

下表總結了 <font> 元素的主要屬性 -

序號 屬性及描述
1

fontName

字型名稱,可以是物理字型的名稱、邏輯字型的名稱或註冊的 JasperReports 字型擴充套件中的字體系列的名稱。

2

size

以磅為單位測量的字型大小。預設為 10。

3

isBold

指定是否需要粗體字型的標誌。預設為 false。

4

isItalic

指定是否需要斜體字型的標誌。預設為 false。

5

isUnderline

指定是否需要下劃線文字修飾的標誌。預設為 false。

6

isStrikeThrough

指定是否需要刪除線文字修飾的標誌。預設為 false。

7

pdfFontName

將文件匯出為 PDF 格式時,iText 庫所需的等效 PDF 字型名稱。

8

pdfEncoding

等效的 PDF 字元編碼,iText 庫也需要它。

9

isPdfEmbedded

指定字型是否應嵌入文件本身的標誌。預設為 false。如果設定為 true,則有助於在沒有任何問題的情況下檢視 PDF 文件。

字型型別

在 JasperReports 中,字型可以分類為 -

  • 邏輯字型 - 自版本 1.0 以來,Java 平臺已識別五種字型型別,稱為邏輯字型。它們是 - Serif、SansSerif、Monospaced、Dialog 和 DialogInput。這些邏輯字型不是安裝在系統任何位置的實際字型庫。它們僅僅是 Java 執行時識別的字型型別名稱。這些必須對映到安裝在系統上的某些物理字型。

  • 物理字型 - 這些字型是實際的字型庫,例如 TrueType 或 PostScript Type 1 字型。物理字型可以是 Arial、Time、Helvetica、Courier 或許多其他字型,包括國際字型。

  • 字型擴充套件 - JasperReports 庫可以透過其對字型擴充套件的內建支援,在執行時利用動態註冊的字型。可以使用字型擴充套件使字體系列列表可用於 JasperReports。它們由外觀相似的字體面組成,並支援特定的語言環境。

如上表所述,我們需要在fontName屬性中指定物理字型的名稱、邏輯字型的名稱或註冊的 JasperReports 字型擴充套件中的字體系列的名稱。

PDF 字型名稱

JasperReports 庫在將報表匯出到 PDF(行動式文件格式)時使用 iText 庫。PDF 檔案可以在各種平臺上檢視,並且始終看起來相同。部分原因在於,在此格式中,有一種特殊的處理字型的方式。匯出到 PDF 時,fontName屬性無效。pdfFontName屬性存在於我們需要指定字型設定的地方。

iText 庫知道如何處理內建字型和 TTF 檔案,並識別以下內建字型名稱 -

  • Courier
  • Courier-Bold
  • Courier-BoldOblique
  • Courier-Oblique
  • Helvetica
  • Helvetica-Bold
  • Helvetica-BoldOblique
  • Helvetica-Oblique
  • Symbol
  • Times-Roman
  • Times-Bold
  • Times-BoldItalic
  • Times-Italic
  • ZapfDingbats

根據 iText 庫的先決條件,要使用字型,我們需要指定以下內容之一作為字型名稱 -

  • 上述列表中的內建字型名稱。

  • TTF(True Type Font)檔案的名稱,它可以在磁碟上找到。

  • 字型的真實名稱,前提是包含該字型的 TTF 檔案已在之前向 iText 註冊或在註冊字型時已定義別名。

基於上述先決條件,pdfFontName屬性可以包含以下值之一 -

  • 上述列表中內建 PDF 字型的名稱。

  • 匯出到 PDF 時,可以在執行時位於磁碟上的 TTF 檔案的名稱。

  • 已註冊字型的真實名稱。

  • 作為字型檔案向 iText 註冊的字型的鍵的字尾(net.sf.jasperreports.export.pdf.font之後的部分)。

預設字型和繼承

每個文字元素都繼承其父元素的字型和樣式屬性,而父元素又從其父元素繼承這些屬性。如果未為元素定義任何樣式和/或字型,則將應用在 <jasperReport/> 根元素中宣告的預設樣式(和/或字型 - 但現在已棄用)。

在 JasperReports 中定義預設樣式或字型不是強制性的。如果未為給定元素定義字型,則引擎將查詢繼承的字型屬性,或者,如果未在此方式找到任何屬性,則它將在/src/default.jasperreports.properties檔案中查詢net.sf.jasperreports.default.font.name屬性。其值定義了當未為文字元素顯式定義字型屬性或從其父元素繼承時要使用的字體系列的名稱。

下表列出了/src/default.jasperreports.properties檔案中定義的主要預設字型屬性及其值 -

屬性 描述
net.sf.jasperreports.default.font.name=SansSerif 預設字型名稱。
net.sf.jasperreports.default.font.size=10 預設字型大小。
net.sf.jasperreports.default.pdf.font.name=Helvetica 預設 PDF 字型。
net.sf.jasperreports.default.pdf.encoding=Cp1252 預設 PDF 字元編碼。
net.sf.jasperreports.default.pdf.embedded=false 預設情況下,PDF 字型不嵌入。

示例

為了演示使用字型和字型屬性以獲得特定的文字外觀,讓我們編寫新的報表模板 (jasper_report_template.jrxml)。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 = "595" pageHeight = "842"
   columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "30"
   bottomMargin = "30">

   <title>
      <band height = "682">
      
      <staticText>
         <reportElement x = "0" y = "50" width = "150" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[Welcome to TutorialsPoint!]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "50" width = "390" height = "40"/>
         <textElement/>
         
         <text>
           <![CDATA[<staticText>
           <reportElement x = "0" y = "50" width = "150" height = "40"/>
           <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "100" width = "150" height = "40"/>
         
         <textElement>
            <font size = "12"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "100" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "100" width = "150" height = "40"/>
            
            <textElement>
               <font size = "14"/>
            </textElement>
				
            <text> Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "150" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "150" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "250" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "200" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "200" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "300" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "250" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isItalic = "true" 
               isUnderline = "true" pdfFontName = "Courier-Oblique"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "250" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "350" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isItalic = "true"
                  isUnderline = "true" pdfFontName = "Courier-Oblique"/>
            </textElement>
            
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "300" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isBold = "true"
               isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
         </textElement>
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "300" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "400" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isBold = "true"
                  isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "350" width = "150" height = "40" 
            forecolor = "#FF0000"/>
         
         <textElement>
            <font size = "14"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "350" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "450" width = "150" height = "40"
               forecolor = "red"/>
            
            <textElement><font size = "14"/></textElement>
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "400" width = "150" height = "40" mode = "Opaque"
            forecolor = "#00FF00" backcolor = "#FFFF00"/>
         
         <textElement>
            <font fontName = "Serif" size = "12" isBold = "true" 
               pdfFontName = "Times-Bold"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "400" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "500" width = "150" height = "40"
               forecolor = "green" backcolor = "#FFFF00" mode = "Opaque"/>
            
            <textElement>
               <font fontName = "Serif" size = "12" isBold = "true"
                  pdfFontName = "Times-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "450" width = "150" height = "40" mode = "Opaque"
            forecolor = "#0000FF" backcolor = "#FFDD99"/>
         
         <textElement textAlignment = "Center" verticalAlignment = "Middle">
            <font fontName = "SansSerif" size = "12" isBold = "false"
            isItalic = "true" pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "450" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "550" width = "150" height = "90"
               forecolor = "blue" backcolor = "#FFDD99" mode = "Opaque"/>
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font fontName = "SansSerif" size = "12" isBold = "false"
                  pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement mode = "Opaque" x = "0" y = "500" width = "150" height = "40"
            forecolor = "#FF0000" backcolor = "#99DDFF"/>
         
         <textElement textAlignment = "Right" verticalAlignment = "Bottom">
            <font fontName = "SansSerif" size = "12" isBold = "true"
               pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "500" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "650" width = "150" height = "90"    forecolor = "red"
               backcolor = "#99DDFF" mode = "Opaque"/>
            
            <textElement textAlignment = "Right" verticalAlignment = "Bottom">
               <font fontName = "SansSerif" size = "12" isBold = "true"
                  pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      
      </staticText>
   
   </band>
</title>

</jasperReport>

填充和生成報表的 Java 程式碼如下所示。讓我們將此檔案JasperFontsReportFill.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 JasperFontsReportFill {
   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:\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.JasperFontsReportFill(viewFullReport 是預設目標)如下 -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperFontsReportFill
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, defaulting to build.
   [javac] Compiling 5 source files 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.JRXmlDigesterFactory).
   [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.JasperFontsReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 45 minutes 3 seconds

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Fonts Example

在這裡,我們可以看到文字“Welcome to TutorialsPoint”以不同的字型格式顯示。

Unicode 支援

在 JasperReports 中,處理文字需要一些專門的工具來處理字元表示和文字格式屬性。任何文字都可以被視為具有特定表示結構的字元序列。文字外觀包括佈局(和段落)以及字型設定。但在大多數情況下,文字佈局保持不變,字型設定在不同語言環境中執行報表時可能會發生變化。

我們知道不同的語言需要不同的字元集來表示特定的字元。因此,處理文字意味著處理字型。但是,有關如何在 JasperReports 中使用字型的詳細討論可在第 報表字型 章中找到。

關於給定報表中文字內容的主要功能之一是將其國際化。這意味著,我們可以在不同的本地化環境中執行報表,使用不同的語言和其他本地化設定,而無需任何硬編碼修改。當報表旨在進行國際化時,字元編碼是一個重要的功能。

字元編碼

字元是最小的書寫單位,傳達有意義的資訊。它是一個抽象的概念,字元沒有視覺外觀。“大寫拉丁字母 A”與“小寫拉丁字母 a”以及“大寫西裡爾字母 A”和“大寫希臘字母 Alpha”是不同的字元。

字元的視覺表示稱為字形。特定的一組字形稱為字型。“大寫拉丁字母 A”、“大寫西裡爾字母 A”和“大寫希臘字母 Alpha”可能具有相同的字形,但它們是不同的字元。同時,Times New Roman、Gill Sans 和 Poetica chancery italic 中“大寫拉丁字母 A”的字形可能看起來非常不同,但它們仍然表示相同的字元。

可用字元的集合稱為字元集。給定字元在字元集中的位置(索引)稱為其程式碼位置或程式碼點。在給定字元集中以數字方式表示程式碼點的方法稱為字元編碼

編碼通常以八位位元組表示。八位位元組是一組八個二進位制數字,即八個 1 和 0。八位位元組可以表示介於 0 和 255 之間或介於 0x00 和 0xFF 之間的數字範圍,以使用十六進位制表示法。

Unicode

Unicode 是一種字元集,包含了世界上大多數語言使用的字元。它可以容納數百萬個字元,並且已經包含了數十萬個。Unicode 分為 64K 個字元的“平面”。在大多數情況下,只使用第一個平面,稱為基本多語言平面或 BMP。

UTF-8 是推薦的編碼方式。它使用可變數量的位元組來表示不同的字元。

在 JRXML 檔案中,編碼屬性在頭部指定。它在報表編譯時用於解碼 XML 內容。例如,如果報表只包含法語單詞和 ç、é、â 等字元,則 ISO-8859-1(也稱為 Latin-1)編碼就足夠了。

<?xml version = "1.0" encoding = "ISO-8859-1"?>

如上所示,理想情況下,我們可以選擇適合最小字元集的編碼,該字元集可以正確表示文件中的所有字元。但在多語言文件(即包含多種語言拼寫單詞的文件)的情況下,應選擇適合最小字元集的編碼,即使這些字元屬於不同的語言,也能夠正確表示文件中的所有字元。能夠處理多語言文件的字元編碼之一是 **UTF-8**,它被 JasperReports 用作預設編碼值。

在國際化過程中,文字通常儲存在資源包檔案中,而不是儲存在文件中。因此,在某些情況下,JRXML 本身看起來完全相容 ASCII,但在執行時生成的報表確實包含了無法用 ASCII 讀取的文字。因此,對於某種型別的文件匯出格式(例如 CSV、HTML、XHTML、XML 和文字),也必須知道生成文件的編碼。不同的語言由不同的字元編碼支援。因此,每次都需要在本地化環境中執行報表。此外,我們必須知道,生成文件語言的最合適的字元編碼是什麼。在這種情況下,JRXML 檔案本身中定義的編碼屬性可能不再有用。

為了解決此類問題,我們可以使用一個名為 net.sf.jasperreports.export.character.encoding 的匯出自定義屬性。此匯出自定義屬性預設為 UTF-8,並且存在於 JasperReports 中。

此預設值設定在 default.jasperreports.properties 檔案中。對於匯出時的更具體選項,CHARACTER_ENCODING 匯出引數也可用。

示例

為了演示如何在 Jasperreports 中使用 Unicode 支援,讓我們編寫新的報表模板 (jasper_report_template.jrxml)。**將其儲存到 C:\tools\jasperreports-5.0.1\test** 目錄。在這裡,我們將使用 Unicode 字元 (\uXXXX) 顯示不同語言的文字。任何使用 UTF-8 編碼的字元都可以僅使用其 4 位十六進位制程式碼來表示。例如,希臘字母 Γ 可以寫成 \u0393。當遇到此類表示法時,引擎會呼叫字元集中相應的字元表示,並且只會打印出該特定字元。JRXML 的內容如下所示:

<?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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "GreekText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
         "\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
         "\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
         "\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
         "\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
      </defaultValueExpression>
   </parameter>

   <parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
         "\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
         "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
         "\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
      </defaultValueExpression>
   </parameter>
   
   <title>
      <band height = "782">
         
         <textField>
            <reportElement x = "0" y = "50" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "50" width = "340" height = "60"/>
            <textElement/>
            
            <text>
               <![CDATA["GreekText and CyrillicText"]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement x = "0" y = "120" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "120" width = "340" height = "60"/>
            <textElement/>
            <text><![CDATA["GreekText and CyrillicText"]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "0" y = "190" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14" isItalic = "true" 
                  isUnderline = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "190" width = "340" height = "60"/>
            <textElement/>
            <text><![CDATA["GreekText and CyrillicText"]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "0" y = "260" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14" isBold = "true" 
                  isItalic = "true" isUnderline = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <staticText>
            <reportElement x = "210" y = "260" width = "340" height = "60"/>
            <textElement/>
            <text><![CDATA["GreekText and CyrillicText"]]></text>
         </staticText>

         <textField>
            <reportElement x = "0" y = "330" width = "200" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName="DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ArabicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <textField>
            <reportElement x = "210" y = "330" width = "340" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName = "DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{HebrewText}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>
	
</jasperReport>

在上面的檔案中,我們可以看到 UTF-8 編碼的存在。此外,本地化的 Unicode 文字片段儲存在文件引數中。

填充和生成報表的 Java 程式碼如下所示。讓我們將此檔案 **JasperUnicodeReportFill.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 JasperUnicodeReportFill {
   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:\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.JasperUnicodeReportFill**(viewFullReport 是預設目標)如下所示:

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill
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, defaulting t
   [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.JRXmlDigesterFactory).
   [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.JasperUnicodeReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 4 minutes 1 second

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Unicode Example

在這裡,我們可以看到顯示的文字使用不同的語言。我們還看到這些語言在同一頁面上組合在一起,並且混合在同一個文字元素中。

報表樣式

JasperReports 具有一個 <style> 功能,有助於控制報表模板中的文字屬性。此元素是在報表級別宣告的一組樣式設定。<style> 元素控制諸如前景顏色、背景顏色、字型是否為粗體、斜體或普通、字型大小、字型的邊框以及許多其他屬性。樣式可以擴充套件其他樣式,並新增或覆蓋父樣式的屬性。

樣式屬性

一個 <style> 元素具有許多屬性。以下表格列出了一些最常用的屬性:

序號 屬性及描述
1

name

是必須的。它必須是唯一的,因為它在整個報表中引用相應的報表樣式。

2

isDefault

指示此樣式是否為文件的預設樣式。

3

style

是對父樣式的引用。

4

mode

指定元素的透明度。可能的值為 OpaqueTransparent

5

forecolor

是物件的 foreground color 前景色。

6

backcolor

是物件的 background color 背景色。

7

fill

確定用於填充物件的填充圖案。目前,允許的唯一值為 Solid

6

radius

指定矩形角弧的半徑。

7

scaleImage

僅為影像指定縮放比例。可能的值:Clip, FillFrame, RetainShape, RealHeight,RealSize

8

hAlign

指定水平對齊方式。可能的值:Left, Center, Right,Justified

9

vAlign

指定垂直對齊方式。可能的值:Top, Middle,Bottom

10

rotation

指定元素的旋轉。可能的值:None, Left, Right,UpsideDown

11

lineSpacing

指定文字行之間的行距。可能的值:Single, 1_1_2, Double

12

markup

指定格式化文字的標記樣式。

13

fontName

指定字型名稱。

14

fontSize

指定字型大小。

15

isBold

指示字型樣式是否為粗體。

16

isItalic

指示字型樣式是否為斜體。

17

isUnderline

指示字型樣式是否為下劃線。

18

isStrikeThrough

指示字型樣式是否為刪除線。

19

pdfFontName

指定相關的 PDF 字型名稱。

20

pdfEncoding

指定 PDF 輸出格式的字元編碼。

22

isPdfEmbedded

指示 PDF 字型是否嵌入。

23

pattern

指定格式化文字的格式模式。

24

isBlankWhenNull

指示如果表示式計算結果為 null,是否應顯示空字串(空格)。

條件樣式

在某些情況下,只有在滿足特定條件時才應應用樣式(例如,在報表詳細資訊部分交替顯示相鄰行的顏色)。這可以透過使用條件樣式來實現。

條件樣式有兩個元素:

  • 布林條件表示式
  • 樣式

只有當條件計算結果為 true 時,才會使用該樣式。

將樣式應用於報表元素

任何型別的報表元素都可以使用 style 屬性引用報表樣式定義。因此,樣式定義中宣告的所有適用於當前元素的樣式屬性都將被繼承。要覆蓋繼承的值,可以使用報表元素級別指定的樣式屬性。

樣式模板

我們可以透過在公共位置定義樣式來建立一組具有相同外觀的報表。然後,報表模板可以引用此公共樣式模板。樣式模板是一個 XML 檔案,其中包含一個或多個樣式定義。樣式模板檔案按照慣例使用 ***.jrtx** 副檔名,但這並非強制性要求。

樣式模板包含以下元素:

  • <jasperTemplate> - 這是樣式模板檔案的根元素。

  • <template> - 此元素用於包含對其他模板檔案的引用。此元素的內容被解釋為所引用模板檔案的位置。

  • <style> - 此元素與報表設計模板(JRXML 檔案)中同名元素相同,區別在於樣式模板中的樣式不能包含條件樣式。此限制是由條件樣式涉及報表表示式,並且表示式只能在單個報表定義的上下文中解釋這一事實造成的。

對樣式模板的引用在 JRXML 報表中包含為 <template> 元素。樣式模板在報表填充時載入,並且樣式名稱引用在所有模板載入後解析。在載入樣式模板並將樣式名稱解析為樣式時,會建立一個樣式模板樹/圖,樹的頂部是在報表中定義的一組樣式。在此樹上,樣式名稱引用解析為在深度優先遍歷中與名稱匹配的最後一個樣式。

示例

讓我們嘗試一下條件樣式和樣式模板。讓我們將 <style> 元素 alternateStyle 新增到我們現有的報表模板中(第 報表設計 章)。根據條件,偶數計數的字型顏色變為藍色。我們還包含了一個樣式模板 "styles.jrtx"。修改後的報表模板 (jasper_report_template.jrxml) 如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄:

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <template>"styles.jrtx"</template>
   
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]>
         </conditionExpression>
			
         <style forecolor = "blue" isBold = "true"/>
      </conditionalStyle>
   </style>
   
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>

   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
   </variable>

   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
				
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression><![CDATA["Title"]]></anchorNameExpression>
         </textField>

         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
				
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
				
         </staticText>
         
         <textField>
            <reportElement style = "alternateStyle" x = "414" y = "0" 
               width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" 
               style = "Strong"/>
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

樣式模板 styles.jrtx 的內容如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄。

<?xml version = "1.0"?>

<!DOCTYPE jasperTemplate PUBLIC "-//JasperReports//DTD Template//EN"
  "http://jasperreports.sourceforge.net/dtds/jaspertemplate.dtd">

<jasperTemplate>
   <style name = "Strong" isBold = "true" pdfFontName = "Helvetica-Bold" 
      backcolor = "lightGray forecolor = "green"/>
</jasperTemplate>

報表填充的 Java 程式碼保持不變。檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java 的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示 -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java 的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

我們將使用常規的 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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 3 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Style Example

在這裡,我們可以看到偶數計數(在國家列中)的字型顏色已更改為藍色。在名稱列中,字型顏色已更改為綠色(此樣式是從樣式模板中引用的)。

報表指令碼

在我們之前的章節中,我們已經看到報表上顯示的資料通常是從報表引數和報表欄位中獲取的。可以使用報表變數及其表示式來處理此資料。在某些情況下,使用報表表示式或變數無法輕鬆實現複雜的功能。例如,複雜的字串操作、在記憶體中構建對映或物件列表或使用第三方 Java API 操作日期。對於此類情況,JasperReports 為我們提供了一種簡單而強大的方法來使用 **指令碼**。

指令碼是在報表事件發生時每次執行的 Java 程式碼序列。可以透過指令碼影響報表變數的值。

指令碼宣告

我們可以透過兩種方式宣告指令碼:

  • 使用 <scriptlet> 元素。此元素具有 name 屬性和 class 屬性。class 屬性應指定類的名稱,該類擴充套件 JRAbstractScriptlet 類。該類必須在報表填充時的類路徑中可用,並且必須具有一個空建構函式,以便引擎可以動態地例項化它。

  • 使用報表模板 (JRXML) 中 <jasperReport> 元素的 scriptletClass 屬性。透過使用指令碼的完全限定名稱(包括整個包名稱)設定此屬性,我們表明我們要使用指令碼。使用此屬性建立的指令碼例項充當指令碼列表中的第一個指令碼,並具有預定義的名稱 REPORT。

指令碼類

指令碼程式(Scriptlet)是一個 Java 類,它必須繼承以下類之一:

  • net.sf.jasperreports.engine.JRAbstractScriptlet − 此類包含許多抽象方法,每個實現都必須重寫這些方法。JasperReports 會在適當的時候自動呼叫這些方法。開發人員必須實現所有抽象方法。

  • net.sf.jasperreports.engine.JRDefaultScriptlet − 此類包含 JRAbstractScriptlet 中每個方法的預設空實現。開發人員只需要實現其專案所需的那些方法。

下表列出了上述類中的方法。在報表填充階段,報表引擎會在適當的時間呼叫這些方法。

序號 方法及描述
1

public void beforeReportInit()

報表初始化之前呼叫。

2

public void afterReportInit()

報表初始化之後呼叫。

3

public void beforePageInit()

每個頁面初始化之前呼叫。

4

public void afterPageInit()

每個頁面初始化之後呼叫。

5

public void beforeColumnInit()

每個列初始化之前呼叫。

6

public void afterColumnInit()

每個列初始化之後呼叫。

7

public void beforeGroupInit(String groupName)

在引數中指定的組初始化之前呼叫。

8

public void afterGroupInit(String groupName)

在引數中指定的組初始化之後呼叫。

9

public void beforeDetailEval()

在評估報表詳細資訊部分中的每個記錄之前呼叫。

10

public void afterDetailEval()

在評估報表詳細資訊部分中的每個記錄之後呼叫。

每個報表可以指定任意數量的指令碼程式。如果未為報表指定指令碼程式,引擎仍然會建立一個唯一的 JRDefaultScriptlet 例項並將其註冊到內建的 REPORT_SCRIPTLET 引數中。

我們可以向指令碼程式新增任何需要的其他方法。報表可以透過使用內建引數 REPORT_SCRIPTLET 呼叫這些方法。

全域性指令碼程式

我們可以透過另一種方式將指令碼程式與報表關聯,即透過全域性宣告指令碼程式。這使得指令碼程式適用於在給定的 JasperReports 部署中填充的所有報表。由於可以將指令碼程式作為擴充套件新增到 JasperReports 中,因此這變得很容易。指令碼程式擴充套件點由 net.sf.jasperreports.engine.scriptlets.ScriptletFactory 介面表示。JasperReports 會在執行時載入透過擴充套件提供的全部指令碼程式工廠。然後,它會詢問每個工廠它們想要應用於當前正在執行的報表的指令碼程式例項列表。在請求指令碼程式例項列表時,引擎會提供一些上下文資訊,工廠可以使用這些資訊來確定哪些指令碼程式實際上適用於當前報表。

報表監管器

監管器只是全域性指令碼程式的擴充套件,使我們能夠解決報表引擎在執行時生成報表時進入無限迴圈的問題。無效的報表模板無法在設計時檢測到,因為大多數情況下,進入無限迴圈的條件取決於在執行時饋送到引擎的實際資料。報表監管器有助於確定某個報表是否已進入無限迴圈,並且可以停止它。這可以防止執行報表的機器資源耗盡。

JasperReports 有兩個簡單的報表監管器,它們將根據指定的最大頁面數或指定的超時間隔停止報表執行。它們是:

  • net.sf.jasperreports.governors.MaxPagesGovernor − 這是一個全域性指令碼程式,它查詢兩個配置屬性以確定它是否適用於當前正在執行的報表。配置屬性為:

    • net.sf.jasperreports.governor.max.pages.enabled=[true|false]

    • net.sf.jasperreports.governor.max.pages=[整數]

  • net.sf.jasperreports.governors.TimeoutGovernor− 這也是一個全域性指令碼程式,它查詢以下兩個配置屬性以確定它是否適用。

    配置屬性為:

    • net.sf.jasperreports.governor.timeout.enabled=[true|false]

    • net.sf.jasperreports.governor.timeout=[毫秒]

這兩個監管器的屬性可以在 jasperreports.properties 檔案中全域性設定,或者在報表級別作為自定義報表屬性設定。這很有用,因為不同的報表可以有不同的估計大小或超時限制,而且因為您可能希望為所有報表啟用監管器,同時為某些報表關閉它,反之亦然。

示例

讓我們編寫一個指令碼程式類(MyScriptlet)。檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\MyScriptlet.java 的內容如下:

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;


public class MyScriptlet extends JRDefaultScriptlet {

   public void afterReportInit() throws JRScriptletException{
      System.out.println("call afterReportInit()");
      // this.setVariableValue("AllCountries", sbuffer.toString());
      this.setVariableValue("someVar", new String("This variable value 
         was modified by the scriptlet."));
   }

   public String hello() throws JRScriptletException {
      return "Hello! I'm the report's scriptlet object.";
   }

}

上述指令碼程式類的詳細資訊如下:

  • afterReportInit 方法中,我們將一個值設定為變數 "someVar" this.setVariableValue("someVar", new String("This variable value was modified by the scriptlet.")).

  • 在類的末尾,定義了一個名為 'hello' 的額外方法。這是一個示例,說明可以新增到指令碼程式中的方法,該方法實際上返回一個值,而不是設定變數。

接下來,我們將指令碼程式類引用新增到我們現有的報表模板中(章節 報表設計)。修改後的報表模板(jasper_report_template.jrxml)如下所示。將其儲存到 C:\tools\jasperreports-5.0.1\test 目錄:

<?xml version = "1.0"?>
<!DOCTYPE jasperReport PUBLIC
   "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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 = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50"
   scriptletClass = "com.tutorialspoint.MyScriptlet">
	
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]>
         </conditionExpression>
			
         <style forecolor = "blue" isBold = "true"/>
      </conditionalStyle>
   </style>
   
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription>
         <![CDATA[country]]>
      </fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription>
         <![CDATA[name]]>
      </fieldDescription>
   </field>

   <variable name = "countNumber" class = "java.lang.Integer" 
      calculation = "Count">
      <variableExpression><
         ![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>

   <variable name = "someVar" class = "java.lang.String">
      <initialValueExpression>
        <![CDATA["This is the initial variable value."]]>
      </initialValueExpression>
   </variable>

   <title>
      <band height = "100">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
              <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
              <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
				
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
        
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "50" width = "515" 
               height = "30" forecolor = "#993300"/>
             
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$V{someVar}]]>
            </textFieldExpression>
				
         </textField>

      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15"
               backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
				
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
                
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
            
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535"	height = "14"
               backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
         </staticText>
         
         <textField>
            <reportElement style = "alternateStyle" x="414" y = "0" 
               width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
				
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" />
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <summary>
      <band height = "45">
            
         <textField isStretchWithOverflow = "true">
            <reportElement x = "0" y = "10" width = "515" height = "15" />
            <textElement textAlignment = "Center"/>
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA["There are " + String.valueOf($V{REPORT_COUNT}) +
                  " records on this report."]]>
            </textFieldExpression>
         </textField>
         
         <textField isStretchWithOverflow = "true">
            <reportElement positionType = "Float" x = "0" y = "30" width = "515"
               height = "15" forecolor = "# 993300" />
               
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{REPORT_SCRIPTLET}.hello()]]>
            </textFieldExpression>
            
         </textField>
         
      </band>
   </summary>
	
</jasperReport>

修改後的報表模板的詳細資訊如下:

  • 我們在 <jasperReport> 元素的 scriptletClass 屬性中引用了 MyScriptlet 類。

  • 指令碼程式只能訪問報表欄位和引數,但不能修改它們。但是,指令碼程式可以修改報表變數值。這可以透過呼叫 setVariableValue() 方法來實現。此方法在 JRAbstractScriptlet 類中定義,該類始終是任何指令碼程式的父類。在這裡,我們定義了一個變數 someVar,它將被 MyScriptlet 修改為具有值 This value was modified by the scriptlet

  • 上面的報表模板在摘要部分有一個方法呼叫,說明了如何編寫新方法(在指令碼程式中)並在報表模板中使用它們。($P{REPORT_SCRIPTLET}.hello()

報表填充的 Java 程式碼保持不變。檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java 的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO 檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下所示:

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下所示 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

我們將使用常規的 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, defaulting to bu
   [javac] Compiling 4 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] call afterReportInit()
   [java] call afterReportInit()

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 minutes 49 seconds

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Scriplet Example

在這裡,我們看到從 MyScriptlet 類顯示了兩個訊息:

  • 在標題部分:This variable value was modified by the scriptlet
  • 在底部:Hello! I'm the report's scriptlet object.

建立子報表

子報表是 JasperReports 的一項不錯的功能。此功能允許在一個報表中合併另一個報表,即一個報表可以是另一個報表的子報表。子報表有助於我們保持報表設計的簡單性,因為我們可以建立許多簡單的報表並將它們封裝到主報表中。子報表的編譯和填充方式與普通報表相同。任何報表模板在合併到另一個報表模板中時都可以用作子報表,而無需在報表模板內部進行任何更改。

子報表就像普通報表模板。它們實際上是 net.sf.jasperreports.engine.JasperReport 物件,這些物件在編譯 net.sf.jasperreports.engine.design.JasperDesign 物件 後獲得。

<subreport> 元素

<subreport> 元素用於將子報表引入主報表。以下是 <subreport> JRXML 元素中的子元素列表。

  • <reportElement>

  • <parametersMapExpression> − 用於傳遞包含報表引數的對映到子報表。該對映通常從主報表中的引數獲得,或者透過使用內建的 REPORTS_PARAMETERS_MAP 引數將父報表的引數傳遞到子報表。此表示式應始終返回一個 java.util.Map 物件,其中鍵是引數名稱。

  • <subreportParameter> − 此元素用於將引數傳遞到子報表。它有一個屬性 name,這是必需的。

  • <connectionExpression > − 用於將 java.sql.Connection 傳遞到子報表。僅當子報表模板在報表填充階段需要資料庫連線時才使用它。

  • <dataSourceExpression> − 用於將資料來源傳遞到子報表。此資料來源通常從主報表中的引數獲得,或者透過使用內建的 REPORT_DATA_SOURCE 引數將父報表的資料庫連線傳遞到子報表。

  • 元素(connectionExpression 和 dataSourceExpression)不能同時出現在 <subreport> 元素宣告中。這是因為我們不能同時向子報表提供資料來源和資料庫連線。我們必須選擇其中之一併堅持使用它。

  • <returnValue> − 用於將子報表變數之一的值分配給主報表變數之一。此子元素具有以下屬性:

    • subreportVariable − 此屬性指定要返回其值的子報表變數的名稱。

    • toVariable − 此屬性指定要複製/遞增其值的父報表變數的名稱。

    • calculation − 此屬性可以取以下值:Nothing、Count、DistinctCount、Sum、Average、Lowest、Highest、StandardDeviation、Variance。屬性 calculation 的預設值為“Nothing”。

    • incrementerFactoryClass − 此屬性指定用於建立遞增器例項的工廠類。

  • <subreportExpression> − 指示在何處查詢子報表的編譯報表模板。此元素具有一個 class 屬性。class 屬性可以取以下任何值:java.lang.String、java.io.File、java.net.URL、java.io.InputStream、net.sf.jasperreports.engine.JasperReport。預設值為 java.lang.String

  • isUsingCache − 這是 <subreport> 元素的一個屬性。這是一個布林值,當設定為 true 時,報表引擎將嘗試使用指定的源識別先前載入的子報表模板物件。此快取功能僅適用於表示式返回 java.lang.String 物件作為子報表模板源的子報表元素,這些物件表示檔名、URL 或類路徑資源。

示例

讓我們舉一個簡單的例子來演示使用 JRDataSource 建立子報表。首先,讓我們編寫兩個新的報表模板,一個作為子報表,另一個作為主報表。子報表(address_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 = "address_report_template" pageWidth = "175" pageHeight = "842" 
   columnWidth = "175" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0">

   <field name = "city" class = "java.lang.String"/>
   <field name = "street" class = "java.lang.String"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "20" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "14" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Addresses]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "12" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "12" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "27" splitType = "Stretch">
         
         <textField>
            <reportElement x = "0" y = "0" width = "120" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{city}+" Address:"]]>
            </textFieldExpression>
         </textField>
         
         <textField isStretchWithOverflow = "true">
            <reportElement x = "120" y = "0" width = "435" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{street}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "8" splitType = "Stretch"/>
   </columnFooter>
  
   <pageFooter>
      <band height = "11" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "9" splitType = "Stretch"/>
   </summary>

</jasperReport>

由於我們使用資料來源,因此我們需要編寫一個對應的 POJO 檔案 SubReportBean.java,如下所示。將其儲存到目錄 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint

package com.tutorialspoint;

public class SubReportBean {
   private String city;
   private String street;

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   public String getStreet() {
      return street;
   }

   public void setStreet(String street) {
      this.street = street;
   }
}

在這裡,我們聲明瞭兩個欄位 'city''street',並定義了相應的 getter 和 setter 方法。

現在,讓我們更新我們現有的 DataBean 檔案。我們將新增一個新的欄位 subReportBeanList,它是一個 java.util.List。此欄位將儲存 SubReportBean 物件的列表。DataBean 檔案的內容如下所示。將其儲存到目錄 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint。

package com.tutorialspoint;

import java.util.List;

public class DataBean {
   private String name;
   private String country;
   private List<SubReportBean> subReportBeanList;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }

   public List<SubReportBean> getSubReportBeanList() {
      return subReportBeanList;
   }

   public void setSubReportBeanList(List<SubReportBean> subReportBeanList) {
      this.subReportBeanList = subReportBeanList;
   }
}

現在,讓我們更新檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java。此檔案的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {

      // Create sub report data
      SubReportBean subBean1 = new SubReportBean();
      subBean1.setCity("Mumbai");
      subBean1.setStreet("M.G.Road");
      SubReportBean subBean2 = new SubReportBean();
      subBean2.setCity("New York");
      subBean2.setStreet("Park Street");
      SubReportBean subBean3 = new SubReportBean();
      subBean3.setCity("San Fransisco");
      subBean3.setStreet("King Street");

      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      // Create master report data
      dataBeanList.add(produce("Manisha", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Dennis Ritchie", "USA",
         Arrays.asList(subBean2)));
      dataBeanList.add(produce("V.Anand", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Shrinath", "California",
         Arrays.asList(subBean3)));

      return dataBeanList;
   }

   /*
    * This method returns a DataBean object,
    * with name, country and sub report
    * bean data set in it.
    */
   private DataBean produce(String name, String country,
      List<SubReportBean> subBean) {
      DataBean dataBean = new DataBean();

      dataBean.setName(name);
      dataBean.setCountry(country);
      dataBean.setSubReportBeanList(subBean);

      return dataBean;
   }
}

在上述檔案中的 produce() 方法中,我們正在設定 SubReportBean 列表。

現在,讓我們編寫一個新的主報表模板(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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth ="555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "SUBREPORT_DIR" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression>
         <![CDATA["C:\\tools\\jasperreports-5.0.1\\test\\"]]>
      </defaultValueExpression>
   </parameter>
   
   <field name = "country" class = "java.lang.String"/>
   <field name = "name" class = "java.lang.String"/>
   <field name = "subReportBeanList" class = "java.util.List"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "35" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "204" height = "34"/>
            
            <textElement>
               <font size = "26" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Contact Report]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "17" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "21" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "112" splitType = "Stretch">
            
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Name:]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "20" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Country:]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "104" y = "0" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "104" y = "20" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <subreport>
            <reportElement positionType = "Float" x = "335" y = "25" width = "175"
               height = "20" isRemoveLineWhenBlank = "true" backcolor = "#99ccff"/>

            <dataSourceExpression>
               new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
                  ($F{subReportBeanList})
            </dataSourceExpression>
            
            <subreportExpression class = "java.lang.String">
               <![CDATA[$P{SUBREPORT_DIR} + "address_report_template.jasper"]]>
            </subreportExpression>
         </subreport>
         
         <line>
            <reportElement x = "0" y = "50" width = "550" height = "1"/>
         </line>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "19" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "18" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "14" splitType = "Stretch"/>
   </summary>

</jasperReport>

在上面的模板中,我們定義了一個新的引數“SUBREPORT_DIR”,它定義了子報表的路徑。我們定義了一個型別為 java.util.List 的欄位 subReportBeanList,它對應於 DataBean 檔案中的屬性。元素 <subreport> 具有子元素 <dataSourceExpression>。我們將列表 subReportBeanList 放入 JRBeanCollectionDataSource 的例項中。在子元素 <subreportExpression/> 中,我們給出了子報表名稱(AddressReport.jasper)。

現在,讓我們編寫一個新類 CreateReport 來編譯和執行我們的報表模板。檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java 的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class CreateReport {

   public static void main(String[] args) {
      String masterReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.jrxml";
      String subReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/AddressReport.jrxml";
      String destFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.JRprint";
			
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      try {
         /* Compile the master and sub report */
         JasperReport jasperMasterReport = JasperCompileManager
            .compileReport(masterReportFileName);
         JasperReport jasperSubReport = JasperCompileManager
            .compileReport(subReportFileName);

         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("subreportParameter", jasperSubReport);
         JasperFillManager.fillReportToFile(jasperMasterReport, 
            destFileName, parameters, beanColDataSource);

      } catch (JRException e) {

         e.printStackTrace();
      }
      System.out.println("Done filling!!! ...");
   }
}

在這裡,我們看到我們正在編譯主報表和子報表模板,併為報表填充傳遞主報表(.jasper)檔案。

報表生成

現在,我們所有的檔案都已準備就緒,讓我們使用常規的 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.CreateReport(viewFullReport 是預設目標)如下所示:

Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes

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, defaulting to
   [javac] Compiling 7 source files 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.JRXmlDigesterFactory).
   [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.CreateReport
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done filling!!! ...

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 72 minutes 13 seconds

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper SubReport Example

這裡,我們可以看到顯示了 Name、Country 和 Address 屬性。

建立圖表

以前,人們不得不依賴指令碼程式來收集圖表資料,並在報表模板中使用影像元素呈現圖表。JasperReports 現在簡化了這一過程,因為它使用新的圖表元件內建支援圖表。

使用新的圖表元件,使用者只需要應用視覺設定並定義表示式來幫助構建圖表資料集。JasperReports 使用 JFreeChart 作為底層圖表庫。在配置新的圖表元件時,涉及以下三個元件:

  • 整體圖表元件。

  • 圖表資料集(它對圖表資料相關的設定進行分組)。

  • 圖表繪圖(它對與圖表項呈現方式相關的視覺設定進行分組)。

JasperReports 目前支援以下型別的圖表:餅圖、3D 餅圖、條形圖、3D 條形圖、XY 條形圖、堆疊條形圖、3D 堆疊條形圖、折線圖、XY 折線圖、面積圖、XY 面積圖、堆疊面積圖、散點圖、氣泡圖、時間序列圖、高低開收圖、K 線圖、多軸圖、儀表盤、溫度計和甘特圖。

圖表屬性

圖表是普通的報表元素,因此它們與所有其他報表元素共享一些屬性。有一個名為 <chart> 的 JRXML 元素用於建立所有型別的圖表。此元素對適用於所有型別圖表的特殊圖表特定設定進行分組。

圖表子元素

<chart> 元素的子元素如下:

  • <reportElement> - 這些是可以顯示的物件,例如靜態文字、文字欄位、影像、線條和矩形,您可以將它們放在報表模板部分中。

  • <Box> - 此元素用於用邊框圍繞圖表,邊框可以在每一側自定義。

  • <chartTitle> - 此元素用於放置圖表的標題。position 屬性決定圖表在報表中的標題位置。此元素具有屬性 - Position(值可以是 TopBottomLeftRight。預設值為 Top)、color。<chartTitle> 以fonttitleExpression 作為子元素。

  • <chartSubtitle> - 此元素用於放置圖表的副標題。此元素具有屬性 - color。<chartSubtitle> 以fontsubtitleExpression 作為子元素。

  • <chartLegend> - 使用此元素可以控制與字型相關的屬性以及圖表圖例的文字顏色和背景顏色。此元素具有屬性 - textColorbackgroundColor

  • <anchorNameExpression> - 此元素建立錨點的目標。

  • <hyperlinkReferenceExpression> - 此元素包含一個報表表示式,指示外部資源(通常是 URL)的名稱。

  • <hyperlinkAnchorExpression> - 超連結指向外部資源中的錨點。

  • <hyperlinkPageExpression> - 超連結指向當前報表中的頁面。

  • <hyperlinkTooltipExpression> - 此元素控制超連結的工具提示。表示式的型別應為 java.lang.String

  • <hyperlinkParameter> - 此元素存在時,會根據引數值生成最終的超連結。

圖表屬性

<chart> 元素中可用於所有圖表型別的屬性如下:

  • isShowLegend - 此屬性用於確定是否在報表上顯示圖表圖例。值可以是 truefalse。預設值為 true

  • evaluationTime - 確定何時評估圖表的表示式。值可以是 NowReportPageColumnGroupBand。預設值為 Now

  • evaluationGroup - 此屬性確定用於評估圖表表示式的組的名稱。此屬性的值必須與我們希望用作圖表評估組的組的名稱匹配。

  • hyperlinkType - 此屬性可以儲存任何文字值。預設值為 None。這意味著,即使存在特殊的超連結表示式,文字欄位和影像也不表示超連結。

  • hyperlinkTarget - 此屬性有助於在檢視器中單擊指定連結時自定義其行為。值可以是 SelfBlank。預設值為 Self

  • bookmarkLevel - 將此屬性設定為正整數時,將在匯出到 PDF 的報表中生成書籤。預設值為 0

  • customizerClass - 這是類的名稱(可選),可用於自定義圖表。此元素的值必須是包含自定義類名稱的字串。

圖表自定義

如上所述,JasperReports 使用 JFreeChart 作為底層圖表庫。JFreeChart 包含 JasperReports 不直接支援的功能。我們可以透過在 <chart> 元素中提供自定義類來利用這些功能。自定義類只不過是 net.sf.jasperreports.engine.JRChartCustomizer 介面的實現。實現此介面的最簡單方法是擴充套件 net.sf.jasperreports.engine.JRAbstractChartCustomizer 類,從而訪問引數、欄位和變數,以便基於報表資料更靈活地自定義圖表。

圖表資料集

所有圖表型別的一個共同屬性是 <dataset> 元素。圖表資料集有助於對映報表資料並在執行時檢索圖表資料。每種圖表型別包含不同的子元素來定義圖表的表示式。這些表示式定義用於生成圖表的資料。所有這些子元素都包含一個 <dataset> 元素,該元素定義何時評估和重置圖表的表示式。

JasperReports 中提供了多種型別的圖表資料集,因為每種型別的圖表都使用某些資料集:餅圖、分類圖、XY 圖、時間序列圖、時間段圖、XYZ 圖和高低圖。這些資料集型別中的每一個都實現了 net.sf.jasperreports.engine.JRChartDataset 介面,該介面定義圖表資料集。所有圖表資料集都以相同的方式初始化和遞增;但是,它們僅在它們對映的資料型別或資料系列方面有所不同。

資料集屬性

下表總結了 <dataset> 元素的屬性:

屬性 描述
resetType 此屬性確定何時重置圖表表示式的值。 None、Report、Page、Column、Group。預設值為 Report
resetGroup 此屬性確定重置圖表表示式值的組的名稱。 此屬性的值必須與 JRXML 報表模板中宣告的任何組的名稱匹配。
incrementType 此屬性確定何時重新計算圖表表示式的值。 None、Report、Page、Column、Group。預設值為 "None"
incrementGroup 此屬性確定重新計算圖表表示式的組的名稱。 此屬性的值必須與 JRXML 報表模板中宣告的組的名稱匹配。

下表總結了 <dataset> 元素的子元素:

子元素 描述
<incrementWhenExpression> 可以透過使用此子元素過濾掉不需要的資料來自定義圖表資料集的遞增方式。
<datasetRun> 這包含例項化報表子資料集所需的資訊。

資料集型別

下面解釋特定的資料集型別:

餅圖資料集

餅圖資料集以以下表達式為特徵:

  • <keyExpression> - 表示構成餅圖中扇區的類別。此表示式可以返回任何 java.lang.Comparable 物件。

  • <valueExpression> - 生成與資料集中每個類別/鍵相對應的值。值始終是 java.lang.Number 物件。

  • <labelExpression> - 如果此表示式缺失,圖表將為餅圖中的每個扇區顯示預設標籤。使用此表示式(返回 java.lang.String 值)自定義餅圖的專案標籤。

  • <sectionHyperlink> - 設定與餅圖扇區關聯的超連結。

分類資料集

分類資料集以 <categorySeries> 元素為特徵,該元素包含:

  • <seriesExpression> - 指示系列的名稱。此表示式可以返回任何 java.lang.Comparable 物件。

  • <categoryExpression> - 返回系列表示式指定的系列中每個值的類別名稱。類別是 java.lang.Comparable 物件。

  • <valueExpression> - 生成與資料集中每個類別相對應的值。值始終是 java.lang.Number 物件。

  • <labelExpression> - 如果此表示式缺失,圖表將為圖表中的每個專案顯示預設標籤。使用此表示式(返回 java.lang.String 值)自定義圖表的專案標籤。

  • <itemHyperlink> - 設定與圖表專案關聯的超連結。

XY 資料集

XY 資料集以 <xySeries> 元素為特徵,該元素包含:

  • <seriesExpression> - 指示系列的名稱。此表示式可以返回任何 java.lang.Comparable 物件。

  • <xValueExpression> - 返回表示將新增到當前資料系列的 (x, y) 對中的 X 值的 java.lang.Number 值。

  • <yValueExpression> - 返回表示將新增到當前資料系列的 (x, y) 對中的 Y 值的 java.lang.Number 值。

  • <labelExpression> - 如果此表示式缺失,圖表將為圖表中的每個專案顯示預設標籤。使用此表示式(返回 java.lang.String 值)自定義圖表的專案標籤。

  • <itemHyperlink> - 設定與圖表專案關聯的超連結。

XYZ 資料集

XYZ 資料集以 <xyzSeries> 元素為特徵,該元素包含:

  • <seriesExpression> - 指示系列的名稱。此表示式可以返回任何 java.lang.Comparable 物件。

  • <xValueExpression> - 返回表示將新增到當前資料系列的 (x, y, z) 專案中的 X 值的 java.lang.Number 值。

  • <yValueExpression> - 返回表示將新增到當前資料系列的 (x, y, z) 專案中的 Y 值的 java.lang.Number 值。

  • <zValueExpression> - 返回表示將新增到當前資料系列的 (x, y, z) 專案中的 Z 值的 java.lang.Number 值。

  • <labelExpression> - 如果此表示式缺失,圖表將為圖表中的每個專案顯示預設標籤。使用此表示式(返回 java.lang.String 值)自定義圖表的專案標籤。

  • <itemHyperlink> - 設定與圖表專案關聯的超連結。

時間序列資料集

時間序列資料集以 timePeriod 屬性和 <timeSeries> 元素為特徵。timePeriod 屬性指定資料集中資料系列的型別。時間序列可以包含與天、月、年或其他預定義時間段關聯的數值。可能的值為:Year、Quarter、Month、Week、Day - 這是預設值、Hour、Minute、Second、Millisecond。

<timeSeries> 元素包含:

  • <seriesExpression> - 指示系列的名稱。此表示式可以返回任何 java.lang.Comparable 物件。

  • <timePeriodExpression> − 返回一個 java.util.Date 值,引擎將根據上面提到的 timePeriod 屬性的值從中提取相應的時間段。

  • <valueExpression> − 返回 java.lang.Number 值,在遞增資料集的當前系列時,將其與相應的時間段值關聯。

  • <labelExpression> - 如果此表示式缺失,圖表將為圖表中的每個專案顯示預設標籤。使用此表示式(返回 java.lang.String 值)自定義圖表的專案標籤。

  • <itemHyperlink> - 設定與圖表專案關聯的超連結。

時間段資料集

時間段資料集以 <timePeriodSeries> 元素為特徵,其中包含 -

  • <seriesExpression> - 指示系列的名稱。此表示式可以返回任何 java.lang.Comparable 物件。

  • <startDateExpression> − 指定日期間隔的開始,當數值新增到時間段系列時,將與其關聯。

  • <endDateExpression> − 指定日期間隔的結束,當數值新增到時間段系列時,將與其關聯。

  • <valueExpression> − 返回 java.lang.Number 值,將其與由開始日期和結束日期表示式指定當前日期間隔關聯。

  • <labelExpression> - 如果此表示式缺失,圖表將為圖表中的每個專案顯示預設標籤。使用此表示式(返回 java.lang.String 值)自定義圖表的專案標籤。

  • <itemHyperlink> - 設定與圖表專案關聯的超連結。

高低資料集

高低資料集以以下表達式為特徵 -

  • <seriesExpression> − 目前,高低或燭臺圖表中僅支援一個系列。但是,此單個系列必須由此表示式返回的 java.lang.Comparable 值標識,並且還必須用作圖表圖例中的系列名稱。

  • <dateExpression> − 返回當前(高、低、開、收、量)專案所指的日期。

  • <highExpression> − 返回一個 java.lang.Number 值,當資料集遞增時,它將成為新增到系列中的資料項的一部分。

  • <lowExpression> − 返回一個 java.lang.Number 值,當資料集遞增時,它將成為新增到系列中的資料項的一部分。

  • <openExpression> − 返回一個 java.lang.Number 值,當資料集遞增時,它將成為新增到系列中的資料項的一部分。

  • <closeExpression> − 返回一個 java.lang.Number 值,當資料集遞增時,它將成為新增到系列中的資料項的一部分。

  • <volumeExpression> − 一個數字表達式,返回要用於當前資料項的成交量值。僅用於燭臺圖表。

  • <itemHyperlink> - 設定與圖表專案關聯的超連結。

值資料集

這是一種特殊圖表資料集實現,包含單個值,用於渲染儀表和溫度計圖表。該值使用 <valueExpression> 表示式收集。

圖表繪圖

所有圖表型別中另一個常見的 JRXML 元素是 <plot> 元素。這使我們能夠定義圖表的幾個特性,例如方向和背景顏色。繪圖根據圖表型別而有所不同。

繪圖屬性

下表總結了 <plot> 元素的屬性 -

屬性 描述
backcolor 此屬性定義圖表的背景顏色。 任何六位十六進位制值都是此屬性的有效值。十六進位制值必須以 # 開頭。
方向 此屬性定義圖表的方位。 水平、垂直 預設值為“垂直”
backgroundAlpha 此屬性定義圖表的背景顏色的透明度。 此屬性的有效值包括 0 到 1(包括)之間的任何十進位制數。數字越高,背景越不透明。預設值為“1”。
foregroundAlpha 此屬性定義圖表的前景顏色的透明度。 此屬性的有效值包括 0 到 1(包括)之間的任何十進位制數。數字越高,背景越不透明。預設值為“1”。
labelRotation 此屬性允許旋轉 x 軸上的文字標籤以順時針或逆時針旋轉。此屬性僅適用於 x 軸不是數字或不顯示日期的圖表。 預設值為“0.0”。

<plot> 元素有一個子元素 <seriesColor>,其屬性為:seriesOrdercolor。此元素自定義系列的顏色及其在顏色序列中的位置。

圖表繪圖的特定設定

  • piePlot − 它沒有特定設定

  • pie3DPlot − 包含 depthFactor 屬性,這是一個介於 0 到 1 之間的數值,表示餅圖的深度佔繪圖區域高度的百分比。

  • barPlot − 可以顯示或隱藏刻度標籤、刻度標記或專案標籤,並提供兩個軸的設定。

  • bar3DPlot − 提供與 barPlot 相同的設定,並使用 xOffset 和 yOffset 屬性生成 3D 效果。

  • linePlot − 可以顯示或隱藏連線專案點的線,可以顯示或隱藏與專案點關聯的形狀,並提供兩個軸的設定。

  • scatterPlot − 與 linePlot 類似,它可以顯示或隱藏連線專案點的線,可以顯示或隱藏與專案點關聯的形狀,並提供兩個軸的設定。

  • areaPlot − 提供兩個軸的設定。

  • bubblePlot − 可以透過設定 scaleType 屬性來設定氣泡尺寸,並提供兩個軸的設定。

  • timeSeriesPlot − 可以顯示或隱藏連線專案點的線,可以顯示或隱藏與專案點關聯的形狀,並提供兩個軸的設定。

  • highLowPlot − 可以顯示或隱藏開盤刻度,可以顯示或隱藏收盤刻度,並提供兩個軸的設定。

  • candlestickPlot − 可以顯示或隱藏成交量,並提供兩個軸的設定。

  • meterPlot − 包含刻度盤形狀、刻度角、計量單位、刻度間隔、刻度盤顏色、指標顏色、刻度顏色、值顯示字型、顏色和格式模式、資料範圍以及儀表間隔的特定設定。

  • thermometerPlot − 包含值位置、水銀顏色、顯示/隱藏值線、值顯示字型、顏色和格式模式、資料範圍、低範圍、中範圍和高範圍的特定設定。

  • multiAxisChart − 包含繪圖中包含的軸的特定設定。

圖表型別

JasperReports 提供對多種圖表型別的內建支援。它們列出如下 -

  • pieChart − 餅圖資料集和餅圖繪圖的組合。

  • pie3DChart − 將餅圖資料集和 3D 餅圖繪圖組合在一起。

  • barChart − 分類資料集和條形圖繪圖的基本組合。

  • bar3DChart − 包含分類資料集和 3D 條形圖繪圖。

  • xyBarChart − 支援時間段資料集、時間序列資料集和 XY 資料集,並使用條形圖繪圖渲染軸和專案。

  • stackedBarChart − 使用來自分類資料集的資料,並使用條形圖繪圖渲染其內容。

  • stackedBar3DChart − 使用來自分類資料集的資料,並使用 3D 條形圖繪圖渲染其內容。

  • lineChart − 將分類資料集和折線圖繪圖組合在一起。

  • xyLineChart − 將 XY 資料集和折線圖繪圖組合在一起。

  • areaChart − 分類資料集中的專案使用面積圖繪圖進行渲染。

  • stackedAreaChart − 分類資料集中的專案使用面積圖繪圖進行渲染。

  • xyAreaChart − 使用來自 XY 資料集的資料,並透過面積圖繪圖進行渲染。

  • scatterChart − 將 XY 資料集與散點圖繪圖組合在一起。

  • bubbleChart − 將 XYZ 資料集與氣泡圖繪圖組合在一起。

  • timeSeriesChart − 將時間序列資料集和時間序列繪圖組合在一起。

  • highLowChart − 高低資料集和高低繪圖的組合。

  • candlestickChart − 使用來自高低資料集的資料,但使用特殊的燭臺繪圖。

  • meterChart − 使用儀表繪圖中的渲染選項,在刻度盤上顯示來自值資料集的單個值。

  • thermometerChart − 使用溫度計繪圖中的渲染選項顯示值資料集中的單個值。

  • multiAxisChart − 包含多個範圍軸,所有這些軸共享一個公共域軸。

示例

為了演示圖表,讓我們編寫一個新的報表模板 (jasper_report_template.jrxml)。在這裡,我們將 <barChart> 元素新增到 <pageHeader> 部分,並將 <pieChart> 新增到 <summary> 部分。我們將在圖表中顯示每門課程獲得的分數。將其儲存到目錄 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 = "595" pageHeight = "860"
   columnWidth = "515" leftMargin = "40" rightMargin = "40"
   topMargin = "50" bottomMargin = "50">

   <field name = "subjectName" class = "java.lang.String"/>
   <field name = "marks" class = "java.lang.Integer"/>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "79" splitType = "Stretch"/>
   </title>
   
   <pageHeader>
      <band height = "200">
    
         <barChart>
            <chart evaluationTime = "Report">
               <reportElement x = "0" y = "0" width = "555" height = "200"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Bar Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
      
            <categoryDataset>
               <dataset incrementType = "None"/>
            
               <categorySeries>
                  <seriesExpression>
                     <![CDATA[$F{subjectName}]]>
                  </seriesExpression>
            
                  <categoryExpression>
                     <![CDATA[$F{subjectName}]]>
                  </categoryExpression>
            
                  <valueExpression>
                     <![CDATA[$F{marks}]]>
                  </valueExpression>

               </categorySeries>
            </categoryDataset>
      
            <barPlot isShowTickMarks = "false">
               <plot/>
            </barPlot>
         </barChart>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "20" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "20" splitType = "Stretch"/>
   </detail>
   
   <columnFooter>
      <band height = "20" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "20" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "400" splitType = "Stretch">
      
         <pieChart>
            <chart evaluationTime = "Report">
               <reportElement x = "135" y = "0" width = "270" height = "300"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Pie Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
         
            <pieDataset>
               <dataset incrementType = "None"/>
               
               <keyExpression>
                  <![CDATA[$F{subjectName}]]>
               </keyExpression>
            
               <valueExpression>
                  <![CDATA[$F{marks}]]>
               </valueExpression>
            </pieDataset>
            
            <piePlot>
               <plot/>
               <itemLabel/>
            </piePlot>
         </pieChart>
      
      </band>
   </summary>
	
</jasperReport>

上述檔案的詳細資訊如下 -

  • 用於建立條形圖的 JRXML 元素是 </barChart>,位於 <pageHeader> 中。它包含一個 </chart> 子元素,該元素包含一個 <reportElement> 子元素,用於定義圖表的尺寸和位置。

  • 條形圖中的 <dataset> 元素必須包含在 <categoryDataset> 和 </categoryDataset> JRXML 元素之間。

  • <categoryDataset> 必須包含 <categorySeries> 元素。此元素定義條形將表示什麼資料元素(在本例中為科目名稱)。

  • <categoryDataset> 還必須包含一個元素,該元素定義如何將資料分成類別以進行比較。在這裡,資料按科目名稱分開。

  • <valueExpression> 元素定義使用什麼表示式來確定圖表中每個條形的值。在這裡,我們使用“marks”。

  • 對於餅圖,我們在 <summary> 部分使用了元素 <pieChart>。它包含一個 </chart> 子元素。

  • 子元素包含一個報表表示式,指示在圖表中使用什麼作為鍵。在這裡,我們使用了 subjectName。

  • 子元素包含一個用於計算鍵值的表示式。在這裡,我們使用了 marks。

報表填充的 Java 程式碼保持不變。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();

      try {
         JasperFillManager.fillReportToFile( sourceFileName,
            parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

由於我們將顯示每門科目獲得的分數,因此需要更改 POJO。檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java 內容如下 -

package com.tutorialspoint;

public class DataBean {
   private String subjectName;
   private Integer marks;

   public String getSubjectName() {
      return subjectName;
   }

   public void setSubjectName(String subjectName) {
      this.subjectName = subjectName;
   }

   public Integer getMarks() {
      return marks;
   }

   public void setMarks(Integer marks) {
      this.marks = marks;
   }

}

檔案 C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java 的內容也需要更新如下 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("English", 58));
      dataBeanList.add(produce("SocialStudies", 68));
      dataBeanList.add(produce("Maths", 38));
      dataBeanList.add(produce("Hindi", 88));
      dataBeanList.add(produce("Scince", 78));
      
      return dataBeanList;
   }

   /*
    * This method returns a DataBean object, with subjectName ,
    * and marks set in it.
    */
   private DataBean produce(String subjectName, Integer marks) {
      DataBean dataBean = new DataBean();

      dataBean.setSubjectName(subjectName);
      dataBean.setMarks(marks);

      return dataBean;
   }
}

報表生成

接下來,讓我們使用我們常規的 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, defaulting to bu
   [javac] Compiling 3 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 19 minutes 45 seconds

上述編譯的結果是,一個 JasperViewer 視窗開啟,如下面的螢幕所示−

Jasper Bar  Chart Example

Jasper Pie Chart Example

在這裡,我們看到條形圖是在 pageheader 中建立的,餅圖是在 summary 部分建立的。

JasperReports - 交叉表

交叉表(交叉製表)報表是包含表格的報表,這些表格以表格形式跨行和列排列資料。交叉表物件用於在主報表中插入交叉表報表。交叉表可用於任何級別的資料(名義、有序、區間或比率),並且通常以動態表格的形式顯示報表變數中包含的彙總資料。變數用於顯示彙總資料,例如總和、計數、平均值。

交叉表屬性

JRXML 元素 <crosstab> 用於將交叉表插入報表。

屬性

以下是 <crosstab> 元素的屬性列表 -

  • isRepeatColumnHeaders − 指示是否應在分頁符後重新列印列標題。預設值為 true

  • isRepeatRowHeaders − 指示是否應在交叉表列中斷後重新列印行標題。預設值為 true

  • columnBreakOffset − 當發生列中斷時,指示在後續交叉表部分放置在同一頁面上之前一個部分下方之前,以畫素為單位測量的垂直空間量。預設值為 10。

  • runDirection − 指示是否應從左到右 (LTR) 或從右到左 (RTL) 填充交叉表資料。預設值為 LTR。

  • ignoreWidth − 指示交叉表是否會超出初始交叉表寬度限制並且不生成列中斷。否則,它將在交叉表寬度限制內停止渲染列,並在所有行開始渲染後才繼續渲染剩餘的列。預設值為 false

子元素

<crosstab> 元素具有以下子元素 -

  • <reportElement> − 此元素定義交叉表在其包含元素中的位置、寬度和高度。此元素的屬性包括所有標準 <reportElement> 屬性。

  • <crosstabParameter> − 此元素用於從交叉表內部訪問報表變數和引數。此元素的屬性包括 -

    • name − 這定義了引數名稱。

    • class − 表示引數類。

  • <parametersMapExpression> − 此元素用於傳遞一個報表變數或引數,該變數或引數包含 java.util.Map 的例項,作為交叉表的引數集。此元素不包含任何屬性。

  • <crosstabDataset> − 此元素定義用於填充交叉表的資料集(有關詳細說明,請參見下一節)。此元素的屬性包括 -

    • isDataPreSorted − 指示資料集中的資料是否已預排序。預設值為 false

  • <crosstabHeaderCell> − 此元素定義交叉表左上角區域的內容,該區域是列標題和行標題的交匯處。此單元格的大小根據定義的行和列的寬度和高度自動計算。

  • <rowGroup> − 此元素定義用於將資料拆分為行的組。此元素的屬性包括 -

    • name − 定義行組的名稱。

    • width − 定義行組的寬度。

    • headerPosition − 定義標題內容的位置(頂部、中間、底部、拉伸)。

    • totalPosition − 定義整個列的位置(開始、結束、無)。

    此元素包含以下子元素 -

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup> − 此元素定義用於將資料拆分為列的組。此元素的屬性包括 -

    • name − 定義列組名稱。

    • height − 定義列組標題的高度。

    • headerPosition − 定義標題內容的位置(右、左、中心、拉伸)。

    • totalPosition − 定義整個列的位置(開始、結束、無)。

    此元素包含以下子元素 -

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure> − 此元素定義要跨行和列執行的計算。此元素的屬性包括 -

    • name − 定義度量的名稱。

    • class − 指示度量類。

    • calculation − 指示要在交叉表單元格值之間執行的計算。其值可以是以下任何一個 - 無、計數、唯一計數、總和、平均值、最低值、最高值、標準差、方差第一個。預設值為

  • <crosstabCell> − 此元素定義非標題單元格中的資料如何佈局。此元素的屬性包括 -

    • columnTotalGroup − 指示用於計算列總計的組。

    • height − 定義單元格的高度。

    • rowTotalGroup − 指示用於計算行總計的組。

    • width − 定義單元格的寬度。

  • <whenNoDataCell> − 此元素定義在空交叉表單元格中顯示的內容。此元素不包含任何屬性。

交叉表中的資料分組

交叉表計算引擎透過迭代關聯的資料集記錄來聚合資料。為了聚合資料,需要先對其進行分組。在交叉表中,行和列基於特定的分組項,稱為。桶定義應包含 -

  • bucketExpression − 要評估的表示式,以便獲取資料分組項。

  • comparatorExpression − 在值的自然排序不是最佳選擇的情況下需要。

  • orderByExpression − 指示用於排序資料的的值。

交叉表中的行和列組(如上所述)依賴於

內建交叉表總計變數

下面列出了度量的當前值以及對應於單元格的不同級別的總計,可以透過根據以下方案命名的變數訪問 -

  • 度量計算的當前值儲存在一個與度量名稱相同的變數中。

  • <Measure>_<Column Group>_ALL − 這會產生同一行中列組中所有條目的總計。

  • <Measure>_<Row Group>_ALL − 這會產生同一列中行組中所有條目的總計。

  • <Measure>_<Row Group>_<Column Group>_ALL − 這會產生對應於行和列組中所有條目的組合總計。

示例

為了演示交叉表,讓我們編寫一個新的報表模板 (jasper_report_template.jrxml)。在這裡,我們將交叉表新增到摘要部分。將其儲存到目錄C:\tools\jasperreports-5.0.1\test中。檔案內容如下所示 -

<?xml version = "1.0" encoding = "UTF-8"?>

<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
	
<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <field name = "name" class = "java.lang.String"/>
   <field name = "country" class = "java.lang.String"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>
   
   <summary>
      <band height = "60">
      
      <crosstab>
         <reportElement width = "782" y = "0" x = "0" height = "60"/>
          
         <rowGroup name = "nameGroup" width = "100">
         
            <bucket>
               <bucketExpression class = "java.lang.String">
                  <![CDATA[$F{name}]]>
               </bucketExpression>
            </bucket>
            
            <crosstabRowHeader>
            
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  
                  <textField>
                     <reportElement width = "100" y = "0" x = "0" height = "20"/>
                     <textElement textAlignment = "Right" 
                        verticalAlignment = "Middle"/>
                     
                     <textFieldExpression>
                        <![CDATA[$V{nameGroup}]]>
                     </textFieldExpression>
                  </textField>
            
               </cellContents>
         
            </crosstabRowHeader>

         </rowGroup>
         
         <columnGroup name = "countryGroup" height = "20">
            <bucket>
               
               <bucketExpression class = "java.lang.String">
                  $F{country}
               </bucketExpression>
            </bucket>
            
            <crosstabColumnHeader>
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  <textField isStretchWithOverflow = "true">
                     <reportElement width = "60" y = "0" x = "0" height = "20"/>
                     <textElement verticalAlignment = "Bottom"/>
                     <textFieldExpression>
                        <![CDATA[$V{countryGroup}]]>
                     </textFieldExpression>
                  </textField>
               </cellContents>
            </crosstabColumnHeader>

         </columnGroup>
         
         <measure name = "tailNumCount" class = "java.lang.Integer"  
            calculation = "Count">
            <measureExpression>$F{country}</measureExpression>
         </measure>
         
         <crosstabCell height = "20" width = "60">
            <cellContents backcolor = "#FFFFFF">
               <box borderColor = "black" border = "Thin"/>
               <textField>
                  <reportElement x = "5" y = "0" width = "55" height = "20"/>
                  <textElement textAlignment = "Left" 
                     verticalAlignment = "Bottom"/>
                  <textFieldExpression class = "java.lang.Integer">
                      $V{tailNumCount}
                  </textFieldExpression>
               </textField>
            </cellContents>
         </crosstabCell>
      
      </crosstab>
      
      </band>
   </summary>
	
</jasperReport>

上述檔案的詳細資訊如下 -

  • 交叉表由<crosstab>元素定義。

  • <rowGroup>元素定義一個組,用於將資料拆分為行。在這裡,每一行將顯示不同名稱的資料。

  • <bucket>和<bucketExpression>元素定義要使用哪個報表表示式作為<rowGroup>的分組分隔符。在這裡,我們使用name欄位作為分隔符,以便按名稱拆分行。

  • <crosstabRowHeader>元素定義要用作行標題的表示式。它包含一個子元素,即<cellContents>,它在交叉表內充當內部頻段。與其在<crosstabRowHeader>內為文字欄位定義變數名,不如將名稱分配給<rowGroup>(透過其name屬性),因此它會建立一個隱式變數。<crosstabRowHeader>元素定義整行的標題單元格的內容。它將單個<cellContents>元素作為其唯一的子元素。

  • <columnGroup>元素及其子元素類似於<rowGroup>元素,只是它影響列而不是行。

  • <measure>元素定義要跨行和列執行的計算。calculation屬性設定為Count

  • <crosstabCell>元素定義非標題單元格中的資料如何佈局。此元素還包含一個<crosstabCell>元素作為其唯一的子元素。

報表填充的 Java 程式碼保持不變。檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java的內容如下所示:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

POJO檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java的內容如下 -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

檔案C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java的內容如下 -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

報表生成

接下來,讓我們使用我們常規的 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

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, defaulting to
   [javac] Compiling 3 source files 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.JRXmlDigesterFactory).
   [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.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger (
   net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Crosstab Example

在這裡,我們看到每個國家和名稱都進行了製表。

JasperReports - 國際化

有時,我們需要不同語言的報表。為每種不同的語言編寫相同的報表意味著很多冗餘工作。只有文字片段因語言而異才應分別編寫,並在執行時根據區域設定載入到文字元素中。這是報表國際化的目的。國際化報表一旦編寫,即可在任何地方執行。

在以下步驟中,我們列出瞭如何生成不同語言的報表以及報表國際化的其他一些功能 -

  • 將資源包java.util.ResourceBundle與報表模板關聯。有兩種方法可以將java.util.ResourceBundle物件與報表模板關聯。

    • 在設計時,透過將報表模板物件的resourceBundle屬性設定為目標資源包的基本名稱。

    • 可以在報表填充時透過提供java.util.ResourceBundle物件作為REPORT_RESOURCE_BUNDLE引數的值來進行動態/執行時關聯。

    • 如果報表需要在與當前區域設定不同的區域設定中生成,則可以使用內建的REPORT_LOCALE引數在填充報表時指定執行時區域設定。

  • 為了方便報表國際化,在報表表示式內部可以使用特殊的語法$R{}來引用放置在與報表關聯的java.util.ResourceBundle物件內的java.lang.String資源。$R{}字元語法從資源包中提取特定於區域設定的資源,具體取決於必須放在括號之間的鍵 -

<textFieldExpression>
   $R{report.title}
</textFieldExpression>

上述文字欄位透過從與報表模板關聯的資源包中提取字串值來顯示報表的標題,具體取決於執行時提供的區域設定和report.title鍵。

  • 根據報表區域設定以不同語言格式化訊息,報表中有一個內建方法net.sf.jasperreports.engine.fill.JRCalculator。此方法提供的功能類似於java.text.MessageFormat類。此方法msg()具有三個方便的簽名,允許您在訊息中使用最多三個訊息引數。

  • 一個內建的str()方法(等效於報表表示式中的$R{}語法),它根據報表區域設定訪問資源包內容。

  • 對於日期和時間格式,可以使用內建的REPORT_TIME_ZONE引數來確保正確的時區轉換。

  • 在生成的輸出中,庫會保留有關文字執行方向的資訊,以便可以正確呈現以從右到左書寫語言(如阿拉伯語和希伯來語)生成的文件。

  • 如果應用程式依賴於內建的Swing檢視器來顯示生成的報表,則需要透過調整按鈕工具提示或顯示的其他文字對其進行國際化。這很容易做到,因為檢視器依賴於預定義的資源包來提取特定於區域設定的資訊。此資源包的基本名稱為net.sf.jasperreports.view.viewer.

示例

為了演示國際化,讓我們編寫新的報表模板 (jasper_report_template.jrxml)。JRXML的內容如下所示。將其儲存到C:\tools\jasperreports-5.0.1\test目錄中。

<?xml version = "1.0" encoding = "UTF-8"?>

<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20" resourceBundle = "localizationdemo">
   
   <title>
      <band height = "552">
         
         <textField>
            <reportElement positionType = "Float" x = "150" y = "20" 
               width = "400" height = "50"/>
            
            <textElement>
               <font size = "24"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{REPORT_LOCALE}.getDisplayName ($P{REPORT_LOCALE})]]>
            </textFieldExpression>
         </textField>

         <textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
            <reportElement positionType = "Float" x = "20" y = "125" 
               width = "530" height = "20"/>
            
            <textElement textAlignment = "Justified">
               <font size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$R{localization.text1}]]>
            </textFieldExpression>
         
         </textField>
      
      </band>
   </title>

</jasperReport>

在上述檔案中,<jasperReport>元素的resourceBundle屬性告訴JasperReports從哪裡獲取要用於報表的本地化字串。我們需要建立一個屬性檔案,其根名稱與屬性的值匹配。填充報表時,此檔案必須存在於類路徑中的任何位置。在此示例中,屬性檔案localizationdemo.properties儲存在目錄C:\tools\jasperreports-5.0.1\test下。此檔案的內容如下 -

localization.text1 = This is English text.

要使用不同的區域設定,檔名稱必須為localizationdemo[locale].properties。在這裡,我們將為西班牙語區域設定編寫一個檔案。將此檔案儲存為 - C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties。此檔案的內容如下 -

localization.text1 = Este texto es en Español.

獲取resourceBundle屬性值的語法為$R{key}。

要讓JasperReports知道我們希望使用哪個區域設定,我們需要為內建引數分配一個值。此引數的名稱定義為一個名為REPORT_LOCALE的常量,此常量在net.sf.jasperreports.engine.JRParameter類中定義。常量的值必須是java.util.Locale的例項。此邏輯已納入Java程式碼中,以填充和生成報表。讓我們將此檔案JasperReportFillI18.java儲存到C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint目錄中。檔案內容如下 -

package com.tutorialspoint;

import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFillI18 {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/"
         + "jasper_report_template.jasper";
      HashMap parameterMap = new HashMap();
      if (args.length > 0) {
         parameterMap.put(JRParameter.REPORT_LOCALE, new Locale(args[0]));
      }
      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

報表生成

我們將使用常規的 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.JasperReportFillI18(viewFullReport 是預設目標)如下所示:

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperReportFillI18
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, defaulting to
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
   [javac] Note: C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\
      JasperReportFillI18.java
   uses unchecked or u
   [javac] Note: Recompile with -Xlint:unchecked for details.

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [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.JasperReportFillI18
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 3 minutes 28 seconds

作為上述編譯的結果,將開啟一個 JasperViewer 視窗,如下面的螢幕截圖所示:

Jasper Report Example
廣告