JasperReports - Hướng dẫn nhanh

Báo cáo là gì

Báo cáo là một bản trình bày thông tin có ý nghĩa, được xác định rõ ràng và tóm tắt. Thông thường, các hoạt động thường xuyên được tự động hóa và dữ liệu được tóm tắt thành một "Báo cáo" hỗ trợ ra quyết định. Báo cáo thể hiện dữ liệu lộn xộn thông thường thành biểu đồ, đồ thị và các dạng biểu diễn đồ họa khác.

Mẫu báo cáo

Nói chung, bố cục sau được áp dụng để tạo báo cáo bởi hầu hết các công cụ tạo báo cáo thương mại.

TIÊU ĐỀ
PAGEHEADER
COLUMNHEADER
CHI TIẾT
COLUMNFOOTER
CUỐI TRANG
TÓM LƯỢC

Sau đây là mô tả của từng phần tử được đề cập trong sơ đồ:

S.NO Yếu tố và mô tả
1

title

Tiêu đề chứa 'Tiêu đề' của báo cáo. Nó chỉ xuất hiện một lần ở đầu báo cáo, chẳng hạn như "Báo cáo điểm hướng dẫn".

2

pageHeader

PageHeader có thể chứa thông tin ngày giờ và / hoặc tên tổ chức. Điều này xuất hiện ở đầu mỗi trang.

3

columnHeader

ColumnHeader liệt kê tên của các trường cụ thể đó mà bạn muốn hiển thị trong báo cáo, ví dụ: "Tên tác giả", "Giờ bắt đầu", "Giờ kết thúc", "Giờ làm việc", "Ngày", v.v.

4

detail

Chi tiết là phần hiển thị các mục nhập của các trường cụ thể (được liệt kê trong columnHeader), ví dụ: "Manisha", "9:00", "18:00", "9", "10.02.2013."

5

columnFooter

ColumnFooter có thể hiển thị tóm tắt của bất kỳ trường nào, ví dụ: "Tổng số giờ đã làm việc:" 180. "

6

pageFooter

PageFooter có thể chứa thông tin về số lượng trang. Nó xuất hiện ở cuối mỗi trang, ví dụ: "1/23".

7

summary

Tóm tắt chứa thông tin suy ra từ phần "chi tiết", ví dụ: sau khi liệt kê số giờ làm việc của từng tác giả, tổng số giờ làm việc của từng tác giả có thể được đưa vào biểu đồ trực quan như biểu đồ tròn, biểu đồ, v.v. để so sánh tốt hơn.

JasperReports

Sau đây là những rắc rối thường gặp phải trong quá trình phát triển báo cáo -

  • Core changes - Thông thường, phản ánh những thay đổi hoặc cải tiến nghiệp vụ cần thiết để thay đổi logic cốt lõi của báo cáo.

  • Results exporting - Có nhiều định dạng mà báo cáo của bạn có thể được xuất sang, chẳng hạn như: HTML, Văn bản, PDF, MS Excel, RTF, ODT, Các giá trị được phân tách bằng dấu phẩy, XML hoặc hình ảnh.

  • Complicated reports - các báo cáo phụ và báo cáo nhiều tab là ví dụ điển hình.

  • Charts reports - Biểu đồ trực quan, ví dụ, Biểu đồ, Hình tròn, Đường XY, Thanh, Mét và Chuỗi thời gian.

Để loại bỏ chi phí của các điểm đã đề cập ở trên và để tạo thuận lợi cho quá trình báo cáo, rất nhiều khuôn khổ, công cụ, thư viện và ứng dụng của bên thứ ba đã được giới thiệu. JasperReports là một trong số họ.

JasperReportslà một công cụ báo cáo java mã nguồn mở. Nó dựa trên Java và không có cú pháp biểu thức riêng. JasperReports có khả năng cung cấp nội dung phong phú lên màn hình, đến máy in hoặc thành các tệp PDF, HTML, XLS, RTF, ODT, CSV, TXT và XML. Vì nó không phải là một công cụ độc lập, nó không thể được cài đặt riêng. Thay vào đó, nó được nhúng vào các ứng dụng Java bằng cách đưa thư viện của nó vào CLASSPATH của ứng dụng.

JasperReports là một thư viện lớp Java, và không dành cho người dùng cuối, mà nhắm đến các nhà phát triển Java, những người cần thêm khả năng báo cáo vào ứng dụng của họ.

Các tính năng của JasperReports

Một số tính năng quan trọng của JasperReports là:

  • Nó có một bố cục báo cáo linh hoạt.

  • Nó có thể trình bày dữ liệu bằng văn bản hoặc đồ họa.

  • Các nhà phát triển có thể cung cấp dữ liệu theo nhiều cách.

  • Nó có thể chấp nhận dữ liệu từ nhiều nguồn dữ liệu.

  • Nó có thể tạo ra các hình mờ (Hình mờ giống như một hình ảnh phụ nằm trên hình ảnh chính).

  • Nó có thể tạo báo cáo phụ.

  • Nó có khả năng xuất báo cáo ở nhiều định dạng khác nhau.

JasperReports là một thư viện Java thuần túy và không phải là một ứng dụng độc lập. Nó không thể tự chạy, do đó nó cần được nhúng vào một ứng dụng Java phía máy khách hoặc máy chủ khác. Vì nó dựa trên Java, nó có thể chạy trên bất kỳ nền tảng nào hỗ trợ Java (JDK 1.3 trở lên). Tất cả các chức năng của JasperReport được tập hợp trong một tệp JAR duy nhất, jasperreports-xxxjar. JAR này cùng với các thư viện bắt buộc và tùy chọn (tệp .ZIP) có thể được tải xuống từ trang web: Liên kết Thư viện JasperReport . Tải xuống phiên bản mới nhất từ ​​liên kết này.

Tệp ZIP bao gồm tệp JasperReports JAR cùng với mã nguồn JasperReports, các JAR phụ thuộc và rất nhiều ví dụ minh họa các chức năng của JasperReport.

Môi trường JasperReport

Để bắt đầu tạo báo cáo, chúng ta cần thiết lập môi trường sẵn sàng. Giải nén tệp JasperReport.ZIP đã tải xuống vào bất kỳ vị trí nào (trong trường hợp của chúng tôi, chúng tôi đã giải nén tệp đó sang C: \ tools \ jasperreports-5.0.1). Cấu trúc thư mục của tệp được giải nén giống như hình dưới đây:

Đây là chi tiết của tất cả các thư mục -

  • build - Chứa các tệp lớp JasperReport đã biên dịch.

  • demo - Chứa nhiều ví dụ khác nhau, thể hiện một số khía cạnh của chức năng JasperReports.

  • dist - Chứa tệp jasperreports-xxxjar. Chúng tôi sẽ thêm tệp JAR này vào CLASSPATH của chúng tôi để tận dụng JasperReports.

  • docs - Chứa bản sao cục bộ của tài liệu JasperReports.

  • lib - Chứa tất cả các JAR cần thiết, cả để xây dựng JasperReports và sử dụng nó trong các ứng dụng của chúng tôi.

  • src - Chứa mã nguồn JasperReports.

  • build.xml - Một tệp xây dựng ANT để xây dựng mã nguồn JasperReports. Nếu chúng tôi không có ý định sửa đổi JasperReports, chúng tôi không cần sử dụng tệp này vì JasperReports được phân phối ở dạng đã biên dịch.

  • changes.txt - Một tài liệu văn bản, giải thích sự khác biệt giữa phiên bản hiện tại và phiên bản trước của thư viện lớp JasperReports.

  • license.txt - Một tài liệu văn bản chứa toàn bộ nội dung của giấy phép LGPL (Giấy phép Công cộng Ít hơn).

  • readme.txt - Một tài liệu văn bản, chứa hướng dẫn về cách xây dựng và thực thi các ví dụ được cung cấp.

Về cơ bản, chúng tôi chỉ sử dụng jasperreports-xxxjar trong dist và JAR trong thư mục lib để tạo báo cáo. Vì JasperReports là một công cụ mã nguồn mở, nếu có bất kỳ lỗi hoặc lỗi nào được phát hiện trong quá trình thực thi trong jasperreports-xxxjar, chúng tôi có thể sửa nó và xây dựng lại JAR bằng cách sử dụng tệp build.xml.

Đặt CLASSPATH

Để sử dụng JasperReport, chúng tôi cần đặt các tệp sau thành CLASSPATH của chúng tôi -

  • jasperreports-xxxjar, trong đó xxx là phiên bản JasperReports. Điều này được tìm thấy trong thư mục C: \ tools \ jasperreports-xxx \ dist).

  • Tất cả các tệp JAR trong thư mục con lib (C: \ tools \ jasperreports-xxx \ lib).

Tại thời điểm cài đặt, chúng tôi đã sử dụng JasperReport phiên bản 5.0.1. Nhấp chuột phải vào 'Máy tính của tôi' và chọn 'Thuộc tính', nhấp vào nút 'Biến môi trường' trong tab 'Nâng cao'. Bây giờ hãy cập nhật biến 'Đường dẫn' với biến nàyC:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib. Bây giờ bạn đã sẵn sàng để tạo báo cáo của mình.

Trong tất cả các ví dụ trong hướng dẫn này, chúng tôi đã sử dụng các tác vụ ANT để tạo báo cáo. Cácbuildtệp sẽ đảm nhận việc nhập tất cả các JAR cần thiết để tạo báo cáo. Do đó, thiết lập CLASSPATH như đã đề cập ở trên sẽ chỉ giúp ích cho những người muốn tạo báo cáo mà không sử dụng ANT.

Xây dựng thiết lập

Tất cả các ví dụ trong hướng dẫn này -

  • đã được viết bằng Trình soạn thảo văn bản đơn giản.

  • đã được lưu trong thư mục C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

  • đã được biên dịch và thực thi từ dấu nhắc lệnh, sử dụng Apache ANT. Chúng tôi sẽ sử dụng mộtbaseBuild.xml tệp mà chúng tôi sẽ nhập vào ANT build.xmltập tin trong các chương tiếp theo. Lưu tệp này vào C: \ tools \ jasperreports-5.0.1 \ test. Sau đây là nội dung của tệp 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>

Tệp này có tất cả các mục tiêu bắt buộc, như làm sạch các thư mục, biên dịch các tệp java và thực thi các tệp lớp.

Sau đây là các chi tiết, được đề cập bởi các thư mục khác nhau trong baseBuild.xml. Giả sử thư mục hiện tại là C: \ tools \ jasperreports-5.0.1 \ test) -

  • jasper.dir - là thư mục C: \ tools \ jasperreports-5.0.1

  • lib.dir - là thư mục C: \ tools \ jasperreports-5.0.1 \ lib

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

  • class.dir - là C: \ tools \ jasperreports-5.0.1 \ test \ class

  • main-class - com.tutorialspoint.HelpMe. Lớp này là một lớp đơn giản được thực thi, khi không có tên tệp lớp nào được chuyển từ dòng lệnh. Lưu tệp này vào 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 ");
   }
}

Các lớp quản lý Jasper

Có một số lớp, sẽ được sử dụng để biên dịch thiết kế báo cáo JRXML, điền vào báo cáo, in báo cáo, xuất sang tệp PDF, HTML & XML, xem báo cáo đã tạo và thiết kế báo cáo.

Danh sách các lớp này là:

  • net.sf.jasperreports.engine.JasperCompileManager - Được sử dụng để biên dịch mẫu báo cáo JRXML.

  • net.sf.jasperreports.engine.JasperFillManager - Được sử dụng để điền vào một báo cáo với dữ liệu từ nguồn dữ liệu.

  • net.sf.jasperreports.engine.JasperPrintManager - Được sử dụng để in các tài liệu do thư viện JasperReports tạo ra.

  • net.sf.jasperreports.engine.JasperExportManager - Được sử dụng để lấy nội dung PDF, HTML hoặc XML cho các tài liệu được tạo ra bởi quá trình điền báo cáo.

  • net.sf.jasperreports.view.JasperViewer - Nó đại diện cho một ứng dụng Java Swing đơn giản, có thể tải và hiển thị báo cáo.

  • net.sf.jasperreports.view.JasperDesignViewer - Được sử dụng tại thời điểm thiết kế để xem trước các mẫu báo cáo.

Thiết lập Apache ANT

Chúng tôi sẽ xây dựng tất cả các ví dụ bằng Apache ANT. Vì vậy, vui lòng kiểm tra chương ANT - Environment Setup để thiết lập Apache ANT trên hệ thống của bạn.

Mục đích chính của JasperReports là tạo ra định hướng trang, sẵn sàng để in tài liệu một cách đơn giản và linh hoạt. Lưu đồ sau mô tả quy trình công việc điển hình trong khi tạo báo cáo.

Như trong hình, vòng đời có các giai đoạn riêng biệt sau:

  • Thiết kế báo cáo - Trong bước này, chúng ta tạo tệp JRXML, đây là một tài liệu XML chứa định nghĩa về bố cục báo cáo. Chúng tôi có thể sử dụng bất kỳ trình soạn thảo văn bản nào hoặc iReportDesigner để tạo thủ công. Nếu sử dụng iReportDesigner, bố cục được thiết kế theo cách trực quan, do đó có thể bỏ qua cấu trúc thực của JRXML.

  • Biên dịch báo cáo - Trong bước này, JRXML được biên dịch trong một đối tượng nhị phân gọi là tệp Jasper (* .jasper). Việc biên dịch này được thực hiện vì lý do hiệu suất. Các tệp jasper là những gì bạn cần gửi cùng với ứng dụng của mình để chạy các báo cáo.

  • Thực hiện báo cáo (Điền dữ liệu vào báo cáo) - Ở bước này, dữ liệu từ ứng dụng được điền vào báo cáo đã tổng hợp. Lớp net.sf.jasperreports.engine.JasperFillManager cung cấp các chức năng cần thiết để điền dữ liệu vào báo cáo. Tệp in Jasper (* .jrprint) được tạo, có thể được sử dụng để in hoặc xuất báo cáo.

  • Xuất báo cáo sang định dạng mong muốn - Trong bước này, chúng ta có thể xuất tệp in Jasper đã tạo ở bước trước sang bất kỳ định dạng nào bằng JasperExportManager. Vì Jasper cung cấp nhiều hình thức xuất khác nhau, do đó với cùng một đầu vào, chúng tôi có thể tạo nhiều biểu diễn dữ liệu.

Tổng quan chi tiết về từng bước trên sẽ được trình bày trong các chương tiếp theo.

Các mẫu JRXML (hoặc tệp JRXML) trong JasperReport là các tệp XML tiêu chuẩn, có phần mở rộng là .jrxml. Tất cả các tệp JRXML đều chứa thẻ <jasperReport>, là phần tử gốc. Đến lượt nó lại chứa nhiều phần tử con (tất cả đều là tùy chọn). Khung công tác JasperReport có thể xử lý các loại nguồn dữ liệu khác nhau. Trong hướng dẫn này, chúng tôi sẽ chỉ ra cách tạo một báo cáo cơ bản, chỉ bằng cách chuyển một tập hợp các đối tượng dữ liệu Java (sử dụng các bean Java), tới JasperReport Engine. Báo cáo cuối cùng sẽ hiển thị một danh sách những người với các hạng mục bao gồm tên và quốc gia của họ.

Các bước sau được trình bày trong chương này để mô tả - cách thiết kế một JasperReport -

  • Tạo Mẫu Báo cáo JRXML và.
  • Xem trước Mẫu Báo cáo XML.

Tạo mẫu báo cáo JRXML

Tạo tệp JRXML, là jasper_report_template.jrxmlsử dụng trình soạn thảo văn bản và lưu tệp này trong C: \ tools \ jasperreports-5.0.1 \ test theo thiết lập môi trường của chúng tôi.

<?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>

Dưới đây là chi tiết về các trường chính trong mẫu báo cáo ở trên -

  • <queryString> - Cái này trống (vì chúng ta đang truyền dữ liệu qua Java Beans). Thường chứa câu lệnh SQL, truy xuất kết quả báo cáo.

  • <tên trường> - Phần tử này được sử dụng để ánh xạ dữ liệu từ các nguồn dữ liệu hoặc truy vấn, thành các mẫu báo cáo. name được sử dụng lại trong nội dung báo cáo và có phân biệt chữ hoa chữ thường.

  • <fieldDescription> - Phần tử này ánh xạ tên trường với phần tử thích hợp trong tệp XML.

  • <staticText> - Điều này xác định văn bản tĩnh không phụ thuộc vào bất kỳ nguồn dữ liệu, biến, tham số hoặc biểu thức báo cáo nào.

  • <textFieldExpression> - Điều này xác định sự xuất hiện của trường kết quả.

  • $ F {country} - Đây là một biến chứa giá trị của kết quả, trường được xác định trước trong thẻ <tên trường>.

  • <band> - Các dải chứa dữ liệu, được hiển thị trong báo cáo.

Khi thiết kế báo cáo đã sẵn sàng, hãy lưu nó vào thư mục C: \.

Xem trước Mẫu Báo cáo XML

Có một tiện ích net.sf.jasperreports.view.JasperDesignViewer có sẵn trong tệp JasperReports JAR, giúp xem trước thiết kế báo cáo mà không cần phải biên dịch hoặc điền vào nó. Tiện ích này là một ứng dụng Java độc lập, do đó có thể được thực thi bằng ANT.

Hãy viết một mục tiêu ANT viewDesignXMLđể xem JRXML. Vì vậy, hãy tạo và lưubuild.xmltrong thư mục C: \ tools \ jasperreports-5.0.1 \ test (phải được đặt trong cùng thư mục nơi đặt JRXML). Đây là tệp 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>

Tiếp theo, chúng ta hãy mở một dấu nhắc lệnh và đi đến thư mục nơi build.xml được đặt. Thực hiện lệnhant(Vì viewDesignXML là mục tiêu mặc định). Đầu ra như sau:

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.

Cảnh báo Log4j có thể bị bỏ qua và kết quả của việc thực thi ở trên, một cửa sổ có nhãn "JasperDesignViewer" sẽ mở ra, hiển thị bản xem trước mẫu báo cáo của chúng tôi.

Như chúng ta thấy, chỉ các biểu thức báo cáo để lấy dữ liệu được hiển thị, vì JasperDesignViewer không có quyền truy cập vào nguồn dữ liệu thực tế hoặc các tham số báo cáo. Kết thúc JasperDesignViewer bằng cách đóng cửa sổ hoặc nhấn Ctrl-c trong cửa sổ dòng lệnh.

Chúng tôi đã tạo mẫu JasperReport (tệp JRXML) trong chương trước. Tệp này không thể được sử dụng trực tiếp để tạo báo cáo. Nó phải được biên dịch sang định dạng nhị phân gốc của JasperReport, được gọi làJaspertập tin. Khi biên dịch, chúng tôi chuyển đổi đối tượng JasperDesign thành đối tượng JasperReport -

Giao diện net.sf.jasperreports.engine.design.JRCompiler đóng vai trò trung tâm trong quá trình biên dịch. Giao diện này có một số triển khai tùy thuộc vào ngôn ngữ được sử dụng cho các biểu thức báo cáo, có thể được viết bằng Java, Groovy, JavaScript hoặc bất kỳ ngôn ngữ kịch bản nào khác miễn là việc triển khai trình biên dịch có thể đánh giá nó trong thời gian chạy.

Chúng tôi có thể biên dịch tệp JRXML theo hai cách sau:

  • Biên dịch theo chương trình.
  • Biên dịch thông qua nhiệm vụ ANT.

Biên dịch theo chương trình của JRXML

API JasperReports cung cấp một lớp mặt tiền net.sf.jasperreports.engine.JasperCompileManager để biên dịch JasperReport. Lớp này bao gồm một số phương thức tĩnh công khai để biên dịch các mẫu báo cáo. Nguồn của các mẫu có thể là tệp, luồng đầu vào và / hoặc, các đối tượng bộ nhớ.

Nội dung của tệp JRXML (jasper_report_template.jrxml) như sau. Nó được lưu tại thư mụcC:\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>

