Báo cáo Phần

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 kẻ, 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 sẽ đượ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ì 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ì 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 bố trí dữ liệu 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ẽ giãn ra để 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ử có phải được in trong toàn bộ dải hay không, 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 xem 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 liệu 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 thử 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 vào 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.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ị trong 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.