Báo cáo kiểu

JasperReports có một tính năng <style> giúp kiểm soát các thuộc tính văn bản trong mẫu báo cáo. Phần tử này là một tập hợp các cài đặt kiểu được khai báo ở cấp báo cáo. Các thuộc tính như màu nền trước, màu nền, phông chữ đậm, nghiêng hay bình thường, kích thước phông chữ, đường viền cho phông chữ và nhiều thuộc tính khác được kiểm soát bởi phần tử <style>. Kiểu có thể mở rộng các kiểu khác và thêm vào hoặc ghi đè các thuộc tính của kiểu gốc.

Thuộc tính kiểu

Một phần tử <style> có nhiều thuộc tính. Một số cách sử dụng phổ biến nhất được liệt kê trong bảng dưới đây:

S.NO Thuộc tính và mô tả
1

name

Là bắt buộc. Nó phải là duy nhất vì nó tham chiếu đến kiểu báo cáo tương ứng trong toàn bộ báo cáo.

2

isDefault

Cho biết kiểu này có phải là kiểu mặc định của tài liệu hay không.

3

style

Là một tham chiếu đến kiểu cha.

4

mode

Chỉ định độ trong suốt của phần tử. Các giá trị có thể là Đục và Trong suốt .

5

forecolor

Là màu nền trước của đối tượng.

6

backcolor

Là màu nền của đối tượng.

7

fill

Xác định mẫu tô được sử dụng để tô đối tượng. Hiện tại, giá trị duy nhất được phép là Solid .

6

radius

Chỉ định bán kính của cung góc của hình chữ nhật.

7

scaleImage

Chỉ định tỷ lệ cho hình ảnh. Các giá trị có thể có: Clip, FillFrame, RetainShape, RealHeightRealSize .

số 8

hAlign

Chỉ định căn chỉnh theo chiều ngang. Giá trị có thể có: Trái, Giữa, PhảiCăn đều .

9

vAlign

Chỉ định căn chỉnh theo chiều dọc. Giá trị có thể có: Trên cùng, GiữaDưới cùng .

10

rotation

Chỉ định vòng quay của phần tử. Các giá trị có thể có: Không có, Trái, PhảiLật xuống .

11

lineSpacing

Chỉ định khoảng cách dòng giữa các dòng văn bản. Giá trị có thể có: Đơn, 1_1_2, Đôi .

12

markup

Chỉ định kiểu đánh dấu cho văn bản được tạo kiểu.

13

fontName

Chỉ định tên phông chữ.

14

fontSize

Chỉ định kích thước phông chữ.

15

isBold

Cho biết kiểu phông chữ có đậm hay không.

16

isItalic

Cho biết kiểu phông chữ có nghiêng hay không.

17

isUnderline

Cho biết kiểu phông chữ có được gạch dưới hay không.

18

isStrikeThrough

Cho biết kiểu phông chữ có gạch ngang hay không.

19

pdfFontName

Chỉ định tên phông chữ PDF có liên quan.

20

pdfEncoding

Chỉ định mã hóa ký tự cho định dạng đầu ra PDF.

22

isPdfEmbedded

Cho biết nếu phông chữ PDF được nhúng.

23

pattern

Chỉ định mẫu định dạng cho văn bản được định dạng.

24

isBlankWhenNull

Cho biết nếu một chuỗi trống (khoảng trắng) sẽ được hiển thị nếu biểu thức đánh giá là null.

Kiểu có điều kiện

Trong một số tình huống, một kiểu chỉ nên được áp dụng khi đáp ứng một số điều kiện nhất định (ví dụ: để thay thế các màu hàng liền kề trong phần chi tiết báo cáo). Điều này có thể đạt được bằng cách sử dụng các kiểu có điều kiện.

Một kiểu điều kiện có hai yếu tố:

  • một biểu thức điều kiện Boolean
  • một phong cách

Kiểu chỉ được sử dụng nếu điều kiện đánh giá là true .

Áp dụng kiểu cho các phần tử báo cáo

Bất kỳ loại phần tử báo cáo nào cũng có thể tham chiếu đến định nghĩa kiểu báo cáo bằng cách sử dụng thuộc tính style. Do đó, tất cả các thuộc tính kiểu được khai báo bởi định nghĩa kiểu áp dụng cho phần tử hiện tại sẽ được kế thừa. Để ghi đè các giá trị được kế thừa, có thể sử dụng các thuộc tính kiểu được chỉ định ở cấp phần tử báo cáo.