Đoạn mã sau minh họa việc biên dịch tệp jasper_report_template.jrxml ở trên .

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!!! ...");
   }
}

Tổng hợp mẫu

Bước tiếp theo, chúng ta hãy lưu nội dung trên vào tệp C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javavà nhập baseBuild.xml trong tệp build.xml như bên dưới. BaseBuild.xml đã cócompilerun mục tiêu -

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

   <import file = "baseBuild.xml"/>

</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.JasperReportCompile như -

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

Theo kết quả của việc biên dịch ở trên, bạn sẽ thấy tệp mẫu jasper_report_template.jasper được tạo trong thư mục C: \ tools \ jasperreports-5.0.1 \ test.

Xem trước mẫu báo cáo đã biên dịch

Các net.sf.jasperreports.view.JasperDesignViewer có thể được sử dụng để xem trước biên soạn các mẫu báo cáo và JRXML mẫu.

Để tiến xa hơn, hãy thêm một mục tiêu mới viewDesignvào tệp build.xml ở trên, cho phép chúng tôi xem trước báo cáo đã biên dịch. Dưới đây là bản build.xml đã sửa đổi -

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 = "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>

Hãy thực hiện lệnh - ant(viewDesign là mục tiêu mặc định) tại dấu nhắc lệnh. Cửa sổ JasperDesignViewer mở ra hiển thị tệp Jasper như bên dưới:

Tổng hợp thông qua ANT Task

Vì việc biên dịch mẫu báo cáo giống một công việc thiết kế hơn là một công việc thời gian chạy, nên thư viện JasperReport có một tác vụ ANT tùy chỉnh. Đối với một số trường hợp nhất định, khi tệp JRXML được tạo trong thời gian chạy, chúng tôi không thể sử dụng tác vụ ANT này. Tác vụ ANT tùy chỉnh được gọi là JRC và được thực hiện bởi lớp: net.sf.jasperreports.ant.JRAntCompileTask . Cú pháp và hành vi của nó rất giống với<javac> Nhiệm vụ ANT.

Tổng hợp mẫu

Hãy thêm mục tiêu mới compilereportdesingvào build.xml hiện có của chúng tôi. Ở đây, thư mục nguồn được chỉ định bằng cách sử dụng thẻ <src> lồng nhau với các tập tin. Thẻ nguồn lồng nhau cho phép biên dịch các mẫu báo cáo nằm rải rác qua nhiều vị trí khác nhau và không được nhóm lại trong một thư mục nguồn báo cáo gốc duy nhất. Dưới đây là bản build.xml đã sửa đổi -

<?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>

Tiếp theo, hãy mở dấu nhắc lệnh và đi đến thư mục nơi build.xml được đặt. Thực hiện lệnhant(compilereportdesing là mục tiêu mặc định); Đầu ra như sau:

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

Tệp jasper_report_template.jasper được tạo trong hệ thống tệp (trong trường hợp của chúng tôi là thư mục C: \ tools \ jasperreports-5.0.1 \ test). Tệp này giống với tệp được tạo theo chương trình bằng cách gọi net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Chúng tôi có thể xem trước tệp jasper này, đang thực thiant viewDesign.

Mục đích chính của bất kỳ công cụ báo cáo nào là tạo ra các tài liệu chất lượng cao. Quy trình điền báo cáo giúp công cụ báo cáo đạt được điều này bằng cách thao tác các tập hợp dữ liệu.

Các đầu vào chính cần thiết cho quá trình điền báo cáo là:

  • Report Template - Đây là tệp JasperReport thực tế.

  • Report Parameters- Về cơ bản, đây là các giá trị được đặt tên được chuyển vào thời điểm báo cáo làm đầy động cơ. Chúng ta sẽ thảo luận về chúng trong chương Thông số báo cáo .

  • Data Source- Chúng tôi có thể điền vào một tệp Jasper từ một loạt các nguồn dữ liệu như truy vấn SQL, tệp XML, tệp csv, truy vấn HQL (Ngôn ngữ truy vấn Hibernate), tập hợp các Đậu Java, v.v. Điều này sẽ được thảo luận chi tiết trong Báo cáo Chương Nguồn dữ liệu .

Đầu ra do quá trình này tạo ra là .jrprint tài liệu đã sẵn sàng để xem, in hoặc xuất sang các định dạng khác. Lớp mặt tiền net.sf.jasperreports.engine.JasperFillManager thường được sử dụng để điền vào mẫu báo cáo với dữ liệu. Lớp này có nhiều phương thức fillReportXXX () điền vào các mẫu báo cáo (các mẫu có thể nằm trên đĩa, được chọn từ các luồng đầu vào hoặc được cung cấp trực tiếp dưới dạng bộ nhớ).

Có hai loại phương thức fillReportXXX () trong lớp mặt tiền này -

  • Kiểu đầu tiên, nhận một đối tượng java.sql.Connection làm tham số thứ ba. Hầu hết các báo cáo đều chứa dữ liệu từ cơ sở dữ liệu quan hệ. Điều này đạt được nhờ -

    • Kết nối với cơ sở dữ liệu thông qua JDBC.

    • Bao gồm một truy vấn SQL bên trong mẫu báo cáo.

    • Công cụ JasperReports sử dụng kết nối được chuyển vào và thực hiện truy vấn SQL.

    • Do đó, một nguồn dữ liệu báo cáo được tạo ra để điền vào báo cáo.

  • Loại thứ hai, nhận đối tượng net.sf.jasperreports.engine.JRDataSource, khi dữ liệu cần được điền sẵn có ở các dạng khác.

Điền Mẫu Báo cáo

Hãy viết một mẫu báo cáo. Nội dung của tệp JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) như sau:

<?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>

Tiếp theo, hãy chuyển một tập hợp các đối tượng dữ liệu Java (Java bean), tới JasperReport Engine, để điền vào báo cáo đã biên dịch này.

Viết một POJO DataBean.java, đại diện cho đối tượng dữ liệu (Java bean). Lớp này định nghĩa hai đối tượng Chuỗi tức là 'tên' và 'quốc gia'. Lưu nó vào thư mụcC:\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;
   }
}

Viết một lớp DataBeanList.java, có logic nghiệp vụ để tạo một tập hợp các đối tượng bean java. Điều này tiếp tục được chuyển đến công cụ JasperReports, để tạo báo cáo. Ở đây chúng tôi đang thêm 4 đối tượng DataBean trong Danh sách. Lưu nó vào thư mụcC:\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;
   }
}

Viết một tệp lớp chính JasperReportFill.java, lấy bộ sưu tập bean java từ lớp (DataBeanList) và chuyển nó đến công cụ JasperReports, để điền vào mẫu báo cáo. Lưu nó vào thư mụcC:\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();
      }
   }
}

Tạo báo cáo

Bây giờ chúng tôi sẽ biên dịch và thực thi các tệp này bằng quy trình xây dựng ANT thông thường của chúng tôi. Tệp build.xml 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 = "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>

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ệnh ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport là mục tiêu mặc định) như sau:

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

Kết quả của việc thực thi ở trên là tệp jasper_report_template.jrprint được tạo trong cùng thư mục với tệp .jasper (Trong trường hợp này, tệp được tạo tại C: \ tools \ jasperreports-5.0.1 \ test).

Đầu ra của quá trình điền báo cáo Các đối tượng JasperPrint có thể được xem bằng cách sử dụng thành phần trình xem tích hợp sẵn, hoặc in hoặc xuất sang các định dạng tài liệu phổ biến hơn như PDF, HTML, RTF, XLS, ODT, CSV hoặc XML. Việc xem và in các tài liệu Jasper sẽ được thảo luận trong chương này và việc xuất sẽ được thảo luận trong chương tiếp theo, tức là 'Báo cáo xuất khẩu'.

Xem báo cáo

JasperReport cung cấp một trình xem tích hợp để xem các báo cáo đã tạo ở định dạng ban đầu. Nó là một thành phần dựa trên swing và các ứng dụng Java khác có thể tích hợp thành phần này mà không cần phải xuất tài liệu sang các định dạng khác để xem hoặc in. Lớp net.sf.jasperreports.view.JRViewer đại diện cho thành phần trực quan này. Lớp này cũng có thể được tùy chỉnh theo nhu cầu của ứng dụng, bằng cách phân lớp nó.

JasperReports cũng có một ứng dụng Swing, sử dụng thành phần trực quan để xem các báo cáo. Ứng dụng này giúp xem các báo cáo ở định dạng giống như * .jrprint được tạo ra. Ứng dụng Swing này được triển khai trong lớp net.sf.jasperreports.view.JasperViewer . Để xem các báo cáo bằng cách sử dụng lớp này, chúng ta cần bao bọc nó thành một đích ANT.

Xem Báo cáo đã tạo

Ví dụ sau minh họa - cách xem báo cáo bằng lớp JasperViewer -

Hãy viết một mẫu báo cáo. Nội dung của tệp JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) như dưới đây:

<?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>

Tiếp theo, hãy chuyển một tập hợp các đối tượng dữ liệu Java (Java bean), tới JasperReports Engine, để điền vào báo cáo đã biên dịch này.

Viết một POJO DataBean.java, đại diện cho đối tượng dữ liệu (Java bean). Lớp này định nghĩa hai đối tượng Chuỗi tức là 'tên' và 'quốc gia'. Lưu nó vào thư mụcC:\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;
   }
}

Viết một lớp DataBeanList.java, có logic nghiệp vụ để tạo một tập hợp các đối tượng bean java. Điều này tiếp tục được chuyển đến công cụ JasperReports, để tạo báo cáo. Ở đây, chúng tôi đang thêm 4 đối tượng DataBean trong Danh sách. Lưu nó vào thư mụcC:\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;
   }
}

Viết một tệp lớp chính JasperReportFill.java, lấy bộ sưu tập bean java từ lớp (DataBeanList) và chuyển nó đến công cụ JasperReports, để điền vào mẫu báo cáo. Lưu nó vào thư mụcC:\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();
      }
   }
}

Hãy viết một mục tiêu viewFillReportvào tệp build.xml. Tệp build.xml như sau:

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ệnh ant -Dmain-class=com.tutorialspoint.JasperReportFill(viewFillReport là mục tiêu mặc định). Kết quả là, chúng ta thấy một cửa sổ JasperViewer như được hiển thị trong màn hình bên dưới:

Báo cáo in

Chúng ta có thể in các tài liệu được tạo bởi thư viện JasperReports (ở định dạng độc quyền của chúng, tức là các đối tượng JasperPrint ) bằng cách sử dụng lớp net.sf.jasperreports.engine.JasperPrintManager . Đây là một lớp mặt tiền dựa trên API in Java 2. Chúng tôi cũng có thể in tài liệu sau khi tài liệu JasperReport được xuất sang các định dạng khác như HTML hoặc PDF.

In Báo cáo đã Tạo

Đoạn mã sau minh họa việc in một báo cáo. Hãy cập nhật lớp JasperReportFill hiện có của chúng ta. Chúng ta sẽ sử dụng phương thức JasperPrintManager.printReport () . Phương thức này lấy tên tệp nguồn (ở đây chúng tôi truyền tệp .jrprint , mà chúng tôi tạo ở bước trước bằng cách sử dụng phương thức JasperFillManager.fillReportToFile ()) làm tham số đầu tiên. Tham số thứ hai là boolean để hiển thị hộp thoại in tiêu chuẩn (chúng tôi đã đặt nó thànhtrue đâ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.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();
      }
   }
}

Bây giờ, hãy lưu tệp này vào thư mục C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Chúng tôi sẽ biên dịch và thực thi tệp này bằng ANT. Nội dung của build.xml như dưới đây:

<?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>

Tiếp theo, hãy mở dấu nhắc 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.JasperReportPrint. Kết quả là một hộp thoại in xuất hiện. Nhấn OK để in tài liệu.

Chúng ta đã xem trong chương trước, cách in và xem tài liệu được tạo bằng JasperReport. Ở đây, chúng ta sẽ xem cách chuyển đổi hoặc xuất các báo cáo này sang các định dạng khác như PDF, HTML và XLS. Lớp Facade net.sf.jasperreports.engine.JasperExportManager được cung cấp để đạt được chức năng này. Xuất khẩu phương tiện chuyển đổi JasperPrint đối tượng (file .jrprint) sang định dạng khác nhau.

Đoạn mã sau (JasperReportExport.java) trình bày quá trình xuất tài liệu JasperReport. JasperExportManager chỉ cung cấp các phương pháp xuất báo cáo thành PDF, HTML và XML. Để xuất sang định dạng XLS, chúng tôi đã sử dụng lớp net.sf.jasperreports.engine.export.JRXlsExporter . Mã này tạo ra ba tệp sau:

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

Xuất sang các định dạng khác

Hãy viết một mẫu báo cáo. Nội dung của tệp JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) như sau:

<?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>

Tiếp theo, 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;
   }
}

Viết một tệp lớp chính JasperReportFill.java, lấy bộ sưu tập bean java từ lớp (DataBeanList) và chuyển nó đến công cụ JasperReports, để điền vào mẫu báo cáo. Lưu nó vào thư mụcC:\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();
      }
   }
}

Ở đây, chúng tôi đã bao gồm logic để xuất tệp in jasper sang định dạng pdf, html và xls.

Tạo báo cáo

Hãy biên dịch và thực thi các tệp trên bằng quy trình xây dựng ANT thông thường của chúng tôi. Tệp build.xml như dưới đây:

<?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>

Đi tới dấu nhắc lệnh và sau đó đi đến thư mục C: \ tools \ jasperreports-5.0.1 \ test, nơi build.xml được đặt. Cuối cùng, thực hiện lệnhant -Dmain-class=com.tutorialspoint.JasperReportFill. Kết quả như sau:

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

Theo kết quả của việc thực hiện ở trên, bạn sẽ tìm thấy ba tệp sample_report.pdf, sample_report.html, sample_report.xls được tạo trong thư mục C: \.

Đầu vào chính để điền vào một báo cáo là - mẫu báo cáo, thông số và nguồn dữ liệu. Chương này sẽ mô tả các tham số và trong chương tiếp theo chúng ta sẽ thảo luận về các nguồn dữ liệu.

Tham số là các tham chiếu đối tượng, những tham số này được chuyển trong quá trình điền báo cáo vào công cụ báo cáo. Dữ liệu không thể được chuyển qua nguồn dữ liệu, có thể được chuyển bằng cách sử dụng các tham số. Dữ liệu như tên tác giả, tiêu đề của báo cáo, v.v. có thể được chuyển qua các tham số. Mẫu JasperReports hoặc mẫu JRXML có thể không có hoặc nhiều phần tử tham số.

Khai báo tham số

Khai báo tham số như sau:

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

Thuộc tính Tên

Các tên thuộc tính của thẻ <parameter> phần tử là bắt buộc. Nó tham chiếu đến tham số trong biểu thức báo cáo theo tên. Tên tham số phải là một từ duy nhất. Nó không được chứa bất kỳ ký tự đặc biệt nào như dấu chấm hoặc dấu phẩy.

Thuộc tính lớp

Các lớp thuộc tính cũng là bắt buộc và nó chỉ định tên lớp cho các giá trị tham số. Giá trị mặc định của nó là java.lang.String . Điều này có thể được thay đổi thành bất kỳ lớp nào có sẵn trong thời gian chạy. Bất kể loại thông số báo cáo là gì, công cụ sẽ xử lý việc truyền trong các biểu thức báo cáo trong đó mã thông báo $ P {} được sử dụng, do đó, việc thực hiện truyền thủ công là không cần thiết.

Các giá trị tham số báo cáo luôn được đóng gói trong một đối tượng java.util.Map, có tên tham số làm khóa của nó. Tham số báo cáo có thể được sử dụng trong chuỗi truy vấn của báo cáo, để tùy chỉnh thêm tập dữ liệu, được truy xuất từ ​​cơ sở dữ liệu. Các bộ lọc này hoạt động giống như các bộ lọc động trong truy vấn cung cấp dữ liệu cho báo cáo.

Tham số tích hợp

Sau đây là các tham số báo cáo được xác định trước, sẵn sàng sử dụng trong các biểu thức -

S.NO Tên và mô tả thông số
1

REPORT_PARAMETERS_MAP

Chứa một bản đồ với tất cả các thông số do người dùng xác định và cài sẵn.

2

REPORT_CONNECTION

Điều này trỏ đến lớp java.sql.Connection do người dùng cung cấp, được sử dụng cho các nguồn dữ liệu JDBC.

3

REPORT_DATA_SOURCE

Đây là phiên bản JRDataSource do người dùng cung cấp đại diện cho một trong các kiểu nguồn dữ liệu tích hợp sẵn hoặc kiểu do người dùng xác định.

4

REPORT_MAX_COUNT

Đây là giá trị java.lang.Integer , cho phép người dùng giới hạn các bản ghi từ nguồn dữ liệu.

5

REPORT_SCRIPTLET

Điều này trỏ đến net.sf.jasperreports.engine.JRAbstractScriptlet và chứa một phiên bản của scriptlet báo cáo do người dùng cung cấp.

6

REPORT_LOCALE

Đây là một phiên bản java.util.Locale , chứa gói tài nguyên ngôn ngữ mong muốn.

7

REPORT_RESOURCE_BUNDLE

Điều này trỏ đến đối tượng java.util.ResourceBundle và chứa các thông báo được bản địa hóa.

số 8

REPORT_TIME_ZONE

Đây là một phiên bản java.util.TimeZone , được sử dụng để định dạng ngày tháng.

9

REPORT_VIRTUALIZER

Đây là một ví dụ của đối tượng net.sf.jasperreports.engine.JRVirtualizer và được sử dụng cho ảo hóa trang (tối ưu hóa mức tiêu thụ bộ nhớ).

10

REPORT_CLASS_LOADER

Đây là phiên bản java.lang.ClassLoader sẽ được sử dụng trong quá trình điền báo cáo để tải các tài nguyên như hình ảnh, phông chữ và các mẫu báo cáo con

11

IS_IGNORE_PAGINATION

Nếu được đặt thành java.lang.Boolean.TRUE , báo cáo sẽ được tạo trên một trang dài và hiện tượng ngắt trang sẽ không xảy ra.

Thí dụ

Hãy để chúng tôi chuyển ReportTitleAuthor vào báo cáo (được tạo bởi JasperReportFill.java). Tệp đã sửa đổiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java như sau -

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

Hãy thêm các tham số <ReportTitle> và <Author> và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 ). Tên báo cáo và tác giả sẽ được hiển thị ở đầu báo cáo. 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">
	
   <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>

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ư bên dưới.

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) như sau:

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

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

Ở đây, chúng ta thấy rằng, "Danh sách Liên hệ" và Tác giả "Được chuẩn bị bởi Manisha" của ReportTitle được hiển thị ở đầu báo cáo.

Nguồn dữ liệu là vùng chứa dữ liệu có cấu trúc. Trong khi tạo báo cáo, công cụ JasperReports lấy dữ liệu từ các nguồn dữ liệu. Dữ liệu có thể được lấy từ cơ sở dữ liệu, tệp XML, mảng đối tượng và tập hợp đối tượng. Chúng ta đã thấy trong chương Báo cáo điền , phương thức fillReportXXX () dự kiến ​​sẽ nhận được nguồn dữ liệu của báo cáo, nguồn dữ liệu này phải điền, ở dạngnet.sf.jasperreports.engine.JRDataSource đối tượng hoặc một java.sql.Connection (khi dữ liệu báo cáo được tìm thấy trong cơ sở dữ liệu quan hệ).

Giao diện JRDataSource chỉ có hai phương thức nên được triển khai:

  • public boolean next () ném JRException;

    • Tại thời điểm điền báo cáo, phương pháp này được công cụ báo cáo gọi trên đối tượng nguồn dữ liệu khi lặp lại dữ liệu.

  • public Object getFieldValue (JRField jrField) ném JRException;

    • Phương pháp này cung cấp giá trị cho mỗi trường báo cáo trong bản ghi nguồn dữ liệu hiện tại.

