報表樣式



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

樣式屬性

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

序號 屬性及描述
1

name

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

2

isDefault

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

3

style

是對父樣式的引用。

4

mode

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

5

forecolor

是物件的**前景色**。

6

backcolor

是物件的**背景色**。

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

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

廣告

© . All rights reserved.