Trường báo cáo

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 một 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 vì 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à 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 nó, 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ư được đưa ra dưới đây -

package com.tutorialspoint;

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

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

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

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

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

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

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

Nội dung của tệp POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java như được đưa ra 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ư được đưa ra 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 dưới đây:

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