Cách duy nhất để truy xuất dữ liệu từ nguồn dữ liệu là sử dụng các trường báo cáo. Có một số triển khai mặc định của giao diện JRDataSource, tùy thuộc vào cách thức, các bản ghi trong nguồn dữ liệu được thu thập.

Triển khai nguồn dữ liệu

Bảng dưới đây tóm tắt các nguồn dữ liệu và các lớp triển khai của chúng -

Nguồn dữ liệu Lớp triển khai
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Dựa trên bản đồ 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
Trống net.sf.jasperreports.engine.JREmptyDataSource

Nguồn dữ liệu JDBC

Lớp học JRResultSetDataSourcecraps một đối tượng java.sql.ResultSet . Đây là cách triển khai nguồn dữ liệu được sử dụng phổ biến nhất khi dữ liệu báo cáo được trích xuất từ ​​cơ sở dữ liệu quan hệ. Nếu thay vào đó, java.sql.Connection được chuyển tới engine, trước tiên nó sẽ thực thi truy vấn liên quan và lưu trữ đối tượng java.sql.ResultSet được trả về trong một phiên bản JRResultSetDataSource.

Nguồn dữ liệu JavaBean

Các lớp học JRBeanArrayDataSourceJRBeanCollectionDataSourceđại diện cho các triển khai có thể bao bọc các mảng và tập hợp các đối tượng JavaBean. Mỗi đối tượng bên trong mảng hoặc bộ sưu tập sẽ được xem như một bản ghi trong kiểu nguồn dữ liệu này. Ánh xạ giữa một thuộc tính JavaBean cụ thể và trường báo cáo tương ứng được thực hiện bằng các quy ước đặt tên. Tên của trường báo cáo phải giống với tên của thuộc tính JavaBean như được chỉ định bởi đặc tả JavaBeans.

Trong tất cả các ví dụ của hướng dẫn này, chúng tôi đã sử dụng JRBeanCollectionDataSource.

Nguồn dữ liệu dựa trên bản đồ

Các lớp triển khai JRMapArrayDataSourceJRMapCollectionDataSourcehữu ích nếu ứng dụng mẹ đã lưu trữ dữ liệu báo cáo có sẵn trong bộ nhớ dưới dạng các đối tượng java.util.Map . Mỗi đối tượng Bản đồ trong mảng hoặc tập hợp được bao bọc được coi là một bản ghi ảo trong nguồn dữ liệu và giá trị của mỗi trường báo cáo được trích xuất từ ​​bản đồ bằng cách sử dụng trường báo cáo có tên là khóa.

Nguồn dữ liệu TableModel

Trong nhiều ứng dụng phía máy khách, dữ liệu được hiển thị ở định dạng bảng. Yêu cầu chung trong nhiều ứng dụng là cho phép người dùng in định dạng bảng này dưới dạng báo cáo. Lớp triển khaiJRTableModelDataSourcelàm cho nhiệm vụ tạo báo cáo từ định dạng bảng trở nên tầm thường đối với các ứng dụng Swing. Lớp này bao bọc một đối tượng javax.swing.table.TableModel. Các cột trong đối tượng TableModel được bao bọc có thể được truy cập bằng tên của chúng hoặc bằng chỉ mục dựa trên 0 của chúng.

Nguồn dữ liệu XML

Lớp học JRXmlDataSourcelà một triển khai nguồn dữ liệu dựa trên DOM, sử dụng các biểu thức XPath để chọn dữ liệu từ tài liệu XML. Các bản ghi trong nguồn dữ liệu XML được biểu diễn bằng các phần tử nút được chọn thông qua biểu thức XPath. Giá trị trường được truy xuất từ ​​mỗi bản ghi bằng cách sử dụng biểu thức XPath được cung cấp bởi mô tả trường (phần tử <fieldDescription> trong JRXML).

XPath là một ngôn ngữ được sử dụng để điều hướng qua các thuộc tính và phần tử của tài liệu XML. Thông tin thêm về XPath có thể được tìm thấy tạihttp://www.w3.org/TR/xpath.

Nguồn dữ liệu CSV

JRCsvDataSourceđại diện cho một triển khai cho các nguồn dữ liệu, lấy dữ liệu của chúng từ các tệp văn bản có cấu trúc; thường là CSV. Giá trị trường được truy xuất bằng chỉ mục cột của chúng.

Nguồn dữ liệu XLS

JRXlsDataSourceđại diện cho một triển khai cho các nguồn dữ liệu, lấy dữ liệu của chúng từ các tài liệu Excel. Ánh xạ trường báo cáo để triển khai nguồn dữ liệu này cũng dựa trên chỉ mục cột trường.

Nguồn dữ liệu trống

Lớp JREmptyDataSource, mô phỏng một nguồn dữ liệu với một số lượng bản ghi trống ảo bên trong. Nó được sử dụng bởi các công cụ giao diện người dùng để cung cấp chức năng xem trước báo cáo cơ bản hoặc trong các mẫu báo cáo đặc biệt hoặc cho mục đích thử nghiệm và gỡ lỗi.

Nguồn dữ liệu có thể lặp lại

Các net.sf.jasperreports.engine.JRRewindableDataSourcemở rộng giao diện JRDataSource cơ bản . Nó chỉ thêm một phương thức, gọi là moveFirst (), vào giao diện. Phương thức này nhằm di chuyển con trỏ tới phần tử đầu tiên trong nguồn dữ liệu.

Nguồn dữ liệu có thể lặp lại hữu ích khi làm việc với các báo cáo phụ được đặt trong một dải không được phép tách do cài đặt isSplitAllowed = "false" và không có đủ không gian trên trang hiện tại để hiển thị báo cáo phụ.

Tất cả các triển khai nguồn dữ liệu trên đều có thể tua lại ngoại trừ JRResultSetDataSource, vì nó không hỗ trợ di chuyển con trỏ bản ghi trở lại. Điều này chỉ đặt ra một vấn đề nếu nguồn dữ liệu này được sử dụng theo cách thủ công để bọc một java.sql.ResultSet trước khi chuyển nó đến báo cáo phụ. Không có vấn đề gì, nếu truy vấn SQL nằm trong mẫu báo cáo phụ, vì công cụ sẽ thực thi lại nó khi khởi động lại báo cáo phụ trên trang tiếp theo.

Nhà cung cấp nguồn dữ liệu

Thư viện JasperReports có giao diện net.sf.jasperreports.engine.JRDataSourceProvider. Điều này giúp tạo và xử lý các đối tượng nguồn dữ liệu. Khi tạo mẫu báo cáo bằng các công cụ GUI, cần có một công cụ đặc biệt để tùy chỉnh nguồn dữ liệu của báo cáo. JRDataSourceProvider là cách tiêu chuẩn để cắm các nguồn dữ liệu tùy chỉnh vào một công cụ thiết kế. Việc triển khai tùy chỉnh giao diện này phải triển khai các phương pháp sau đây cho phép tạo và loại bỏ các đối tượng nguồn dữ liệu và cả các phương pháp để liệt kê các trường báo cáo có sẵn bên trong nguồn dữ liệu nếu có thể:

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;

Các trường báo cáo là các phần tử, đại diện cho ánh xạ dữ liệu giữa nguồn dữ liệu và mẫu báo cáo. Các trường có thể được kết hợp trong biểu thức báo cáo để có được kết quả mong muốn. Mẫu báo cáo có thể chứa không hoặc nhiều phần tử <field>. Khi khai báo các trường báo cáo, nguồn dữ liệu phải cung cấp dữ liệu tương ứng với tất cả các trường được xác định trong mẫu báo cáo.

Khai báo trường

Khai báo trường được thực hiện như hình dưới đây -

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

Thuộc tính Tên

Các tên thuộc tính của thẻ <lĩnh vực> phần tử là bắt buộc. Nó tham chiếu đến trường trong biểu thức báo cáo theo tên.

Thuộc tính lớp

Các lớp thuộc tính chỉ định tên lớp cho giá trị trường. Giá trị mặc định của nó là java.lang.String . Điều này có thể được thay đổi thành bất kỳ lớp nào có sẵn trong thời gian chạy. Bất kể loại trường báo cáo là gì, công cụ sẽ xử lý việc truyền trong các biểu thức báo cáo trong đó mã thông báo $ F {} được sử dụng, do đó, việc truyền thủ công là không cần thiết.

Mô tả trường

Phần tử <fieldDesciption> là một phần tử tùy chọn. Điều này rất hữu ích khi triển khai nguồn dữ liệu tùy chỉnh. Ví dụ: chúng ta có thể lưu trữ một khóa hoặc một số thông tin, qua đó chúng ta có thể truy xuất giá trị của trường từ nguồn dữ liệu tùy chỉnh trong thời gian chạy. Bằng cách sử dụng phần tử <fieldDesciption> thay cho tên trường, bạn có thể dễ dàng vượt qua các hạn chế của quy ước đặt tên trường khi truy xuất các giá trị trường từ nguồn dữ liệu.

Sau đây là một đoạn mã từ tệp JRXML hiện có của chúng tôi ( Thiết kế Báo cáo Chương ). Tại đây, chúng ta có thể thấy việc sử dụngname, classfieldDescription các yếu tố.

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

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

Trường sắp xếp

Vào những thời điểm yêu cầu sắp xếp dữ liệu và việc triển khai nguồn dữ liệu không hỗ trợ nó (ví dụ: nguồn dữ liệu CSV), JasperReports hỗ trợ sắp xếp nguồn dữ liệu dựa trên trường trong bộ nhớ. Việc sắp xếp có thể được thực hiện bằng cách sử dụng một hoặc nhiều phần tử <sortField> trong mẫu báo cáo.

Nếu ít nhất một trường sắp xếp được chỉ định, trong quá trình điền báo cáo, nguồn dữ liệu được chuyển đến một phiên bản JRSortableDataSource . Điều này đến lượt mình, tìm nạp tất cả các bản ghi từ nguồn dữ liệu, thực hiện sắp xếp bộ nhớ theo các trường được chỉ định và thay thế nguồn dữ liệu ban đầu.

Tên trường sắp xếp phải giống với tên trường báo cáo. Các trường được sử dụng để sắp xếp phải có kiểu triển khai java.util.Comp so sánh. Sắp xếp theo thứ tự tự nhiên được thực hiện cho tất cả các trường ngoại trừ các trường thuộc loại java.lang.String (đối với loại Chuỗi, trình đối chiếu tương ứng với ngôn ngữ điền báo cáo được sử dụng). Khi một số Trường sắp xếp được chỉ định, việc sắp xếp sẽ được thực hiện bằng cách sử dụng các trường làm khóa sắp xếp theo thứ tự chúng xuất hiện trong mẫu báo cáo. Ví dụ sau minh họa tính năng sắp xếp.

Ví dụ về báo cáo được sắp xếp

Hãy thêm dấu <sortField> yếu tố đối với mẫu báo cáo hiện có của chúng tôi ( Thiết kế báo cáo chương ). Hãy sắp xếp quốc gia của trường theo thứ tự giảm dần. 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">
	
   <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>

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ư 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) như sau:

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

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 bên dưới:

Ở đây, chúng ta có thể thấy tên các quốc gia được sắp xếp theo thứ tự giảm dần trong bảng chữ cái.

Biểu thức báo cáo là các tính năng mạnh mẽ của JasperReports, cho phép chúng tôi hiển thị dữ liệu được tính toán trên báo cáo. Dữ liệu được tính toán là dữ liệu không phải là dữ liệu tĩnh và không được chuyển cụ thể dưới dạng tham số báo cáo hoặc trường nguồn dữ liệu. Biểu thức báo cáo được xây dựng từ việc kết hợp các tham số báo cáo, trường và dữ liệu tĩnh. Ngôn ngữ Java được sử dụng để viết các biểu thức báo cáo theo mặc định. Các ngôn ngữ kịch bản khác cho biểu thức báo cáo như ngôn ngữ kịch bản Groovy, JavaScript hoặc tập lệnh BeanShell được hỗ trợ bởi trình biên dịch JasperReports.

Chương này sẽ giải thích cho bạn - biểu thức báo cáo hoạt động như thế nào, giả sử rằng chúng chỉ được viết bằng ngôn ngữ Java. Trong mẫu báo cáo JRXML, có một số phần tử xác định các biểu thức như:

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

Khai báo Biểu thức

Về cơ bản, tất cả các biểu thức báo cáo đều là biểu thức Java, có thể tham chiếu đến các trường báo cáo, biến báo cáo và tham số báo cáo.

Tham chiếu trường trong biểu thức

Để sử dụng tham chiếu trường báo cáo trong một biểu thức, tên của trường phải được đặt giữa $F{} chuỗi ký tự, như được hiển thị bên dưới -

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

Sau đây là một đoạn mã từ tệp JRXML hiện có của chúng tôi ( thiết kế báo cáo chương ) -

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

Tham chiếu biến trong biểu thức

Để tham chiếu một biến trong một biểu thức, chúng ta phải đặt tên của biến giữa $V{} như thể hiện trong ví dụ dưới đây -

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

Tham chiếu tham số trong biểu thức

Để tham chiếu một tham số trong một biểu thức, tên của tham số phải được đặt giữa $P{} như thể hiện trong ví dụ dưới đây -

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

Sau đây là một đoạn mã từ tệp JRXML hiện có của chúng tôi, cho thấy sự tham chiếu của tham số trong một biểu thức. (JRXML từ thiết kế báo cáo chương ) -

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

Như bạn đã thấy ở trên, các tham chiếu tham số, trường và biến trên thực tế là các đối tượng Java thực. Biết lớp của chúng từ khai báo tham số, trường hoặc biến được thực hiện trong mẫu báo cáo, chúng ta thậm chí có thể gọi các phương thức trên các tham chiếu đối tượng đó trong biểu thức.

Ví dụ sau cho thấy - cách trích xuất và hiển thị ký tự đầu tiên từ trường báo cáo java.lang.String "Tên" -

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

Tham chiếu gói tài nguyên trong biểu thức

Để tham chiếu một tài nguyên trong một biểu thức, khóa phải được đặt giữa$R{} như thể hiện trong ví dụ dưới đây -

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

Dựa trên ngôn ngữ do thời gian chạy cung cấp và khóa report.title , gói tài nguyên được liên kết với mẫu báo cáo được tải. Do đó, tiêu đề của báo cáo được hiển thị bằng cách trích xuất giá trị Chuỗi từ gói tài nguyên. Tìm hiểu thêm về quốc tế hóa trong chương Quốc tế hóa .

Máy tính

Máy tính là một thực thể trong JasperReports, đánh giá các biểu thức và gia tăng các biến hoặc bộ dữ liệu tại thời điểm điền báo cáo. Trong quá trình biên dịch, thông tin được trình biên dịch tạo ra và lưu trữ trong báo cáo biên dịch. Thông tin này được sử dụng trong thời gian điền báo cáo để xây dựng một phiên bản của lớp net.sf.jasperreports.engine.fill.JRCalculator.

Tệp nguồn Java được tạo và biên dịch nhanh chóng bởi trình biên dịch báo cáo dựa trên Java. Lớp được tạo ra này là một lớp con của JRCalculator và mã bytecode được tạo ra bằng cách biên dịch nó được lưu trữ bên trong đối tượng JasperReport. Mã bytcode này được tải vào thời điểm điền báo cáo và lớp kết quả được khởi tạo để lấy đối tượng máy tính cần thiết để đánh giá biểu thức.

Biểu thức có điều kiện

JasperReports không hỗ trợ các câu lệnh if-else khi xác định các biểu thức biến. Thay vào đó, bạn có thể sử dụng các toán tử bậc ba{cond} ? {statement 1} : {statement 2}. Toán tử này có thể được lồng vào bên trong một biểu thức Java để có được đầu ra mong muốn dựa trên nhiều điều kiện.

Ví dụ về Biểu thức có điều kiện trong Báo cáo

Hãy sửa đổi mẫu báo cáo hiện có ( Thiết kế báo cáo theo chương ) và thêm biểu thức điều kiện cho quốc gia của trường. 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">

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

Các mã java để điền báo cáo như sau. Nội dung của tệpC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java như -

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ư -

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

Chúng tôi sẽ thêm một bản ghi mới với trường quốc gia trống trong Danh sách đậu Java của chúng tôi. Nội dung của tệpC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java như -

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

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) được đưa ra bên dưới.

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.

BUILD SUCCESSFUL
Total time: 5 minutes 5 seconds

C:\tools\jasperreports-5.0.1\test>

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 bên dưới:

Ở đây, chúng tôi có thể thấy, đối với bản ghi cuối cùng, chúng tôi đã không chuyển bất kỳ dữ liệu nào cho quốc gia thực địa, "KHÔNG QUỐC GIA" đang được in.

Biến báo cáo là các đối tượng đặc biệt được xây dựng trên đầu biểu thức báo cáo.

Các biến báo cáo đơn giản hóa các tác vụ sau:

  • Biểu thức báo cáo, được sử dụng nhiều trong toàn bộ mẫu báo cáo. Các biểu thức này chỉ có thể được khai báo một lần bằng cách sử dụng các biến báo cáo.

  • Các biến báo cáo có thể thực hiện các phép tính khác nhau dựa trên các giá trị biểu thức tương ứng như đếm, tổng, trung bình, thấp nhất, cao nhất, phương sai, v.v.

Nếu các biến được xác định trong thiết kế báo cáo, thì chúng có thể được tham chiếu bởi các biến mới trong biểu thức. Do đó, thứ tự các biến được khai báo trong thiết kế báo cáo là quan trọng.

Sự định nghĩa biến

Một khai báo biến như sau:

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

Như đã thấy ở trên, phần tử <variable> chứa một số thuộc tính. Các thuộc tính này được tóm tắt dưới đây:

Thuộc tính Tên

Tương tự như các tham sốtrường , thuộc tính name của phần tử </variable> là bắt buộc. Nó cho phép tham chiếu đến biến theo tên khai báo của nó trong các biểu thức báo cáo.

Thuộc tính lớp

Các lớp thuộc tính cũng là bắt buộc mà xác định tên lớp cho các giá trị khác nhau. Giá trị mặc định của nó là java.lang.String . Điều này có thể được thay đổi thành bất kỳ lớp nào có sẵn trong classpath, cả tại thời điểm biên dịch báo cáo và thời gian điền báo cáo. Công cụ xử lý việc truyền kiểu trong các biểu thức báo cáo mà mã thông báo $ V {} được sử dụng, do đó, không cần truyền kiểu thủ công.

Phép tính

Thuộc tính này xác định - phép tính nào sẽ thực hiện trên biến khi điền vào báo cáo. Các phần phụ sau đây mô tả tất cả các giá trị có thể có cho thuộc tính tính toán của phần tử <variable>.

  • Trung bình - Giá trị biến là giá trị trung bình của mọi giá trị khác rỗng của biểu thức biến. Chỉ hợp lệ cho các biến số.

  • Đếm - Giá trị biến là số lượng các trường hợp không rỗng của biểu thức biến.

  • Đầu tiên - Giá trị biến là giá trị của phiên bản đầu tiên của biểu thức biến. Các giá trị tiếp theo bị bỏ qua.

  • Cao nhất - Giá trị biến là giá trị cao nhất của biểu thức biến.

  • Thấp nhất - Giá trị biến là giá trị thấp nhất cho biểu thức biến trong báo cáo.

  • Không có gì - Không có phép tính nào được thực hiện trên biến.

  • Độ lệch chuẩn - Giá trị biến là độ lệch chuẩn của tất cả các giá trị không rỗng khớp với biểu thức báo cáo. Chỉ hợp lệ cho các biến số.

  • Sum - Giá trị biến là tổng của tất cả các giá trị không rỗng được trả về bởi biểu thức báo cáo.

  • Hệ thống - Giá trị biến là một phép tính tùy chỉnh (tự tính giá trị cho biến đó, sử dụng chức năng scriptlets của JasperReports).

  • Phương sai - Giá trị biến là phương sai của tất cả các giá trị không rỗng được trả về bằng cách đánh giá biểu thức của biến báo cáo.