Mẫu kiểu

Chúng ta có thể tạo một tập hợp các báo cáo với giao diện chung bằng cách xác định phong cách tại một địa điểm chung. Mẫu kiểu chung này sau đó có thể được tham chiếu bởi các mẫu báo cáo. Mẫu kiểu là một tệp XML có chứa một hoặc nhiều định nghĩa kiểu. Các tệp mẫu kiểu được sử dụng theo quy ước*.jrtx phần mở rộng, nhưng điều này không bắt buộc.

Mẫu kiểu chứa các phần tử sau:

  • <jasperTemplate> - Đây là phần tử gốc của tệp mẫu kiểu.

  • <template> - Phần tử này được sử dụng để bao gồm các tham chiếu đến các tệp mẫu khác. Nội dung của phần tử này được hiểu là vị trí của tệp mẫu được giới thiệu.

  • <style> - Phần tử này giống với phần tử có cùng tên từ các mẫu thiết kế báo cáo (tệp JRXML), ngoại trừ một kiểu trong mẫu kiểu không thể chứa các kiểu có điều kiện. Hạn chế này là do thực tế là các kiểu có điều kiện liên quan đến các biểu thức báo cáo và các biểu thức chỉ có thể được hiểu trong ngữ cảnh của một định nghĩa báo cáo duy nhất.

Tham chiếu đến các mẫu kiểu được bao gồm trong báo cáo JRXML dưới dạng phần tử <template>. Các mẫu kiểu được tải vào thời gian điền báo cáo và các tham chiếu tên kiểu được giải quyết sau khi tất cả các mẫu đã được tải. Khi tải các mẫu kiểu và phân giải tên kiểu thành các kiểu, cây / biểu đồ của các mẫu kiểu sẽ được tạo, phần trên cùng của cây là tập hợp các kiểu được xác định trong báo cáo. Trên cây này, các tham chiếu tên kiểu được phân giải thành kiểu cuối cùng phù hợp với tên trong truyền tải đầu tiên theo chiều sâu.

Thí dụ

Hãy thử các kiểu có điều kiện và các mẫu kiểu. Hãy thêm dấu <style> phần tử alternateStylevào mẫu báo cáo hiện có của chúng tôi ( Thiết kế Báo cáo Chương ). Dựa trên điều kiện, màu phông chữ thay đổi thành màu xanh lam để đếm số chẵn. Chúng tôi cũng đã bao gồm một mẫu kiểu"styles.jrtx". Mẫu báo cáo đã sửa đổi (jasper_report_template.jrxml) như sau. Lưu nó vào thư mục 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>

Nội dung của mẫu kiểu styles.jrtxnhư sau. Lưu nó vào thư mục 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>

Các mã java để điền báo cáo vẫn không thay đổi. Nội dung của tệpC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java như được đưa ra dưới đây -

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();
      }
   }
}

Nội dung của tệp POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java như dưới đây -

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;
   }
}

Nội dung của tệp C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java như dưới đây -

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;
   }
}

Tạo báo cáo

Chúng tôi sẽ biên dịch và thực thi tệp trên bằng quy trình xây dựng ANT thông thường của chúng tôi. Nội dung của tệp build.xml (được lưu trong thư mục C: \ tools \ jasperreports-5.0.1 \ test) như dưới đây.

Tệp nhập - baseBuild.xml được chọn từ chương Thiết lập môi trường và phải được đặt trong cùng thư mục với 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>

Tiếp theo, hãy mở cửa sổ dòng lệnh và đi đến thư mục nơi build.xml được đặt. Cuối cùng, thực hiện lệnhant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport là mục tiêu mặc định) là -

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.

Kết quả của quá trình biên dịch ở trên, một cửa sổ JasperViewer mở ra như được hiển thị trong màn hình dưới đây:

Ở đây, chúng ta có thể thấy rằng màu của phông chữ được thay đổi thành màu xanh lam cho số chẵn (ở cột quốc gia). Trong tên cột, màu phông chữ được thay đổi thành màu xanh lá cây (kiểu này được tham chiếu từ mẫu kiểu).