Lớp nhà máy tăng trưởng

Thuộc tính này xác định lớp được sử dụng để tính toán giá trị của biến khi điền vào bản ghi hiện tại trên báo cáo. Giá trị mặc định sẽ là bất kỳ lớp nào đang triển khainet.sf.jasperreports.engine.fill.JRIncrementerFactory. Lớp nhà máy sẽ được công cụ sử dụng để khởi tạo các đối tượng tăng dần trong thời gian chạy tùy thuộc vào thuộc tính tính toán được đặt cho biến.

IncrementType

Điều này xác định thời điểm tính toán lại giá trị của biến. Thuộc tính này sử dụng các giá trị, như bên dưới:

  • Cột - Giá trị biến được tính toán lại ở cuối mỗi cột.

  • Nhóm - Giá trị biến được tính toán lại khi nhóm được chỉ định bởi incrementGroup thay đổi.

  • Không có - Giá trị biến được tính toán lại với mọi bản ghi.

  • Trang - Giá trị biến được tính toán lại ở cuối mỗi trang.

  • Báo cáo - Giá trị biến được tính toán lại một lần vào cuối báo cáo.

Nhóm tăng dần

Điều này xác định tên của nhóm mà tại đó giá trị biến được tính toán lại, khi incrementTypeNhóm . Điều này lấy tên của bất kỳ nhóm nào được khai báo trong mẫu báo cáo JRXML.

ResetType

Điều này xác định thời điểm giá trị của một biến được đặt lại. Thuộc tính này sử dụng các giá trị, như bên dưới:

  • Cột - Giá trị biến được đặt lại ở đầu mỗi cột.

  • Nhóm - Giá trị biến được đặt lại khi nhóm được chỉ định bởi incrementGroup thay đổi.

  • Không có - Giá trị biến không bao giờ được đặt lại.

  • Trang - Giá trị biến được đặt lại ở đầu mỗi trang.

  • Báo cáo - Giá trị biến chỉ được đặt lại một lần ở đầu báo cáo.

ResetGroup

Điều này xác định tên của nhóm mà tại đó giá trị biến được đặt lại, khi resetTypeNhóm . Các giá trị cho thuộc tính này sẽ là tên của bất kỳ nhóm nào được khai báo trong mẫu báo cáo JRXML.

Các biến báo cáo tích hợp

Có một số biến hệ thống tích hợp sẵn, sẵn sàng sử dụng trong các biểu thức, như sau:

S.NO Tên và mô tả biến
1

PAGE_NUMBER

Giá trị của biến này là số trang hiện tại của nó. Nó có thể được sử dụng để hiển thị cả số trang hiện tại và tổng số trang sử dụng một tính năng đặc biệt của các nguyên tố lĩnh vực JasperReports văn bản, evaluationTime thuộc tính.

2

COLUMN_NUMBER

Biến này chứa số cột hiện tại.

3

REPORT_COUNT

Biến báo cáo này chứa tổng số bản ghi được xử lý.

4

PAGE_COUNT

Biến này chứa số lượng bản ghi đã được xử lý khi tạo trang hiện tại.

5

COLUMN_COUNT

Biến này chứa số lượng bản ghi đã được xử lý khi tạo cột hiện tại.

6

GroupName_COUNT

Tên của biến này có nguồn gốc từ tên của nhóm mà nó tương ứng với, kèm theo dãy _COUNT. Biến này chứa số lượng bản ghi trong nhóm hiện tại.

Thí dụ

Hãy thêm một biến (countNumber) và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 ). Chúng tôi sẽ đếm trước số lượng cho mỗi bản ghi. 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">
	
   <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>

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ư 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 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

Kết quả của việc biên dịch ở trên, một cửa sổ JasperViewer mở ra như trong màn hình bên dưới:

Ở đây, chúng ta thấy rằng số đếm được đặt trước cho mỗi bản ghi.

Chúng ta đã thảo luận về cấu trúc của một mẫu báo cáo đơn giản trong chương Bắt đầu . Trên các dòng tương tự, JasperReports cấu trúc mẫu báo cáo thành nhiều phần. Phần là các phần của báo cáo có chiều cao được chỉ định và có thể chứa các đối tượng báo cáo như đường thẳng, hình chữ nhật, hình ảnh hoặc trường văn bản.

Công cụ báo cáo lặp lại qua các bản ghi ảo của nguồn dữ liệu báo cáo được cung cấp tại thời điểm điền báo cáo. Tùy thuộc vào hành vi xác định của từng phần, công cụ sẽ hiển thị từng phần báo cáo khi thích hợp. Ví dụ: phần chi tiết được hiển thị cho mỗi bản ghi trong nguồn dữ liệu. Khi ngắt trang xảy ra, phần đầu trang và chân trang của trang được hiển thị khi cần thiết.

Trong JasperReports, các phần thuật ngữ và báo cáo cũng được gọi là report bands. Các phần được tạo thành từ một hoặc nhiều dải. Các phần này được điền nhiều lần vào thời gian tạo báo cáo và chuẩn bị tài liệu cuối cùng.

Phần chính

Mẫu báo cáo trong JasperReports có các phần chính sau:

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

Bảng sau đây tóm tắt từng phần -

S.NO Phần và Mô tả
1

Title

Phần này chỉ xuất hiện một lần ở đầu báo cáo.

2

Page Header

Phần này xuất hiện ở đầu mỗi trang trong tài liệu được tạo.

3

Column Header

Phần này xuất hiện ở đầu mỗi cột trong tài liệu được tạo. Nếu báo cáo chỉ có một cột được xác định, thì phần đầu trang và chân trang của cột sẽ bị bỏ qua.

4

Group Header

Phần này được giới thiệu bởi một nhóm báo cáo ( Nhóm chương ). Mỗi khi biểu thức nhóm thay đổi giá trị của nó, phần tiêu đề nhóm được in phía trên phần chi tiết. Trong trường hợp, nếu nhiều nhóm được xác định, tiêu đề nhóm được in theo thứ tự xác định nhóm.

5

Detail

Phần này được lặp lại cho mỗi dòng dữ liệu được cung cấp bởi nguồn dữ liệu của báo cáo. Phần chi tiết có thể được làm bằng nhiều dải.

6

Group Footer

Phần này được giới thiệu bởi một nhóm báo cáo ( Nhóm chương ). Phần chân trang nhóm được in bên dưới phần chi tiết trước khi giá trị của biểu thức nhóm thay đổi. Chân trang nhóm luôn được in cho dòng dữ liệu cuối cùng trong nguồn dữ liệu. Trong trường hợp, nếu nhiều nhóm được xác định, thì phần chân trang của nhóm được in theo thứ tự ngược lại của định nghĩa nhóm.

7

Column Footer

Phần này xuất hiện ở cuối mỗi cột. Nếu số cột của báo cáo là 1, thì các phần đầu trang và chân trang của cột sẽ bị bỏ qua.

số 8

Page Footer

Phần này xuất hiện ở cuối mỗi trang.

9

Last Page Footer

Phần này thay thế phần chân trang thông thường trên trang cuối cùng của báo cáo. Trong trường hợp, phần tóm tắt cũng có, thì đây có thể không phải là trang cuối cùng của tài liệu. Phần này đôi khi hữu ích khi thông tin tóm tắt phải được hiển thị ở cuối trang cuối cùng.

10

Summary

Phần này chỉ xuất hiện một lần ở cuối báo cáo.

11

No Data

Phần này được in khi thuộc tính báo cáo Khi Không có Dữ liệu In được đặt thành Không có Phần Dữ liệu . Nếu phần <noData> được xác định trong mẫu báo cáo và nếu nguồn dữ liệu trống, thì phần <noData> sẽ là phần duy nhất được tính đến tại thời điểm lấp đầy và nội dung của nó sẽ tạo ra kết quả báo cáo.

12

Background

Phần nền được hiển thị trên mọi trang và không thể tràn sang trang tiếp theo. Các phần tử được đặt trên phần này được đánh giá tại thời điểm khởi tạo trang và được hiển thị trong nền. Tất cả các đối tượng trang khác được hiển thị trên đầu các đối tượng nền. Phần này hữu ích để tạo hình mờ trang.

Phần, phần tử và quan hệ thuộc tính

Sơ đồ sau đây cho thấy các yếu tố và mối quan hệ thuộc tính trong một phần của báo cáo.

Phần tử

Tất cả các phần báo cáo được đề cập ở trên là tùy chọn. Nhưng bất kỳ mẫu báo cáo nào cũng sẽ có ít nhất một phần như vậy. Mỗi phần này chứa một <band> phần tử làm phần tử con duy nhất của nó. A <band> có thể chứa không hoặc nhiều phần tử con sau -

<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> hoặc <elementGroup>

Mỗi phần tử này phải chứa một dấu <reportElement> là phần tử đầu tiên của nó (ngoại trừ elementGroup). A <reportElement> xác định cách dữ liệu được sắp xếp cho phần tử cụ thể đó. Không giống như các biến và tham số, các phần tử báo cáo không bắt buộc phải có tên, bởi vì thông thường bạn không cần lấy bất kỳ phần tử riêng lẻ nào bên trong mẫu báo cáo.

Bảng dưới đây tóm tắt các thuộc tính của <reportElement> -

Thuộc tính Sự miêu tả Giá trị hợp lệ
x Chỉ định tọa độ x của phần tử dải. Một giá trị số nguyên cho biết tọa độ x của phần tử tính bằng pixel. Thuộc tính này là bắt buộc.
y Chỉ định tọa độ y của phần tử dải. Một giá trị số nguyên cho biết tọa độ y của phần tử tính bằng pixel. Thuộc tính này là bắt buộc.
chiều rộng Chỉ định chiều rộng của phần tử dải. Một giá trị số nguyên cho biết chiều rộng phần tử tính bằng pixel. Thuộc tính này là bắt buộc.
Chiều cao Chỉ định chiều cao của phần tử dải. Một giá trị số nguyên cho biết chiều cao phần tử tính bằng pixel. Thuộc tính này là bắt buộc.
Chìa khóa Định danh duy nhất của phần tử ban nhạc. Một giá trị chuỗi duy nhất.
StretType Chỉ định cách phần tử giãn ra khi dải chứa căng ra

NoStretch (default) - Phần tử sẽ không giãn ra.

RelativeToTallestObject - Phần tử sẽ kéo dài để chứa đối tượng cao nhất trong nhóm của nó.

RelativeToBand - Phần tử sẽ kéo dài để phù hợp với chiều cao của ban nhạc.

positionType Chỉ định vị trí của phần tử khi dải kéo dài.

Float - Phần tử sẽ di chuyển tùy thuộc vào kích thước của các phần tử xung quanh.

FixRelativeToTop (default) - Phần tử sẽ duy trì một vị trí cố định so với đỉnh của ban nhạc.

FixRelativeToBottom - Phần tử sẽ duy trì một vị trí cố định so với đáy của dải.

isPrintRepeatedValues Chỉ định nếu các giá trị lặp lại được in.

true (default) - Các giá trị lặp lại sẽ được in.

false - Các giá trị lặp lại sẽ không được in.

chế độ Chỉ định chế độ nền của phần tử Đục, trong suốt
isRemoveLineWhenBlank Chỉ định xem phần tử có nên bị xóa khi nó trống và không có phần tử nào khác trong cùng một không gian ngang hay không. đúng sai
isPrintInFirstWholeBand Chỉ định xem phần tử phải được in trong toàn bộ dải, nghĩa là dải không được chia giữa các trang hoặc cột báo cáo. đúng sai
isPrintWhenDetailOverFlows Chỉ định nếu phần tử sẽ được in khi dải tràn sang một trang hoặc cột mới. đúng sai
printWhenGroupChanges Chỉ định rằng phần tử sẽ được in khi nhóm được chỉ định thay đổi. Một giá trị chuỗi.
màu vàng Chỉ định màu nền trước của phần tử. Giá trị RGB thập lục phân đứng trước ký tự # hoặc một trong các giá trị xác định trước sau: đen, xanh lam, lục lam, darkGray, xám, xanh lục, lightGray, đỏ tươi, cam, hồng, đỏ, vàng, trắng.
màu nền Chỉ định màu nền của phần tử. Giống như Giá trị hợp lệ cho màu forecolor

Thuộc tính phần

Sau đây là các thuộc tính của phần báo cáo:

Chiều cao

Chiều cao của phần chỉ định chiều cao tính bằng pixel cho phần cụ thể đó và rất quan trọng trong thiết kế báo cáo tổng thể.

In khi biểu thức

Biểu thức Boolean xác định xem phần có nên được in hay không.

Được phép tách

Cờ cho biết phần có được phép tách khi nó không vừa trên trang hiện tại hay không. Nếu đúng, phần này sẽ được chuyển sang trang tiếp theo. Lưu ý rằng trong trường hợp, phần không phù hợp với trang tiếp theo, thì phần đó sẽ được tách ra bất kể giá trị của cờ. splitType có thể nhận các giá trị sau:

  • splitType = "Stretch:" Tách nội dung bị kéo dài. Nếu phần kéo dài trên trang hiện tại (nếu không gian khả dụng nhỏ hơn chiều cao đã khai báo), vùng được thêm vào chiều cao ban đầu được phép tách sang trang tiếp theo.

  • splitType = "Ngăn chặn:" Ngăn chặn sự phân tách trong lần thử đầu tiên. Nếu phần không phù hợp trên trang tiếp theo, việc phân tách diễn ra bình thường, vì việc ngăn chặn phân chia dải chỉ có hiệu lực trong lần phân tách đầu tiên.

  • splitType = "Ngay lập tức:" Chia ngay lập tức. Băng được phép tách ở bất kỳ đâu ngoại trừ phía trên, phần tử trên cùng của nó.

Thí dụ

Để trình bày từng phần, hãy viết mẫu báo cáo (jasper_report_template.jrxml). Lưu tệp này vàoC:\tools\jasperreports-5.0.1\testdanh mục. Trong tệp này, chúng tôi sẽ hiển thị một văn bản trong mỗi phần (chúng tôi đã thảo luận ở trên). Nội dung của tệp như dưới đây:

<?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>

Mã java để điền và tạo báo cáo được đưa ra bên dưới. Hãy lưu tệp nàyJasperReportFill.java vào thư mục 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();
      }

   }
}

Ở đây, chúng tôi sử dụng một phiên bản của JREmptyDataSource khi điền các báo cáo để mô phỏng nguồn dữ liệu với một bản ghi trong đó, nhưng với tất cả các trường trong bản ghi này là trống.

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ư bên dưới.

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) như sau:

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

Kết quả của việc biên dịch ở trên, một cửa sổ JasperViewer mở ra như trong màn hình bên dưới:

Ở đây, chúng ta có thể thấy trong mỗi phần có một văn bản được in. Cần lưu ý rằng vì JRXML chứa phần tử <lastPageFooter> nên nó sẽ được hiển thị ở trang cuối cùng của báo cáo thay vì phần tử <pageFooter> được hiển thị. Các phần tử <columnHeader> và <columnFooter> sẽ chỉ được hiển thị trên báo cáo, nếu nó có nhiều hơn một cột.

Các nhóm trong JasperReports giúp sắp xếp dữ liệu trên báo cáo một cách hợp lý. Nhóm báo cáo đại diện cho một chuỗi các bản ghi liên tiếp trong nguồn dữ liệu, có điểm chung, chẳng hạn như giá trị của một trường báo cáo nhất định. Nhóm báo cáo được xác định bởi phần tử <group>. Một báo cáo có thể có bất kỳ số lượng nhóm nào. Sau khi khai báo, các nhóm có thể được giới thiệu trong toàn bộ báo cáo.

Một nhóm báo cáo có ba yếu tố -

  • Biểu thức nhóm - Biểu thức này cho biết dữ liệu phải thay đổi để bắt đầu một nhóm dữ liệu mới.

  • Phần tiêu đề nhóm - Giúp đặt nhãn ở đầu dữ liệu được nhóm.

  • Phần chân trang nhóm - Giúp đặt nhãn ở cuối dữ liệu được nhóm.

Trong quá trình lặp lại qua nguồn dữ liệu tại thời điểm điền vào báo cáo, nếu giá trị của biểu thức nhóm thay đổi, sự cố nhóm sẽ xảy ra và các phần <groupFooter> và <groupHeader> tương ứng được chèn vào tài liệu kết quả.

Cơ chế nhóm báo cáo không thực hiện bất kỳ sắp xếp nào đối với dữ liệu do nguồn dữ liệu cung cấp. Nhóm dữ liệu chỉ hoạt động như mong đợi khi các bản ghi trong nguồn dữ liệu đã được sắp xếp theo các biểu thức nhóm được sử dụng trong báo cáo.

Thuộc tính nhóm

Phần tử <group> chứa các thuộc tính cho phép chúng tôi kiểm soát cách sắp xếp dữ liệu được nhóm. Các thuộc tính được tóm tắt trong bảng dưới đây:

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

name

Đây là điều bắt buộc. Nó tham chiếu đến nhóm trong các biểu thức báo cáo theo tên. Nó tuân theo các quy ước đặt tên tương tự mà chúng tôi đã đề cập cho các tham số báo cáo, trường và biến báo cáo. Nó có thể được sử dụng trong các thuộc tính JRXML khác khi bạn muốn tham chiếu đến một nhóm báo cáo cụ thể.

2

isStartNewColumn

Khi được đặt thành true , mỗi nhóm dữ liệu sẽ bắt đầu trên một cột mới. Giá trị mặc định là sai .

3

isStartNewPage

Khi được đặt thành true , mỗi nhóm dữ liệu sẽ bắt đầu trên một trang mới. Giá trị mặc định là sai .

4

isResetPageNumber

Khi được đặt thành true , số trang báo cáo sẽ được đặt lại mỗi khi nhóm mới bắt đầu. Giá trị mặc định là sai.

5

isReprintHeaderOnEachPage

Khi được đặt thành true , tiêu đề nhóm sẽ được in lại trên mọi trang. Giá trị mặc định là sai .
6

minHeightToStartNewPage

Xác định lượng không gian dọc tối thiểu cần thiết ở cuối cột để đặt tiêu đề nhóm trên cột hiện tại. Số tiền được chỉ định trong các đơn vị báo cáo.

7

footerPosition

Hiển thị vị trí của chân trang nhóm trên trang, cũng như hành vi của nó liên quan đến các phần báo cáo theo sau nó. Giá trị của nó có thể là: Normal , StackAtBottom , ForceAtBottomCollateAtBottom . Giá trị mặc định là Bình thường .

số 8

keepTogether

Khi được đặt thành true , ngăn không cho nhóm bị tách trong lần thử nghỉ đầu tiên.

Thí dụ

Hãy thêm một nhóm (CountryGroup) vào mẫu báo cáo hiện có ( Thiết kế Báo cáo Chương ). Sự xuất hiện của mỗi quốc gia được tính và số lượng được hiển thị dưới dạng chân trang của nhóm. Trong tiêu đề nhóm, số lượng của mỗi bản ghi được đặt trước. 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">

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

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ư 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ư bên dưới.

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

Kết quả của việc biên dịch ở trên, một cửa sổ JasperViewer mở ra như trong màn hình bên dưới:

Ở đây, chúng ta thấy rằng mỗi quốc gia được nhóm lại và số lần xuất hiện của mỗi quốc gia được hiển thị ở chân trang của mỗi nhóm.

Một báo cáo chứa các phần tử văn bản và mỗi phần tử này có thể có cài đặt phông chữ riêng. Các cài đặt này có thể được chỉ định bằng cách sử dụng <font> có sẵn trong thẻ <textElement>. Một báo cáo có thể xác định một số phông chữ. Sau khi được xác định, chúng có thể được sử dụng làm cài đặt phông chữ mặc định hoặc cơ sở cho các định nghĩa phông chữ khác trong toàn bộ báo cáo.

Phông chữ Báo cáo

Phông chữ báo cáo là một tập hợp các cài đặt phông chữ, được khai báo ở cấp báo cáo. Phông chữ báo cáo có thể được sử dụng lại trong toàn bộ mẫu báo cáo khi đặt thuộc tính phông chữ của các phần tử văn bản.

Phông chữ báo cáo hiện không được dùng nữa. Không sử dụng các phần tử <reportFont /> được khai báo trong chính tài liệu. Sử dụng phần tử <style /> để thay thế.

Thuộc tính phông chữ

Bảng dưới đây tóm tắt các thuộc tính chính của <font> phần tử -

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

fontName

Tên phông chữ, có thể là tên của phông chữ vật lý, phông chữ lôgic hoặc tên của họ phông chữ từ các phần mở rộng phông chữ JasperReports đã đăng ký.

2

size

Kích thước của phông chữ được đo bằng điểm. Nó mặc định là 10.

3

isBold

Cờ chỉ định nếu cần phải có phông chữ đậm. Nó mặc định là false.

4

isItalic

Cờ chỉ định xem phông chữ nghiêng có được yêu cầu hay không. Nó mặc định là false.

5

isUnderline

Cờ chỉ định xem trang trí văn bản gạch dưới có được yêu cầu hay không. Nó mặc định là false.

6

isStrikeThrough

Cờ chỉ định xem trang trí văn bản gạch ngang có được yêu cầu hay không. Nó mặc định là false.

7

pdfFontName

Tên của một phông chữ PDF tương đương mà thư viện iText yêu cầu khi xuất tài liệu sang định dạng PDF.

số 8

pdfEncoding

Thư viện iText cũng yêu cầu mã hóa ký tự PDF tương đương.

9

isPdfEmbedded

Cờ chỉ định liệu phông chữ có được nhúng vào tài liệu hay không. Nó mặc định là false. Nếu được đặt thành true, giúp xem tài liệu PDF mà không gặp bất kỳ sự cố nào.

Các loại phông chữ

Trong JasperReports, phông chữ có thể được phân loại là:

  • Logical Fonts- Năm loại phông chữ, đã được nền tảng Java công nhận từ phiên bản 1.0, được gọi là phông chữ logic. Đây là -Serif, SansSerif, Monospaced, Dialog, and DialogInput. Các phông chữ logic này không phải là thư viện phông chữ thực tế được cài đặt ở bất kỳ đâu trên hệ thống. Chúng chỉ đơn thuần là tên kiểu phông chữ được thời gian chạy Java nhận dạng. Chúng phải được ánh xạ tới một số phông chữ vật lý được cài đặt trên hệ thống.

  • Physical Fonts- Những phông chữ này là thư viện phông chữ thực tế bao gồm, ví dụ, phông chữ TrueType hoặc PostScript Loại 1. Phông chữ thực có thể là Arial, Time, Helvetica, Courier hoặc bất kỳ phông chữ nào khác, bao gồm cả phông chữ quốc tế.

  • Font Extensions- Thư viện JasperReports có thể sử dụng các phông chữ được đăng ký nhanh chóng trong thời gian chạy, thông qua hỗ trợ tích hợp cho các phần mở rộng phông chữ. Danh sách các họ phông chữ có thể được cung cấp cho JasperReports bằng cách sử dụng phần mở rộng phông chữ. Chúng được làm từ các mặt phông chữ trông giống nhau và hỗ trợ các ngôn ngữ cụ thể.

Như được mô tả trong bảng trên, chúng ta cần chỉ định trong thuộc tính fontName tên của phông chữ vật lý, tên của phông chữ lôgic hoặc tên của họ phông chữ từ các phần mở rộng phông chữ JasperReports đã đăng ký.

Tên phông chữ PDF

Thư viện JasperReports sử dụng thư viện iText, khi xuất báo cáo sang PDF (Định dạng Tài liệu Di động). Các tệp PDF có thể được xem trên nhiều nền tảng khác nhau và sẽ luôn giống nhau. Điều này một phần là do ở định dạng này, có một cách xử lý phông chữ đặc biệt. Thuộc tính fontName không có ích khi xuất sang PDF. Thuộc tính pdfFontName tồn tại nơi chúng ta cần chỉ định cài đặt phông chữ.

Thư viện iText biết cách xử lý các phông chữ và tệp TTF dựng sẵn và nhận dạng các tên phông chữ cài sẵn sau:

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

Theo điều kiện tiên quyết của thư viện iText, để làm việc với phông chữ, chúng ta cần chỉ định một trong những điều sau làm tên phông chữ:

  • Tên phông chữ cài sẵn từ danh sách trên.

  • Tên của tệp TTF (Phông chữ True Type) mà nó có thể định vị trên đĩa.

  • Tên thật của phông chữ, với điều kiện là tệp TTF chứa phông chữ đã được đăng ký trước đó với iText hoặc bí danh đã được xác định khi phông chữ được đăng ký.

Dựa trên các điều kiện tiên quyết ở trên, thuộc tính pdfFontName có thể chứa một trong các giá trị sau:

  • Tên của một phông chữ PDF cài sẵn từ danh sách trên.

  • Tên của tệp TTF có thể nằm trên đĩa trong thời gian chạy khi xuất sang PDF.

  • Tên thật của phông chữ đã đăng ký.

  • Hậu tố của khóa (phần sau net.sf.jasperreports.export.pdf.font ) cho phông chữ được đăng ký với iText dưới dạng tệp phông chữ.

Phông chữ Mặc định và Kế thừa

Mỗi phần tử văn bản kế thừa các thuộc tính phông chữ và kiểu từ phần tử mẹ của nó, đến lượt nó sẽ kế thừa các thuộc tính này từ phần tử mẹ của nó. Nếu không có kiểu và / hoặc phông chữ nào được xác định cho các phần tử, kiểu mặc định (và / hoặc phông - nhưng kiểu này hiện không được dùng nữa) được khai báo trong phần tử gốc <jasperReport /> sẽ được áp dụng.

Việc xác định kiểu hoặc phông chữ mặc định trong JasperReports là không bắt buộc. Nếu không có phông chữ nào được xác định cho một phần tử nhất định, công cụ sẽ tìm các thuộc tính phông chữ kế thừa hoặc nếu không tìm thấy thuộc tính nào theo cách này, nó sẽ tìm thuộc tính net.sf.jasperreports.default.font.name trong / Tệp src / default.jasperreports.properties . Giá trị của nó xác định tên của họ phông chữ sẽ được sử dụng khi các thuộc tính phông chữ không được xác định rõ ràng cho một phần tử văn bản hoặc được kế thừa từ cha mẹ của nó.

Thuộc tính phông chữ mặc định chính và giá trị của chúng được xác định trong tệp /src/default.jasperreports.properties nằm trong bảng bên dưới:

Bất động sản Sự miêu tả
net.sf.jasperreports.default.font.name = SansSerif Tên phông chữ mặc định.
net.sf.jasperreports.default.font.size = 10 Kích thước phông chữ mặc định.
net.sf.jasperreports.default.pdf.font.name = Helvetica Phông chữ PDF mặc định.
net.sf.jasperreports.default.pdf.encoding = Cp1252 Mã hóa ký tự PDF mặc định.
net.sf.jasperreports.default.pdf.embedded = false Theo mặc định, phông chữ PDF không được nhúng.

Thí dụ

Để chứng minh bằng cách sử dụng phông chữ và các thuộc tính phông chữ để có được giao diện văn bản cụ thể, hãy viết mẫu báo cáo mới (jasper_report_template.jrxml). Nội dung của JRXML như dưới đây. Lưu nó vào thư mục C: \ tools \ jasperreports-5.0.1 \ test. Tại đây, chúng tôi sẽ hiển thị một văn bản trong tiêu đề của báo cáo với nhiều định dạng phông chữ khác nhau.

<?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>

Mã java để điền và tạo báo cáo như được cung cấp bên dưới. Hãy lưu tệp nàyJasperFontsReportFill.java vào thư mục 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();
      }

   }
}

Ở đây, chúng tôi sử dụng một phiên bản của JREmptyDataSource khi điền các báo cáo để mô phỏng nguồn dữ liệu có một bản ghi trong đó, nhưng với tất cả các trường là rỗng .

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.JasperFontsReportFill (viewFullReport là mục tiêu mặc định) là -

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

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 bên dưới:

Ở đây, chúng ta có thể thấy rằng văn bản "Chào mừng đến với TutorialsPoint" được hiển thị ở các định dạng phông chữ khác nhau.

Trong JasperReports, làm việc với văn bản cần một số công cụ chuyên dụng để xử lý cả biểu diễn ký tự và thuộc tính định dạng văn bản. Bất kỳ văn bản nào cũng có thể được coi là một chuỗi ký tự với một cấu trúc biểu diễn cụ thể. Giao diện văn bản bao gồm cả bố cục (và đoạn văn) và cài đặt phông chữ. Nhưng trong hầu hết các trường hợp, bố cục văn bản vẫn bất biến, cài đặt phông chữ có thể thay đổi khi chạy báo cáo ở các Miền khác nhau.

Chúng tôi biết rằng các ngôn ngữ khác nhau cần các bộ ký tự khác nhau đối với các ký tự cụ thể. Do đó, làm việc với văn bản có nghĩa là làm việc với phông chữ. Tuy nhiên, thảo luận chi tiết về cách sử dụng phông chữ trong JasperReports có sẵn trong chương Phông chữ Báo cáo .

Một trong những đặc điểm chính liên quan đến nội dung văn bản trong một báo cáo nhất định là khả năng quốc tế hóa nó. Có nghĩa là, chúng tôi có thể chạy báo cáo trong các môi trường bản địa hóa khác nhau, sử dụng các ngôn ngữ khác nhau và các cài đặt bản địa hóa khác mà không cần bất kỳ sửa đổi mã cứng nào. Mã hóa ký tự là một tính năng quan trọng khi báo cáo dự định được quốc tế hóa.

Mã hóa ký tự

Một ký tự là đơn vị chữ viết nhỏ nhất để truyền đạt một thông tin có ý nghĩa. Đó là một khái niệm trừu tượng, một nhân vật không có hình dáng bên ngoài. "Chữ hoa Latinh A" là một ký tự khác với "chữ Latinh a viết thường" và từ "chữ hoa Cyrillic A" và "chữ hoa Alpha của tiếng Hy Lạp".

Hình ảnh đại diện của một nhân vật được gọi là glyph. Một bộ glyph nhất định được gọi làfont. "Chữ hoa Latinh A", "chữ hoa Cyrillic A" và "chữ hoa chữ cái Hy Lạp Alpha" có thể có các nét chữ giống hệt nhau, nhưng chúng là các ký tự khác nhau. Đồng thời, các nét chữ cho "chữ Latinh A viết hoa" có thể trông rất khác trong chữ nghiêng Times New Roman, Gill Sans và Poetica chancery, nhưng chúng vẫn đại diện cho cùng một ký tự.

Tập hợp các ký tự có sẵn được gọi là tập hợp các ký tự . Vị trí (chỉ mục) của một nhân vật nhất định trong một tiết mục được gọi là vị trí mã hoặc điểm mã của nó. Phương pháp biểu thị số điểm mã trong một kho lưu trữ nhất định được gọi làcharacter encoding.

Mã hóa thường được biểu thị dưới dạng các octet. Một octet là một nhóm gồm tám chữ số nhị phân, tức là tám chữ số đơn vị và số không. Một bộ tám có thể thể hiện một dải số từ 0 đến 255 hoặc từ 0x00 đến 0xFF, để sử dụng ký hiệu thập lục phân.

Unicode

Unicode là một kho ký tự chứa hầu hết các ký tự được sử dụng trong các ngôn ngữ trên thế giới. Nó có thể chứa hàng triệu ký tự và đã chứa hàng trăm nghìn ký tự. Unicode được chia thành các "mặt phẳng" gồm 64K ký tự. Mặt phẳng duy nhất được sử dụng trong hầu hết các trường hợp là mặt phẳng đầu tiên, được gọi là mặt phẳng đa ngôn ngữ cơ bản, hoặc BMP.

UTF-8 là kiểu mã hóa được khuyến nghị. Nó sử dụng một số octet thay đổi để biểu diễn các ký tự khác nhau.

Trong tệp JRXML, thuộc tính mã hóa được chỉ định trong tiêu đề. Nó được sử dụng tại thời điểm biên dịch báo cáo để giải mã nội dung XML. Ví dụ: nếu báo cáo chỉ chứa các từ tiếng Pháp và các ký tự như ç, é, â, thì mã hóa ISO-8859-1 (hay còn gọi là Latin-1) là đủ -

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

Như đã thấy ở trên, lý tưởng nhất là chúng ta có thể chọn kiểu mã hóa phù hợp với bộ ký tự tối thiểu, có thể thể hiện chính xác tất cả các ký tự trong tài liệu. Nhưng trong trường hợp tài liệu Đa ngôn ngữ (tức là tài liệu chứa các từ được đánh vần bằng nhiều ngôn ngữ), người ta nên chọn kiểu mã hóa phù hợp với bộ ký tự tối thiểu, có thể biểu diễn chính xác tất cả các ký tự trong tài liệu, ngay cả khi chúng thuộc các ngôn ngữ khác nhau. Một trong những mã hóa ký tự có thể xử lý các tài liệu đa ngôn ngữ làUTF-8, được sử dụng làm giá trị mã hóa mặc định bởi JasperReports.

Các văn bản thường được giữ trong các tệp gói tài nguyên hơn là trong tài liệu trong quá trình quốc tế hóa. Vì vậy, có những trường hợp bản thân JRXML trông hoàn toàn tương thích với ASCII, nhưng các báo cáo được tạo trong thời gian chạy chứa văn bản không thể đọc được bằng ASCII. Kết quả là, đối với một loại định dạng xuất tài liệu nhất định (chẳng hạn như CSV, HTML, XHTML, XML và văn bản), người ta cũng phải biết mã hóa cho tài liệu được tạo. Các ngôn ngữ khác nhau được hỗ trợ bởi các bảng mã ký tự khác nhau. Vì vậy, mỗi lần, chúng tôi cần chạy báo cáo trong môi trường được bản địa hóa. Hơn nữa, chúng ta phải biết, đó là cách mã hóa ký tự thích hợp nhất cho ngôn ngữ tài liệu được tạo. Trong trường hợp này, thuộc tính mã hóa được xác định trong tệp JRXML có thể không hữu ích nữa.

Để giải quyết loại vấn đề này, chúng tôi có thể sử dụng thuộc tính khách hàng xuất khẩu được gọi là net.sf.jasperreports.export.character.encoding . Thuộc tính tùy chỉnh xuất này được mặc định là UTF-8 và có trong JasperReports.

Giá trị mặc định này được đặt trong tệp default.jasperreports.properties . Đối với các tùy chọn cụ thể hơn tại thời điểm xuất, thông số xuất CHARACTER_ENCODING cũng có sẵn.

Thí dụ

Để chứng minh việc sử dụng hỗ trợ unicode trong Jasperreports, hãy viết mẫu báo cáo mới (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testdanh mục. Tại đây, chúng tôi sẽ hiển thị một văn bản bằng các ngôn ngữ khác nhau bằng các ký tự Unicode (\ uXXXX). Bất kỳ ký tự nào được mã hóa bằng UTF-8 chỉ có thể được biểu diễn bằng mã thập lục phân gồm 4 chữ số của nó. Ví dụ: chữ cái Hy Lạp Γ có thể được viết là \ u0393. Khi gặp phải ký hiệu như vậy, công cụ sẽ gọi biểu diễn ký tự thích hợp trong bộ ký tự và chỉ ký tự cụ thể đó mới được in ra. Nội dung của JRXML như sau:

<?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>

Trong tệp trên, chúng ta có thể thấy sự hiện diện của bảng mã UTF-8. Ngoài ra, các đoạn văn bản Unicode được bản địa hóa được lưu trữ trong các tham số tài liệu.

Mã java để điền và tạo báo cáo như dưới đây. Hãy lưu tệp nàyJasperUnicodeReportFill.java vào thư mục 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();
      }

   }
}

Ở đây chúng tôi sử dụng một phiên bản của JREmptyDataSource khi điền các báo cáo để mô phỏng nguồn dữ liệu có một bản ghi trong đó, nhưng với tất cả các trường trong bản ghi này là trống .

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ư bên dưới.

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.JasperUnicodeReportFill (viewFullReport là mục tiêu mặc định) như sau:

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

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 bên dưới:

Ở đây, chúng ta có thể thấy rằng văn bản đang được hiển thị bằng các ngôn ngữ khác nhau. Ngoài ra, chúng tôi thấy rằng các ngôn ngữ được nhóm lại với nhau trên cùng một trang và cũng được trộn vào cùng một phần tử văn bản.

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ữ in đậm, in nghiêng hay bình thường, cỡ 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ố loại được 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 phong cách mẹ.

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. Các 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ố trường hợp, 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 có đ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ị 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 tôi có thể tạo một tập hợp các báo cáo với một giao diện chung bằng cách xác định phong cách tại một địa điểm chung. Sau đó, mẫu kiểu chung này 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 được 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 đ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ư 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 bên dưới:

Ở đâ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 (trong 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).

Chúng ta đã thấy trong các chương trước, dữ liệu hiển thị trên báo cáo thường được lấy từ các thông số báo cáo và trường báo cáo. Dữ liệu này có thể được xử lý bằng cách sử dụng các biến báo cáo và biểu thức của chúng. Có những tình huống khi một chức năng phức tạp không thể đạt được dễ dàng bằng cách sử dụng các biểu thức hoặc biến báo cáo. Ví dụ về điều này có thể là thao tác Chuỗi phức tạp, xây dựng Bản đồ hoặc Danh sách các đối tượng trong bộ nhớ hoặc thao tác ngày tháng bằng cách sử dụng API Java của bên thứ ba. Đối với những tình huống như vậy, JasperReports cung cấp cho chúng tôi một phương tiện đơn giản và mạnh mẽ để thực hiện việc này vớiScriptlets.

Các đoạn mã là chuỗi mã Java được thực thi mỗi khi một sự kiện báo cáo xảy ra. Giá trị của các biến báo cáo có thể bị ảnh hưởng thông qua các tập lệnh.

Khai báo Scriptlet

Chúng ta có thể khai báo một script theo hai cách:

  • Sử dụng <scriptlet> phần tử. Phần tử này có thuộc tính tên và thuộc tính lớp . Các lớp thuộc tính nên xác định tên của lớp, kéo dài JRAbstractScriptlet lớp. Lớp phải có sẵn trong classpath tại thời điểm điền báo cáo và phải có một phương thức khởi tạo trống để động cơ có thể khởi tạo nó một cách nhanh chóng.

  • Sử dụng thuộc tính scriptletClass của phần tử <jasperReport>, trong mẫu báo cáo (JRXML). Bằng cách đặt thuộc tính này với tên đầy đủ đủ điều kiện của scriptlet (bao gồm toàn bộ tên gói), chúng tôi cho biết rằng chúng tôi muốn sử dụng scriptlet. Cá thể scriptlet, được tạo bằng thuộc tính này, hoạt động giống như scriptlet đầu tiên trong danh sách các script và có tên được xác định trước là REPORT.

Lớp Scriptlet

Scriptlet là một lớp java, lớp này phải mở rộng một trong các lớp sau:

  • net.sf.jasperreports.engine.JRAbstractScriptlet- Lớp này chứa một số phương thức trừu tượng phải được ghi đè trong mỗi lần thực thi. Các phương thức này được gọi tự động bởi JasperReports vào thời điểm thích hợp. Nhà phát triển phải triển khai tất cả các phương thức trừu tượng.

  • net.sf.jasperreports.engine.JRDefaultScriptlet- Lớp này chứa các triển khai trống mặc định của mọi phương thức trong JRAbstractScriptlet. Một nhà phát triển chỉ được yêu cầu thực hiện các phương pháp mà họ cần cho dự án của mình.

Bảng sau liệt kê các phương thức trong lớp trên. Các phương pháp này sẽ được công cụ báo cáo gọi vào thời điểm thích hợp, trong giai đoạn điền báo cáo.

S.NO Phương pháp và Mô tả
1

public void beforeReportInit()

Được gọi trước khi khởi chạy báo cáo.

2

public void afterReportInit()

Được gọi sau khi khởi tạo báo cáo.

3

public void beforePageInit()

Được gọi trước khi mỗi trang được khởi tạo.

4

public void afterPageInit()

Được gọi sau mỗi trang được khởi tạo.

5

public void beforeColumnInit()

Được gọi trước khi mỗi cột được khởi tạo.

6

public void afterColumnInit()

Được gọi sau khi mỗi cột được khởi tạo.

7

public void beforeGroupInit(String groupName)

Được gọi trước khi nhóm được chỉ định trong tham số được khởi tạo.

số 8

public void afterGroupInit(String groupName)

Được gọi sau khi nhóm được chỉ định trong tham số được khởi tạo.

9

public void beforeDetailEval()

Được gọi trước khi mỗi bản ghi trong phần chi tiết của báo cáo được đánh giá.

10

public void afterDetailEval()

Được gọi sau khi mỗi bản ghi trong phần chi tiết của báo cáo được đánh giá.

Có thể chỉ định bất kỳ số lượng script nào trên mỗi báo cáo. Nếu không có scriptlet nào được chỉ định cho một báo cáo, công cụ vẫn tạo một cá thể JRDefaultScriptlet duy nhất và đăng ký nó với tham số REPORT_SCRIPTLET được tích hợp sẵn.

Chúng tôi có thể thêm bất kỳ phương thức bổ sung nào mà chúng tôi cần vào script của mình. Báo cáo có thể gọi các phương thức này bằng cách sử dụng tham số REPORT_SCRIPTLET được tích hợp sẵn.

Global Scriptlets

Chúng ta có thể kết hợp các tập lệnh theo một cách khác với các báo cáo, đó là bằng cách khai báo các tập lệnh trên toàn cầu. Điều này làm cho các kịch bản áp dụng cho tất cả các báo cáo được điền trong triển khai JasperReports đã cho. Điều này được thực hiện dễ dàng bởi thực tế là các script có thể được thêm vào JasperReports dưới dạng phần mở rộng. Điểm mở rộng scriptlet được đại diện bởi giao diện net.sf.jasperreports.engine.scriptlets.ScriptletFactory . JasperReports sẽ tải tất cả các nhà máy scriptlet có sẵn thông qua các tiện ích mở rộng trong thời gian chạy. Sau đó, nó sẽ hỏi từng người trong số họ về danh sách các phiên bản script mà họ muốn áp dụng cho báo cáo hiện tại đang được chạy. Khi yêu cầu danh sách các trường hợp scriptlet, engine sẽ cung cấp một số thông tin ngữ cảnh mà nhà máy có thể sử dụng để quyết định, scriptlet nào thực sự áp dụng cho báo cáo hiện tại.

Báo cáo thống đốc

Thống đốc chỉ là một phần mở rộng của các tập lệnh toàn cầu cho phép chúng tôi giải quyết vấn đề của công cụ báo cáo đi vào vòng lặp vô hạn trong thời gian chạy, trong khi tạo báo cáo. Không thể phát hiện các mẫu báo cáo không hợp lệ tại thời điểm thiết kế, bởi vì hầu hết thời gian, các điều kiện để nhập các vòng lặp vô hạn phụ thuộc vào dữ liệu thực tế được đưa vào công cụ khi chạy. Báo cáo Thống đốc giúp quyết định xem một báo cáo nhất định có đi vào một vòng lặp vô hạn và họ có thể ngăn chặn nó. Điều này ngăn chặn việc cạn kiệt tài nguyên cho máy chạy báo cáo.

JasperReports có hai trình quản lý báo cáo đơn giản sẽ dừng thực thi báo cáo dựa trên số trang tối đa được chỉ định hoặc khoảng thời gian chờ được chỉ định. Họ là -

  • net.sf.jasperreports.governors.MaxPagesGovernor- Đây là một tập lệnh toàn cục đang tìm kiếm hai thuộc tính cấu hình để quyết định xem nó có áp dụng hay không cho báo cáo hiện đang được chạy. Các thuộc tính cấu hình là -

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

    • net.sf.jasperreports.governor.max.pages=[integer]

  • net.sf.jasperreports.governors.TimeoutGovernor- Đây cũng là một tập lệnh toàn cục đang tìm kiếm hai thuộc tính cấu hình sau để quyết định xem nó có áp dụng hay không.

    Các thuộc tính cấu hình là -

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

    • net.sf.jasperreports.governor.timeout=[milliseconds]

Các thuộc tính cho cả hai thống đốc có thể được đặt trên toàn cầu, trong tệp jasperreports.properties hoặc ở cấp báo cáo, làm thuộc tính báo cáo tùy chỉnh. Điều này hữu ích vì các báo cáo khác nhau có thể có kích thước ước tính khác nhau hoặc giới hạn thời gian chờ và cũng vì bạn có thể muốn bật chế độ thống kê cho tất cả các báo cáo, trong khi tắt nó cho một số báo cáo hoặc ngược lại.

Thí dụ

Hãy viết một lớp scriptlet (MyScriptlet). Nội dung của tệp C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ MyScriptlet.java như sau:

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

}

Chi tiết về lớp scriptlet trên như sau:

  • Trong phương thức afterReportInit , chúng tôi đặt giá trị cho biến"someVar" this.setVariableValue ("someVar", new String ("Giá trị biến này đã được sửa đổi bởi scriptlet.")).

  • Ở cuối lớp, một phương thức bổ sung được gọi là 'hello'đã được xác định. Đây là một ví dụ về một phương thức có thể được thêm vào Scriptlet thực sự trả về một giá trị, thay vì đặt một Biến.

Tiếp theo, chúng tôi sẽ thêm tham chiếu lớp scriptlet trong mẫu báo cáo hiện có của chúng tôi ( Thiết kế báo cáo chương ). 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"
   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>

Dưới đây là chi tiết của mẫu báo cáo sửa đổi:

  • Chúng tôi đã tham chiếu đến lớp MyScriptlet trong thuộc tính scriptletClass của phần tử <jasperReport>.

  • Scriptlets chỉ có thể truy cập, nhưng không thể sửa đổi các trường và thông số báo cáo. Tuy nhiên, script có thể sửa đổi các giá trị biến báo cáo. Điều này có thể được thực hiện bằng cách gọi phương thức setVariableValue (). Phương thức này được định nghĩa trong lớp JRAbstractScriptlet, luôn là lớp cha của bất kỳ scriptlet nào. Ở đây, chúng tôi đã xác định một biến someVar , biến này sẽ được MyScriptlet sửa đổi để có giá trị Giá trị này đã được sửa đổi bởi scriptlet .

  • Mẫu báo cáo ở trên có lệnh gọi phương thức trong dải Tóm tắt minh họa cách viết các phương thức mới (trong script) và sử dụng chúng trong mẫu báo cáo. ($P{REPORT_SCRIPTLET}.hello())

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ư 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 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

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 bên dưới:

Ở đây chúng ta thấy hai thông báo được hiển thị từ lớp MyScriptlet -

  • Trong phần tiêu đề - Giá trị biến này đã được sửa đổi bởi scriptlet
  • Ở dưới cùng - Xin chào! Tôi là đối tượng scriptlet của báo cáo.

Báo cáo phụ là một trong những tính năng tuyệt vời của JasperReports. Tính năng này cho phép kết hợp một báo cáo trong một báo cáo khác, tức là một báo cáo có thể là một báo cáo con của một báo cáo khác. Báo cáo phụ giúp chúng tôi giữ cho các thiết kế báo cáo đơn giản, vì chúng tôi có thể tạo nhiều báo cáo đơn giản và đóng gói chúng thành một báo cáo tổng thể. Các báo cáo phụ được tổng hợp và điền giống như các báo cáo thông thường. Bất kỳ mẫu báo cáo nào cũng có thể được sử dụng làm báo cáo phụ khi được kết hợp vào một mẫu báo cáo khác mà không có bất kỳ điều gì thay đổi bên trong (của mẫu báo cáo).

Các báo cáo phụ giống như các mẫu báo cáo bình thường. Thực tế chúng là các đối tượng net.sf.jasperreports.engine.JasperReport , được lấy sau khi biên dịch đối tượng net.sf.jasperreports.engine.design.JasperDesign .

Phần tử <subreport>

Phần tử <subreport> được sử dụng khi đưa các báo cáo phụ vào báo cáo chính. Đây là danh sách các phần tử con trong phần tử JRXML <subreport>.

  • <reportElement>

  • <parametersMapExpression> - Điều này được sử dụng để chuyển một bản đồ chứa các tham số báo cáo tới báo cáo con. Bản đồ thường được lấy từ một tham số trong báo cáo chính hoặc bằng cách sử dụng tham số REPORTS_PARAMETERS_MAP tích hợp sẵn để chuyển các tham số của báo cáo mẹ đến báo cáo con. Biểu thức này phải luôn trả về một đối tượng java.util.Map trong đó các khóa là tên tham số.

  • <subreportParameter> - Phần tử này được sử dụng để chuyển các tham số cho báo cáo con. Nó có một tên thuộc tính , tên này là bắt buộc.

  • <connectionExpression> - Điều này được sử dụng để chuyển java.sql.Connection đến báo cáo con. Nó chỉ được sử dụng khi mẫu báo cáo con cần kết nối cơ sở dữ liệu trong giai đoạn điền báo cáo.

  • <dataSourceExpression> - Điều này được sử dụng để chuyển một nguồn dữ liệu đến báo cáo con. Nguồn dữ liệu này thường được lấy từ một tham số trong báo cáo chính hoặc bằng cách sử dụng tham số REPORT_DATA_SOURCE tích hợp sẵn để chuyển nguồn dữ liệu của báo cáo mẹ đến báo cáo con.

  • Các phần tử ( connectionExpression và dataSourceExpression ) không thể hiện diện cùng một lúc trong khai báo phần tử <subreport>. Điều này là do chúng tôi không thể cung cấp cả nguồn dữ liệu và kết nối đến báo cáo phụ. Chúng ta phải quyết định một trong số chúng và bám sát nó.

  • <returnValue> - Điều này được sử dụng để gán giá trị của một trong các biến của báo cáo phụ cho một trong các biến của báo cáo chính. Phần tử phụ này có các thuộc tính như sau:

    • subreportVariable - Thuộc tính này chỉ định tên của biến báo cáo con có giá trị được trả về.

    • toVariable - Thuộc tính này chỉ định tên của biến báo cáo mẹ có giá trị được sao chép / tăng lên với giá trị từ báo cáo con.

    • tính toán - Thuộc tính này có thể nhận các giá trị: Không có gì, Đếm, Số lượng riêng biệt, Tổng, Trung bình, Thấp nhất, Cao nhất, Độ lệch chuẩn, Phương sai. Giá trị mặc định để tính toán thuộc tính là "Không có gì".

    • incrementerFactoryClass - Thuộc tính này chỉ định lớp nhà máy để tạo phiên bản incrementer.

  • <subreportExpression> - Điều này cho biết nơi tìm mẫu báo cáo đã biên dịch cho báo cáo con. Phần tử này có mộtclassthuộc tính. Các lớp thuộc tính có thể thực hiện bất kỳ những giá trị này: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. Giá trị mặc định là java.lang.String .

  • isUsingCache - Đây là một thuộc tính của phần tử <subreport>. Đây là Boolean, khi được đặt thành true , công cụ báo cáo sẽ cố gắng nhận ra các đối tượng mẫu báo cáo con đã tải trước đó, sử dụng nguồn được chỉ định của chúng. Chức năng bộ nhớ đệm này chỉ khả dụng cho các phần tử báo cáo phụ có biểu thức trả về đối tượng java.lang.String làm nguồn mẫu báo cáo phụ, đại diện cho tên tệp, URL hoặc tài nguyên classpath.

Thí dụ

Hãy lấy một ví dụ đơn giản để chứng minh việc tạo các báo cáo con bằng JRDataSource. Đầu tiên chúng ta hãy viết hai mẫu báo cáo mới, một là báo cáo phụ và báo cáo chính còn lại. Nội dung của mẫu báo cáo phụ (address_report_template.jrxml) như được cung cấp bên dưới. Lưu nó vào thư mục 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>

Khi chúng tôi sử dụng một nguồn dữ liệu, chúng tôi cần ghi một tệp POJO tương ứng SubReportBean.java như hình bên dưới. Lưu nó vào thư mục 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;
   }
}

Ở đây, chúng tôi đã khai báo hai trường 'thành phố''đường phố' và các phương thức getter và setter tương ứng được xác định.

Bây giờ, hãy cập nhật DataBeantập tin. Chúng tôi sẽ thêm một trường subReportBeanList mới , đó là java.util.List. Trường này sẽ chứa danh sách các đối tượng SubReportBean. Nội dung của tệp DataBean như bên dưới. Lưu nó vào thư mục 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;
   }
}

Bây giờ hãy cập nhật tệp C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \DataBeanList.java. Nội dung của tệp này là:

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

Trong phương thức production () trong tệp trên, chúng ta đang thiết lập danh sách SubReportBean.

Bây giờ, hãy viết một mẫu báo cáo chính mới (jasper_report_template.jrxml). Lưu tệp này vào thư mụcC:\tools\jasperreports-5.0.1\test. Nội dung của tệp này như dưới đây:

<?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>

Trong mẫu trên, chúng tôi đã xác định một tham số mới "SUBREPORT_DIR", xác định đường dẫn của báo cáo phụ. Chúng tôi đã xác định một trường subReportBeanList kiểu java.util.List, tương ứng với thuộc tính trong tệp DataBean. Phần tử <subreport> có phần tử con <dataSourceExpression>. Chúng tôi đã đặt danh sách subReportBeanList trong một phiên bản của JRBeanCollectionDataSource. Trong phần tử con <subreportExpression />, chúng tôi đã đặt tên báo cáo con (AddressReport.jasper).

Bây giờ, hãy viết một lớp mới CreateReportđể biên dịch và thực thi mẫu báo cáo của chúng tôi. Nội dung của tệpC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java như 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.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!!! ...");
   }
}

Ở đây, chúng tôi thấy rằng chúng tôi đang biên dịch cả mẫu báo cáo chính và phụ và chuyển tệp báo cáo chính (.jasper) để điền báo cáo.

Tạo báo cáo

Bây giờ, tất cả các tệp của chúng tôi đã sẵn sàng, hãy biên dịch và thực thi chúng 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.CreateReport (viewFullReport là mục tiêu mặc định) như sau:

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

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 bên dưới:

Tại đây, chúng ta có thể thấy rằng các thuộc tính Tên, Quốc gia và Địa chỉ được hiển thị.

Trước đó, mọi người phải dựa vào các tập lệnh để thu thập dữ liệu biểu đồ và hiển thị biểu đồ bằng cách sử dụng phần tử hình ảnh trong mẫu báo cáo. JasperReports hiện làm cho nó trở nên đơn giản vì nó có hỗ trợ tích hợp cho các biểu đồ bằng cách sử dụng thành phần biểu đồ mới.

Sử dụng một thành phần biểu đồ mới, người dùng chỉ cần áp dụng các cài đặt trực quan và xác định các biểu thức sẽ giúp xây dựng tập dữ liệu biểu đồ. JasperReports sử dụng JFreeChart làm thư viện biểu đồ cơ bản. Khi định cấu hình một thành phần biểu đồ mới, có ba thành phần sau:

  • Thành phần biểu đồ tổng thể.

  • Tập dữ liệu biểu đồ (nhóm các cài đặt liên quan đến dữ liệu biểu đồ).

  • Sơ đồ biểu đồ (nhóm các cài đặt trực quan liên quan đến cách các mục biểu đồ được hiển thị).

JasperReports hiện hỗ trợ các loại biểu đồ sau: Pie, Pie 3D, Bar, Bar 3D, XY Bar, Stacked Bar, Stacked Bar 3D, Line, XY Line, Area, XY Area, Stacked Area, Scatter, Bubble, Time Series, High -Đóng-Mở-Đóng, Chân nến, Nhiều trục, Đồng hồ đo, Nhiệt kế và Gantt.

Thuộc tính biểu đồ

Biểu đồ là các phần tử báo cáo bình thường, vì vậy chúng chia sẻ một số thuộc tính của mình với tất cả các phần tử báo cáo khác. Có một phần tử JRXML được gọi là <chart>, được sử dụng để tạo tất cả các loại biểu đồ. Phần tử này nhóm các cài đặt đặc biệt dành riêng cho biểu đồ áp dụng cho tất cả các loại biểu đồ.

Phần tử phụ của biểu đồ

Các phần tử con của phần tử <chart> là -

  • <reportElement> - Đây là các đối tượng có thể hiển thị như văn bản tĩnh, trường văn bản, hình ảnh, đường kẻ và hình chữ nhật mà bạn đặt trong phần mẫu báo cáo của mình.

  • <Box> - Phần tử này được sử dụng để bao quanh biểu đồ bởi một đường viền có thể tùy chỉnh ở mỗi bên.

  • <chartTitle>- Phần tử này được sử dụng để đặt tiêu đề của biểu đồ. Các vị trí thuộc tính quyết định vị trí tiêu đề của biểu đồ trong báo cáo. Phần tử này có các thuộc tính -Position(Giá trị có thể là Trên cùng , Dưới cùng , Trái , Phải . Giá trị Deafult là Trên cùng ),color. <chartTitle> có phông chữtitleExpression dưới dạng các thành phần phụ.

  • <chartSubtitle>- Phần tử này được sử dụng để đặt phụ đề của biểu đồ. Phần tử này có thuộc tính -color. <chartSubtitle> có phông chữsubtitleExpression dưới dạng các thành phần phụ.

  • <chartLegend>- Phần tử có thể kiểm soát các thuộc tính liên quan đến phông chữ cũng như màu văn bản và màu nền của chú giải biểu đồ bằng phần tử này. Phần tử này có các thuộc tính -textColorbackgroundColor.

  • <anchorNameExpression> - Phần tử này tạo mục tiêu cho mỏ neo.

  • <hyperlinkReferenceExpression> - Phần tử này chứa một biểu thức báo cáo cho biết tên của tài nguyên bên ngoài (thường là một URL).

  • <hyperlinkAnchorExpression> - Siêu liên kết trỏ đến một mỏ neo trong một tài nguyên bên ngoài.

  • <hyperlinkPageExpression> - Siêu liên kết trỏ đến một trang trong báo cáo hiện tại.

  • <hyperlinkTooltipExpression>- Phần tử này điều khiển ToolTip của siêu kết nối. Kiểu của biểu thức phải là java.lang.String .

  • <hyperlinkParameter> - Phần tử này khi xuất hiện sẽ tạo ra một siêu liên kết cuối cùng tùy thuộc vào các giá trị tham số.

Thuộc tính biểu đồ

Các thuộc tính trong phần tử <chart> có sẵn cho tất cả các loại biểu đồ là:

  • isShowLegend- Thuộc tính này được sử dụng để xác định xem chú giải biểu đồ có được hiển thị trên báo cáo hay không. Giá trị có thể đúng hoặc sai . Giá trị mặc định là true .

  • evaluationTime- Xác định khi nào biểu thức của biểu đồ sẽ được đánh giá. Các giá trị có thể là Hiện hành , Báo cáo , Trang , Cột , Nhóm , Băng tần . Giá trị mặc định là Bây giờ .

  • evaluationGroup- Thuộc tính này xác định tên của nhóm được sử dụng để đánh giá các biểu thức của biểu đồ. Giá trị cho thuộc tính này phải khớp với tên của nhóm, chúng tôi muốn sử dụng làm nhóm đánh giá của biểu đồ.

  • hyperlinkType- Thuộc tính này có thể chứa bất kỳ giá trị văn bản nào. Giá trị mặc định là Không có . Điều này có nghĩa là, cả trường văn bản và hình ảnh đều không đại diện cho siêu kết nối, ngay cả khi có các biểu thức siêu kết nối đặc biệt.

  • hyperlinkTarget- Thuộc tính này giúp tùy chỉnh hành vi của liên kết được chỉ định khi nó được nhấp vào trong trình xem. Giá trị có thể là Tự , hoặc Trống . Giá trị mặc định là Bản thân .

  • bookmarkLevel- Thuộc tính này khi được đặt thành số nguyên dương, sẽ tạo dấu trang trong các báo cáo được xuất sang PDF. Giá trị mặc định là 0 .

  • customizerClass- Đây là tên của một lớp (tùy chọn) có thể được sử dụng để tùy chỉnh biểu đồ. Giá trị cho phần tử này phải là một Chuỗi chứa tên của một lớp tùy biến.

Tùy chỉnh biểu đồ

Như đã đề cập ở trên, JasperReports sử dụng JFreeChart làm thư viện biểu đồ cơ bản. JFreeChart chứa các tính năng không được hỗ trợ trực tiếp bởi JasperReports. Chúng ta có thể tận dụng các tính năng này bằng cách cung cấp một lớp tùy biến thông qua thuộc tính customizerClass trong phần tử <chart>. Một lớp tùy biến không là gì, mà là sự triển khai của giao diện net.sf.jasperreports.engine.JRChartCustomizer . Cách dễ nhất để triển khai giao diện này là mở rộng lớp net.sf.jasperreports.engine.JRAbstractChartCustomizer và do đó có quyền truy cập vào các tham số, trường và biến để tùy chỉnh biểu đồ linh hoạt hơn dựa trên dữ liệu báo cáo.

Tập dữ liệu biểu đồ

Một trong những thuộc tính phổ biến trên tất cả các loại biểu đồ là <dataset> phần tử. Bộ dữ liệu biểu đồ giúp lập bản đồ dữ liệu báo cáo và truy xuất dữ liệu biểu đồ trong thời gian chạy. Mỗi loại biểu đồ chứa các yếu tố phụ khác nhau để xác định các biểu thức của biểu đồ. Các biểu thức này xác định dữ liệu được sử dụng để tạo biểu đồ. Tất cả các phần tử con này đều chứa phần tử <dataset> xác định khi nào các biểu thức của biểu đồ được đánh giá và đặt lại.

Một số loại tập dữ liệu biểu đồ có sẵn trong JasperReports vì mỗi loại biểu đồ hoạt động với một số tập dữ liệu nhất định: Hình tròn, Danh mục, XY, Chuỗi thời gian, Khoảng thời gian, XYZ và Cao-Thấp. Mỗi loại tập dữ liệu này thực hiện giao diện net.sf.jasperreports.engine.JRChartDataset xác định tập dữ liệu biểu đồ. Tất cả các bộ dữ liệu biểu đồ đều khởi tạo và tăng theo cùng một cách; tuy nhiên, chúng chỉ khác nhau về loại dữ liệu hoặc chuỗi dữ liệu mà chúng ánh xạ.

Thuộc tính tập dữ liệu

Bảng dưới đây tóm tắt các thuộc tính của phần tử <dataset> -

Thuộc tính Sự miêu tả Giá trị
resetType Thuộc tính này xác định thời điểm đặt lại giá trị của biểu thức biểu đồ. Không có, Báo cáo, Trang, Cột, Nhóm. Giá trị mặc định làReport.
resetGroup Thuộc tính này xác định tên của nhóm mà tại đó giá trị biểu đồ được đặt lại. Giá trị cho thuộc tính này phải khớp với tên của bất kỳ nhóm nào được khai báo trong mẫu báo cáo JRXML.
incrementType Thuộc tính này xác định thời điểm tính toán lại giá trị của biểu thức biểu đồ. Không có, Báo cáo, Trang, Cột, Nhóm. Giá trị mặc định là"None".
incrementGroup Thuộc tính này xác định tên của nhóm mà tại đó biểu thức biểu đồ được tính toán lại. Giá trị cho thuộc tính này phải khớp với tên của nhóm được khai báo trong mẫu báo cáo JRXML.

Bảng sau đây tóm tắt các phần tử con của phần tử <dataset> -

Yếu tố phụ Sự miêu tả
<incrementWhenExpression> Có thể tùy chỉnh cách tăng tập dữ liệu biểu đồ bằng cách lọc ra dữ liệu không mong muốn thông qua việc sử dụng phần tử phụ này.
<datasetRun> Điều này chứa thông tin cần thiết để khởi tạo một tập hợp con báo cáo.

Các loại tập dữ liệu

Các loại tập dữ liệu cụ thể được giải thích bên dưới:

Tập dữ liệu Pie

Một tập dữ liệu hình tròn được đặc trưng bởi các biểu thức sau:

  • <keyExpression> - đại diện cho các danh mục sẽ tạo nên các lát trong biểu đồ hình tròn. Biểu thức này có thể trả về bất kỳ đối tượng java.lang.Comp so sánh nào.

  • <valueExpression> - tạo ra các giá trị tương ứng với từng danh mục / khóa trong tập dữ liệu. Giá trị luôn là đối tượng java.lang.Number.

  • <labelExpression> - nếu thiếu biểu thức này, biểu đồ sẽ hiển thị các nhãn mặc định cho mỗi lát trong biểu đồ hình tròn. Sử dụng biểu thức này, trả về các giá trị java.lang.String, để tùy chỉnh các nhãn mục cho biểu đồ hình tròn.

  • <sectionHyperlink> - đặt các siêu liên kết được liên kết với các phần hình tròn.

Tập dữ liệu danh mục

Tập dữ liệu danh mục được đặc trưng bởi phần tử <categorySeries>, chứa -

  • <seriesExpression> - cho biết tên của chuỗi. Biểu thức này có thể trả về bất kỳ đối tượng java.lang.Comp so sánh nào.

  • <categoryExpression> - trả về tên của danh mục cho mỗi giá trị bên trong chuỗi được chỉ định bởi biểu thức chuỗi. Các danh mục là các đối tượng java.lang.

  • <valueExpression> - tạo ra các giá trị tương ứng với từng danh mục trong tập dữ liệu. Giá trị luôn là đối tượng java.lang.Number.

  • <labelExpression> - nếu thiếu biểu thức này, biểu đồ sẽ hiển thị các nhãn mặc định cho từng mục trong biểu đồ. Sử dụng biểu thức này, trả về các giá trị java.lang.String, để tùy chỉnh các nhãn mục cho biểu đồ.

  • <itemHyperlink> - đặt các siêu liên kết được liên kết với các mục biểu đồ.

Tập dữ liệu XY

Tập dữ liệu XY được đặc trưng bởi phần tử <xySeries>, chứa -

  • <seriesExpression> - cho biết tên của chuỗi. Biểu thức này có thể trả về bất kỳ đối tượng java.lang.Comp so sánh nào.

  • <xValueExpression> - trả về giá trị java.lang.Number đại diện cho giá trị X từ cặp (x, y) sẽ được thêm vào chuỗi dữ liệu hiện tại.

  • <yValueExpression> - trả về giá trị java.lang.Number đại diện cho giá trị Y từ cặp (x, y) sẽ được thêm vào chuỗi dữ liệu hiện tại.

  • <labelExpression> - nếu thiếu biểu thức này, biểu đồ sẽ hiển thị các nhãn mặc định cho từng mục trong biểu đồ. Sử dụng biểu thức này, trả về các giá trị java.lang.String, để tùy chỉnh các nhãn mục cho biểu đồ.

  • <itemHyperlink> - đặt các siêu liên kết được liên kết với các mục biểu đồ.

Tập dữ liệu XYZ

Tập dữ liệu XYZ được đặc trưng bởi phần tử <xyzSeries>, chứa -

  • <seriesExpression> - cho biết tên của chuỗi. Biểu thức này có thể trả về bất kỳ đối tượng java.lang.Comp so sánh nào.

  • <xValueExpression> - trả về giá trị java.lang.Number đại diện cho giá trị X từ mục (x, y, z) sẽ được thêm vào chuỗi dữ liệu hiện tại.

  • <yValueExpression> - trả về giá trị java.lang.Number đại diện cho giá trị Y từ mục (x, y, z) sẽ được thêm vào chuỗi dữ liệu hiện tại.

  • <zValueExpression> - trả về giá trị java.lang.Number đại diện cho giá trị Z từ mục (x, y, z) sẽ được thêm vào chuỗi dữ liệu hiện tại.

  • <labelExpression> - nếu thiếu biểu thức này, biểu đồ sẽ hiển thị các nhãn mặc định cho từng mục trong biểu đồ. Sử dụng biểu thức này, trả về các giá trị java.lang.String, để tùy chỉnh các nhãn mục cho biểu đồ.

  • <itemHyperlink> - đặt các siêu liên kết được liên kết với các mục biểu đồ.

Bộ dữ liệu chuỗi thời gian

Tập dữ liệu chuỗi thời gian được đặc trưng bởi thuộc tính timePeriod và phần tử <timeSeries>. Thuộc tính timePeriod chỉ định loại chuỗi dữ liệu bên trong tập dữ liệu. Chuỗi thời gian có thể chứa các giá trị số được liên kết với ngày, tháng, năm hoặc các khoảng thời gian được xác định trước khác. Các giá trị có thể là: Năm, Quý, Tháng, Tuần, Ngày - đây là giá trị mặc định, Giờ, Phút, Giây, Mili giây.

Phần tử <timeSeries> chứa -

  • <seriesExpression> - cho biết tên của chuỗi. Biểu thức này có thể trả về bất kỳ đối tượng java.lang.Comp so sánh nào.

  • <timePeriodExpression> - trả về giá trị java.util.Date mà từ đó công cụ sẽ trích xuất khoảng thời gian tương ứng tùy thuộc vào giá trị được đặt cho thuộc tính timePeriod được đề cập ở trên.

  • <valueExpression> - trả về giá trị java.lang.Number để liên kết với giá trị khoảng thời gian tương ứng khi tăng chuỗi hiện tại của tập dữ liệu.

  • <labelExpression> - nếu thiếu biểu thức này, biểu đồ sẽ hiển thị các nhãn mặc định cho từng mục trong biểu đồ. Sử dụng biểu thức này, trả về các giá trị java.lang.String, để tùy chỉnh các nhãn mục cho biểu đồ.

  • <itemHyperlink> - đặt các siêu liên kết được liên kết với các mục biểu đồ.

Tập dữ liệu khoảng thời gian

Tập dữ liệu khoảng thời gian được đặc trưng bởi phần tử <timePeriodSeries>, chứa -

  • <seriesExpression> - cho biết tên của chuỗi. Biểu thức này có thể trả về bất kỳ đối tượng java.lang.Comp so sánh nào.

  • <startDateExpression> - chỉ định thời điểm bắt đầu của khoảng ngày mà giá trị số sẽ được liên kết khi nó được thêm vào chuỗi khoảng thời gian.

  • <endDateExpression> - chỉ định kết thúc của khoảng ngày mà giá trị số sẽ được liên kết khi nó được thêm vào chuỗi khoảng thời gian.

  • <valueExpression> - trả về giá trị java.lang.Number để liên kết với khoảng ngày hiện tại được chỉ định bởi biểu thức ngày bắt đầu và ngày kết thúc.

  • <labelExpression> - nếu thiếu biểu thức này, biểu đồ sẽ hiển thị các nhãn mặc định cho từng mục trong biểu đồ. Sử dụng biểu thức này, trả về các giá trị java.lang.String, để tùy chỉnh các nhãn mục cho biểu đồ.

  • <itemHyperlink> - đặt các siêu liên kết được liên kết với các mục biểu đồ.

Tập dữ liệu cao thấp

Tập dữ liệu cao thấp được đặc trưng bởi các biểu thức sau:

  • <seriesExpression> - hiện tại, chỉ có một chuỗi được hỗ trợ bên trong biểu đồ Cao-Thấp hoặc Hình nến. Tuy nhiên, chuỗi đơn này phải được xác định bằng giá trị java.lang.Có thể so sánh được trả về bởi biểu thức này và nó cũng phải được sử dụng làm tên chuỗi trong chú giải của biểu đồ.

  • <dateExpression> - trả về ngày mà mục hiện tại (cao, thấp, mở, đóng, âm lượng) đề cập đến.

  • <highExpression> - trả về giá trị java.lang.Number, giá trị này sẽ là một phần của mục dữ liệu được thêm vào chuỗi khi tập dữ liệu được tăng dần.

  • <lowExpression> - trả về giá trị java.lang.Number, giá trị này sẽ là một phần của mục dữ liệu được thêm vào chuỗi khi tập dữ liệu được tăng dần.

  • <openExpression> - trả về giá trị java.lang.Number, giá trị này sẽ là một phần của mục dữ liệu được thêm vào chuỗi khi tập dữ liệu được tăng dần.

  • <closeExpression> - trả về giá trị java.lang.Number, giá trị này sẽ là một phần của mục dữ liệu được thêm vào chuỗi khi tập dữ liệu được tăng dần.

  • <volumeExpression> - một biểu thức số trả về giá trị khối lượng để sử dụng cho mục dữ liệu hiện tại. Nó chỉ được sử dụng cho biểu đồ Hình nến.

  • <itemHyperlink> - đặt các siêu liên kết được liên kết với các mục biểu đồ.

Tập dữ liệu giá trị

Đây là một triển khai tập dữ liệu biểu đồ đặc biệt chứa một giá trị duy nhất và được sử dụng để hiển thị biểu đồ Đồng hồ đo và Nhiệt kế. Giá trị được thu thập bằng cách sử dụng biểu thức <valueExpression>.

Biểu đồ lô

Một phần tử JRXML phổ biến khác thông qua tất cả các loại biểu đồ là <plot> phần tử. Điều này cho phép chúng tôi xác định một số đặc điểm của biểu đồ như hướng và màu nền. Các lô khác nhau, dựa trên loại biểu đồ.

Thuộc tính lô

Bảng dưới đây tóm tắt các thuộc tính của phần tử <plot> -

Thuộc tính Sự miêu tả Giá trị
màu nền Thuộc tính này xác định màu nền của biểu đồ. Bất kỳ giá trị thập lục phân nào có sáu chữ số đều là giá trị hợp lệ cho thuộc tính này. Giá trị thập lục phân phải được đặt trước dấu #.
sự định hướng Thuộc tính này xác định hướng của biểu đồ. Ngang, dọc Giá trị mặc định là "Dọc"
backgroundAlpha Thuộc tính này xác định độ trong suốt của màu nền của biểu đồ. Các giá trị hợp lệ cho thuộc tính này bao gồm bất kỳ số thập phân nào từ 0 đến 1, bao gồm cả. Con số càng cao, nền sẽ càng ít trong suốt. Giá trị mặc định là "1."
foregroundAlpha Thuộc tính này xác định độ trong suốt của màu nền trước của biểu đồ. Các giá trị hợp lệ cho thuộc tính này bao gồm bất kỳ số thập phân nào từ 0 đến 1, bao gồm cả. Con số càng cao, nền sẽ càng ít trong suốt. Giá trị mặc định là "1."
labelRotation Thuộc tính này cho phép xoay nhãn văn bản trên trục x xoay theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Thuộc tính này chỉ áp dụng cho các biểu đồ mà trục x không phải là số hoặc không hiển thị ngày tháng. Giá trị mặc định là "0.0."

Phần tử <plot> có một phụ tố con <seriesColor> có các thuộc tính là: seriesOrdercolor . Phần tử này tùy chỉnh màu sắc cho chuỗi và vị trí của chúng trong chuỗi màu.

Cài đặt cụ thể cho các lô biểu đồ

  • piePlot - Nó không có cài đặt cụ thể

  • pie3DPlot- Chứa thuộc tính depthFactor , một giá trị số nằm trong khoảng từ 0 đến 1 thể hiện độ sâu của hình bánh dưới dạng phần trăm chiều cao của diện tích ô.

  • barPlot - Người ta có thể hiển thị hoặc ẩn các nhãn đánh dấu, dấu đánh dấu hoặc nhãn mục và cung cấp cài đặt cho cả hai trục.

  • bar3DPlot - Cung cấp các cài đặt tương tự như barPlot và tạo hiệu ứng 3D bằng cách sử dụng các thuộc tính xOffset và yOffset.

  • linePlot - Người ta có thể hiển thị hoặc ẩn các đường nối các điểm mục, có thể hiển thị hoặc ẩn các hình dạng liên kết với các điểm mục và cung cấp cài đặt cho cả hai trục.

  • scatterPlot - Tương tự như linePlot, nó có thể hiển thị hoặc ẩn các đường nối các điểm mục, có thể hiển thị hoặc ẩn các hình được liên kết với các điểm mục và cung cấp cài đặt cho cả hai trục.

  • areaPlot - Cung cấp cài đặt cho cả hai trục.

  • bubblePlot - Người ta có thể đặt kích thước bong bóng bằng cách đặt thuộc tính scaleType và cung cấp cài đặt cho cả hai trục.

  • timeSeriesPlot - Người ta có thể hiển thị hoặc ẩn các đường nối các điểm mục, có thể hiển thị hoặc ẩn các hình dạng liên kết với các điểm mục và cung cấp cài đặt cho cả hai trục.

  • highLowPlot - Người ta có thể hiển thị hoặc ẩn tích đang mở, có thể hiển thị hoặc ẩn đánh dấu đóng và cung cấp cài đặt cho cả hai trục.

  • candlestickPlot - Người ta có thể hiển thị hoặc ẩn âm lượng và cung cấp cài đặt cho cả hai trục.

  • meterPlot - Chứa các cài đặt cụ thể cho hình dạng mặt số, góc chia tỷ lệ, đơn vị đo, khoảng đánh dấu, màu quay số, màu kim, màu đánh dấu, phông chữ hiển thị giá trị, màu sắc và mẫu định dạng, dải dữ liệu và khoảng đồng hồ.

  • thermometerPlot - Chứa các cài đặt cụ thể cho vị trí giá trị, màu thủy ngân, hiển thị / ẩn các đường giá trị, phông chữ hiển thị giá trị, màu và mẫu định dạng, dải dữ liệu, dải thấp, dải trung bình và dải cao.

  • multiAxisChart - Chứa các cài đặt cụ thể cho trục có trong cốt truyện.

Các loại biểu đồ

JasperReports cung cấp hỗ trợ tích hợp cho một số loại biểu đồ. Chúng được liệt kê như dưới đây -

  • pieChart - Sự kết hợp của tập dữ liệu Pie và biểu đồ Pie.

  • pie3DChart - Nhóm một tập dữ liệu Pie và một biểu đồ 3D Pie.

  • barChart - Sự kết hợp cơ bản giữa tập dữ liệu Danh mục và biểu đồ Thanh.

  • bar3DChart - Bao bọc một tập dữ liệu Category và một cốt truyện Bar 3D.

  • xyBarChart - Hỗ trợ bộ dữ liệu Khoảng thời gian, bộ dữ liệu Chuỗi thời gian và bộ dữ liệu XY, và sử dụng biểu đồ Thanh để hiển thị trục và các mục.

  • stackedBarChart - Sử dụng dữ liệu từ tập dữ liệu Danh mục và hiển thị nội dung của nó bằng cách sử dụng Biểu đồ thanh.

  • stackedBar3DChart - Sử dụng dữ liệu từ tập dữ liệu Category và hiển thị nội dung của nó bằng cách sử dụng biểu đồ Bar 3D.

  • lineChart - Nhóm một tập dữ liệu Danh mục và một biểu đồ Đường.

  • xyLineChart - Nhóm một tập dữ liệu XY và một biểu đồ Đường.

  • areaChart - Các mục từ tập dữ liệu Danh mục được hiển thị bằng cách sử dụng biểu đồ Khu vực.

  • stackedAreaChart - Các mục từ tập dữ liệu Danh mục được hiển thị bằng cách sử dụng biểu đồ Khu vực.

  • xyAreaChart - Sử dụng dữ liệu từ tập dữ liệu XY và hiển thị nó thông qua biểu đồ Diện tích.

  • scatterChart - Bao bọc một tập dữ liệu XY với một biểu đồ Phân tán.

  • bubbleChart - Kết hợp tập dữ liệu XYZ với biểu đồ Bong bóng.

  • timeSeriesChart - Nhóm một tập dữ liệu Chuỗi thời gian và một âm mưu Chuỗi thời gian.

  • highLowChart - Sự kết hợp của tập dữ liệu Cao-Thấp và âm mưu Cao-Thấp.

  • candlestickChart - Sử dụng dữ liệu từ tập dữ liệu Cao-Thấp nhưng với biểu đồ Hình nến đặc biệt.

  • meterChart - Hiển thị một giá trị duy nhất từ ​​tập dữ liệu Giá trị trên mặt số, sử dụng các tùy chọn hiển thị từ biểu đồ Mét.

  • thermometerChart - Hiển thị một giá trị trong tập dữ liệu Giá trị bằng cách sử dụng các tùy chọn kết xuất từ ​​biểu đồ Nhiệt kế.

  • multiAxisChart - Chứa nhiều trục phạm vi, tất cả đều chia sẻ một trục miền chung.

Thí dụ

Để minh họa các biểu đồ, hãy viết một mẫu báo cáo mới (jasper_report_template.jrxml). Ở đây, chúng tôi sẽ thêm dấu <barChart> phần tử <pageHeader> và <pieChart> đến phần <summary>. Chúng tôi sẽ hiển thị trong biểu đồ các điểm đạt được cho mỗi môn học. Lưu nó vào thư mụcC:\tools\jasperreports-5.0.1\test. Nội dung của tệp như dưới đây:

<?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>

Các chi tiết của tệp trên được cung cấp dưới đây:

  • Phần tử JRXML được sử dụng để tạo biểu đồ thanh là </barChart> trong <pageHeader>. Nó chứa phần tử con </chart>, phần tử này chứa phần tử con <reportElement> xác định kích thước và vị trí của biểu đồ.

  • Phần tử <dataset> trong biểu đồ thanh phải được đặt giữa các phần tử <categoryDataset> và </categoryDataset> JRXML.

  • <categoryDataset> phải chứa phần tử <categorySeries>. Phần tử này xác định phần tử dữ liệu mà các thanh sẽ đại diện (tên chủ đề, trong ví dụ này).

  • <categoryDataset> cũng phải chứa một phần tử, phần tử này xác định cách dữ liệu sẽ được tách thành các danh mục để so sánh. Ở đây, dữ liệu được phân tách bằng tên chủ đề.

  • Phần tử <valueExpression> xác định rằng biểu thức nào được sử dụng để xác định giá trị của mỗi thanh trong biểu đồ. Ở đây, chúng tôi đang sử dụng "dấu".

  • Đối với biểu đồ hình tròn, chúng tôi đã sử dụng phần tử <pieChart> trong phần <summary>. Nó chứa một phần tử phụ </chart>.

  • Phần tử phụ chứa biểu thức báo cáo cho biết những gì được sử dụng làm khóa trong biểu đồ. Ở đây, chúng tôi đã sử dụng subjectName.

  • Phần tử con chứa một biểu thức dùng để tính giá trị cho khóa. Ở đây, chúng tôi đã sử dụng dấu.

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

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

Vì chúng tôi sẽ hiển thị điểm đạt được cho mỗi môn học, POJO cần được thay đổi. Tập tinC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java nội dung như dưới đây -

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

}

Ngay cả nội dung của tệp C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java cần được cập nhật 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("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;
   }
}

Tạo báo cáo

Tiếp theo, hãy biên dịch và thực thi các 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) như sau:

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

Kết quả của việc biên dịch ở trên, một cửa sổ JasperViewer mở ra như trong màn hình bên dưới:

Ở đây, chúng ta thấy rằng biểu đồ thanh được tạo trong tiêu đề trang và biểu đồ hình tròn được tạo trong các phần tóm tắt.

Báo cáo bảng chéo (lập bảng chéo) là báo cáo chứa các bảng sắp xếp dữ liệu trên các hàng và cột theo dạng bảng. Đối tượng chéo bảng được sử dụng để chèn báo cáo bảng chéo trong báo cáo chính. Crosstabs có thể được sử dụng với bất kỳ mức dữ liệu nào (danh nghĩa, thứ tự, khoảng thời gian hoặc tỷ lệ) và thường hiển thị dữ liệu tóm tắt, có trong các biến báo cáo, ở dạng bảng động. Các biến được sử dụng để hiển thị dữ liệu tổng hợp như tổng, số lượng, giá trị trung bình.

Thuộc tính Crosstab

Phần tử JRXML <crosstab> được sử dụng để chèn bảng chữ cái vào báo cáo.

Thuộc tính

Sau đây là danh sách các thuộc tính của một <crosstab> phần tử -

  • isRepeatColumnHeaders- Cho biết liệu tiêu đề cột có nên được in lại sau khi ngắt trang hay không. Giá trị mặc định là true .

  • isRepeatRowHeaders- Cho biết liệu tiêu đề hàng có nên được in lại sau khi ngắt cột bảng chéo hay không. Giá trị mặc định là true .

  • columnBreakOffset- Khi xảy ra ngắt cột, cho biết lượng không gian dọc, được tính bằng pixel, trước phần bảng chéo tiếp theo được đặt bên dưới phần trước trên cùng một trang. Giá trị mặc định là 10.

  • runDirection- Cho biết liệu dữ liệu chéo bảng nên được điền từ trái sang phải (LTR) hay từ phải sang trái (RTL). Giá trị mặc định là LTR.

  • ignoreWidth- Cho biết liệu bảng chéo có kéo dài vượt quá giới hạn chiều rộng bảng chéo ban đầu hay không và không tạo ngắt cột. Nếu không, nó sẽ dừng hiển thị các cột trong giới hạn chiều rộng bảng chéo và chỉ tiếp tục với các cột còn lại sau khi tất cả các hàng đã bắt đầu hiển thị. Giá trị mặc định là sai .

Yếu tố phụ

Phần tử <crosstab> có các phần tử con sau:

  • <reportElement>- Phần tử này xác định vị trí, chiều rộng và chiều cao của bảng chữ cái trong phạm vi bao quanh của nó. Các thuộc tính cho phần tử này bao gồm tất cả các thuộc tính <reportElement> chuẩn.

  • <crosstabParameter>- Phần tử này được sử dụng để truy cập các biến và tham số báo cáo từ bên trong bảng chéo. Các thuộc tính cho phần tử này bao gồm:

    • name - Điều này xác định tên tham số.

    • class - Điều này chỉ ra lớp tham số.

  • <parametersMapExpression>- Phần tử này được sử dụng để chuyển một biến báo cáo hoặc tham số có chứa một phiên bản của java.util.Map , như một tập hợp các tham số cho bảng chéo. Phần tử này không chứa thuộc tính.

  • <crosstabDataset>- Phần tử này xác định tập dữ liệu sẽ sử dụng để điền bảng biểu (xem phần tiếp theo để biết giải thích chi tiết). Các thuộc tính cho phần tử này bao gồm:

    • isDataPreSorted - Điều này cho biết liệu dữ liệu trong tập dữ liệu có được sắp xếp trước hay không. Giá trị mặc định là sai .

  • <crosstabHeaderCell>- Phần tử này xác định nội dung của vùng được tìm thấy ở góc trên bên trái của bảng chéo nơi giao nhau giữa tiêu đề cột và tiêu đề hàng. Kích thước của ô này được tính toán tự động dựa trên chiều rộng và chiều cao của hàng và cột đã xác định.

  • <rowGroup>- Phần tử này định nghĩa một nhóm dùng để chia dữ liệu thành các hàng. Các thuộc tính cho phần tử này bao gồm:

    • name - Điều này xác định tên của nhóm hàng.

    • width - Điều này xác định chiều rộng của nhóm hàng.

    • headerPosition - Vị trí này xác định vị trí của nội dung tiêu đề (Trên cùng, Giữa, Dưới cùng, Kéo dài).

    • TotalPosition - Vị trí này xác định vị trí của toàn bộ cột (Bắt đầu, Kết thúc, Không có).

    Phần tử này chứa các phần tử phụ sau:

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup>- Phần tử này định nghĩa một nhóm dùng để chia dữ liệu thành các cột. Các thuộc tính cho phần tử này bao gồm:

    • name - Điều này xác định tên nhóm cột.

    • height - Điều này xác định chiều cao của tiêu đề nhóm cột.

    • headerPosition - Vị trí này xác định vị trí của nội dung tiêu đề ( Phải, Trái, Giữa , Kéo dài ).

    • TotalPosition - Vị trí này xác định vị trí của toàn bộ cột ( Bắt đầu, Kết thúc, Không có ).

    Phần tử này chứa các phần tử phụ sau:

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure>- Phần tử này xác định phép tính được thực hiện trên các hàng và cột. Các thuộc tính cho phần tử này bao gồm:

    • name - Điều này xác định tên biện pháp.

    • lớp - Điều này cho biết lớp đo lường.

    • tính toán - Điều này cho biết phép tính được thực hiện giữa các giá trị ô bảng chéo. Các giá trị của nó có thể là bất kỳ giá trị nào trong số này - Không có gì, Đếm, Số lượng riêng biệt, Tổng, Trung bình, Thấp nhất, Cao nhất, Độ lệch chuẩn, Phương saiĐầu tiên . Giá trị mặc định làNothing.

  • <crosstabCell>- Phần tử này xác định cách sắp xếp dữ liệu trong các ô không có tiêu đề. Các thuộc tính cho phần tử này bao gồm:

    • columnTotalGroup - Điều này cho biết nhóm sẽ sử dụng để tính tổng cột.

    • height - Điều này xác định chiều cao của ô.

    • rowTotalGroup - Điều này cho biết nhóm sẽ sử dụng để tính tổng hàng.

    • width - Điều này xác định chiều rộng của ô.

  • <whenNoDataCell>- Phần tử này xác định những gì sẽ hiển thị trên một ô bảng chéo trống. Phần tử này không chứa thuộc tính.

Nhóm dữ liệu trong Crosstab

Công cụ tính toán bảng chéo tổng hợp dữ liệu bằng cách lặp qua các bản ghi tập dữ liệu được liên kết. Để tổng hợp dữ liệu, trước tiên người ta cần nhóm chúng lại. Trong bảng chữ cái, các hàng và cột dựa trên các mục nhóm cụ thể, được gọi làbuckets. Định nghĩa nhóm phải chứa -

  • bucketExpression - Biểu thức được đánh giá để có được các mục của nhóm dữ liệu.

  • comparatorExpression - Cần thiết trong trường hợp thứ tự tự nhiên của các giá trị không phải là lựa chọn tốt nhất.

  • orderByExpression - Cho biết giá trị được sử dụng để sắp xếp dữ liệu.

Nhóm hàng và cột (được định nghĩa ở trên) trong bảng chéo dựa vào buckets.

Tổng số biến trên bảng chéo tích hợp

Dưới đây là danh sách giá trị hiện tại của thước đo và tổng các mức khác nhau tương ứng với ô có thể được truy cập thông qua các biến được đặt tên theo sơ đồ sau:

  • Giá trị hiện tại của phép tính số đo được lưu trữ trong một biến có cùng tên với số đo.

  • <Measure> _ <Column Group> _ALL - Điều này mang lại tổng số cho tất cả các mục nhập trong nhóm cột từ cùng một hàng.

  • <Measure> _ <Row Group> _ALL - Điều này mang lại tổng số cho tất cả các mục nhập trong nhóm hàng từ cùng một cột.

  • <Số đo> _ <Nhóm hàng> _ <Nhóm cột> _ALL - Điều này mang lại tổng kết hợp tương ứng với tất cả các mục nhập trong cả nhóm hàng và cột.

Thí dụ

Để chứng minh các dấu gạch chéo, hãy viết một mẫu báo cáo mới (jasper_report_template.jrxml). Ở đây, chúng tôi sẽ thêm bảng chữ cái vào phần tóm tắt. Lưu nó vào thư mụcC:\tools\jasperreports-5.0.1\test. Nội dung của tệp như dưới đây:

<?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>

Nội dung chi tiết của tập tin trên như sau:

  • Bảng chéo được định nghĩa bởi phần tử <crosstab>.

  • Phần tử <rowGroup> xác định một nhóm để chia dữ liệu thành các hàng. Tại đây, mỗi hàng sẽ hiển thị dữ liệu cho một tên khác nhau.

  • Các phần tử <bucket> và <bucketExpression> xác định biểu thức báo cáo nào sẽ sử dụng làm dấu phân cách nhóm cho <rowGroup>. Ở đây, chúng tôi đã sử dụng trường tên làm dấu phân cách, để tách các hàng theo tên.

  • Phần tử <crosstabRowHeader> xác định biểu thức sẽ được sử dụng làm tiêu đề hàng. Nó chứa một phần tử con duy nhất, cụ thể là <cellContents>, hoạt động giống như một dải bên trong bên trong bảng chữ cái. Thay vì xác định tên biến cho trường văn bản bên trong <crosstabRowHeader>, chúng tôi đã gán tên cho <rowGroup> (thông qua thuộc tính name của nó), do đó nó tạo ra một biến ngầm định. Phần tử <crosstabRowHeader> xác định nội dung của ô tiêu đề cho toàn bộ hàng. Nó nhận một phần tử <cellContents> làm phần tử con duy nhất của nó.

  • Phần tử <columnGroup> cũng như các phần tử con của nó tương tự như phần tử <rowGroup>, ngoại trừ việc nó ảnh hưởng đến các cột thay vì hàng.

  • The <measure> element defines the calculation to be performed across rows and columns. The calculation attribute is set to Count.

  • The <crosstabCell> element defines how data in non-header cells will be laid out. This element also contains a single <crosstabCell> element as its only sub-element.

The java codes for report filling remains unchanged. The contents of the file C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java are as given below −

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

The contents of the POJO file C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java are as follows −

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

The contents of the file C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java are as follows −

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

Report Generation

Next, let's compile and execute the above files using our regular ANT build process. The contents of the file build.xml (saved under directory C:\tools\jasperreports-5.0.1\test) are as given below.

The import file - baseBuild.xml is picked up from the chapter Environment Setup and should be placed in the same directory as the 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>

Next, let's open command line window and go to the directory where build.xml is placed. Finally, execute the command ant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport is the default target) as follows −

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

As a result of above compilation, a JasperViewer window opens up as shown in the screen given below −

Here, we see that each country and name are tabulated.

Sometimes, we need reports in different languages. Writing the same report for each different language implies a lot of redundant work. Only pieces of text differing from language to language should be written separately, and loaded into text elements at runtime, depending on locale settings. This is the purpose of the report internationalization. Internationalized reports, once written can run everywhere.

Trong các bước sau, chúng tôi đã liệt kê cách tạo báo cáo bằng các ngôn ngữ khác nhau và một số tính năng khác của quốc tế hóa báo cáo -

  • Liên kết gói tài nguyên java.util.ResourceBundle với mẫu báo cáo. Có hai cách để liên kết đối tượng java.util.ResourceBundle với mẫu báo cáo.

    • Tại thời điểm thiết kế, bằng cách đặt thuộc tính resourceBundle của đối tượng mẫu báo cáo thành tên cơ sở của gói tài nguyên đích.

    • Có thể tạo liên kết động / thời gian chạy bằng cách cung cấp đối tượng java.util.ResourceBundle làm giá trị cho thông số REPORT_RESOURCE_BUNDLE tại thời điểm điền báo cáo.

    • Nếu báo cáo cần được tạo ở ngôn ngữ khác với ngôn ngữ hiện tại, tham số REPORT_LOCALE tích hợp có thể được sử dụng để chỉ định ngôn ngữ thời gian chạy khi điền báo cáo.

  • Để hỗ trợ quốc tế hóa báo cáo, một cú pháp đặc biệt $R{}có sẵn bên trong các biểu thức báo cáo để tham chiếu tài nguyên java.lang.String được đặt bên trong đối tượng java.util.ResourceBundle được liên kết với báo cáo. Các$R{} cú pháp ký tự trích xuất tài nguyên theo ngôn ngữ cụ thể từ gói tài nguyên dựa trên khóa phải được đặt giữa dấu ngoặc -

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

Trường văn bản ở trên hiển thị tiêu đề của báo cáo bằng cách trích xuất giá trị Chuỗi từ gói tài nguyên được liên kết với mẫu báo cáo dựa trên ngôn ngữ thời gian được áp dụng và khóa report.title .

  • Định dạng thông báo bằng các ngôn ngữ khác nhau dựa trên ngôn ngữ báo cáo, có một phương pháp tích hợp bên trong báo cáo net.sf.jasperreports.engine.fill.JRCalculator . Phương thức này cung cấp chức năng tương tự như lớp java.text.MessageFormat . Phương thức này, msg (), có ba chữ ký thuận tiện cho phép bạn sử dụng tối đa ba tham số thông báo trong thông báo.

  • Một built-in str () phương pháp (tương đương với $ R {} cú pháp bên trong biểu báo cáo), mà cho phép truy cập đến nội dung bó tài nguyên dựa trên ngôn ngữ báo cáo.

  • Đối với định dạng ngày và giờ, thông số REPORT_TIME_ZONE tích hợp có thể được sử dụng để đảm bảo biến đổi thời gian thích hợp.

  • Trong đầu ra được tạo, thư viện lưu giữ thông tin về hướng chạy văn bản để các tài liệu được tạo bằng ngôn ngữ có cách viết từ phải sang trái (như tiếng Ả Rập và tiếng Do Thái) có thể được hiển thị đúng cách.

  • Nếu một ứng dụng dựa vào trình xem Swing tích hợp để hiển thị các báo cáo đã tạo, thì ứng dụng đó cần được quốc tế hóa bằng cách điều chỉnh nút ToolTips hoặc các văn bản khác được hiển thị. Điều này rất dễ thực hiện vì người xem dựa vào gói tài nguyên được xác định trước để trích xuất thông tin theo ngôn ngữ cụ thể. Tên cơ sở cho gói tài nguyên này là net.sf.jasperreports.view.viewer.

Thí dụ

Để thể hiện tính quốc tế hóa, hãy viết mẫu báo cáo mới (jasper_report_template.jrxml). Nội dung của JRXML như dưới đây. Lưu nó vào thư mục 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>

Trong tệp ở trên, thuộc tính resourceBundle của phần tử <jasperReport> cho JasperReports biết nơi lấy các chuỗi được bản địa hóa để sử dụng cho báo cáo. Chúng ta cần tạo một tệp thuộc tính có tên gốc phù hợp với giá trị của thuộc tính. Tệp này phải tồn tại ở bất kỳ đâu trong CLASSPATH khi điền vào báo cáo. Trong ví dụ này, tệp thuộc tínhlocalizationdemo.properties được lưu trong thư mục C:\tools\jasperreports-5.0.1\test. Nội dung của tệp này như sau:

localization.text1 = This is English text.

Để sử dụng một ngôn ngữ khác, tên của tệp phải là localizationdemo [locale] .properties. Ở đây, chúng tôi sẽ viết một tệp cho ngôn ngữ Tây Ban Nha. Lưu tệp này dưới dạng -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Nội dung của tệp này như sau:

localization.text1 = Este texto es en Español.

Cú pháp để lấy giá trị cho các thuộc tính resourceBundle là $ R {key}.

Để cho JasperReports biết ngôn ngữ chúng ta muốn sử dụng, chúng ta cần gán một giá trị cho một tham số tích hợp sẵn. Tên của tham số này được định nghĩa là một hằng số được gọi là REPORT_LOCALE và hằng số này được định nghĩa trong lớp net.sf.jasperreports.engine.JRParameter . Giá trị của hằng số phải là một phiên bản của java.util.Locale . Logic này được kết hợp trong mã java để điền và tạo báo cáo. Hãy lưu tệp nàyJasperReportFillI18.javavào thư mục C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Nội dung của tệp như sau:

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

   }
}

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.JasperReportFillI18 (viewFullReport là mục tiêu mặc định) như sau:

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

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 bên dưới: