Campi rapporti

I campi del report sono elementi che rappresentano la mappatura dei dati tra l'origine dati e il modello di report. I campi possono essere combinati nelle espressioni del report per ottenere l'output desiderato. Un modello di report può contenere zero o più elementi <field>. Quando si dichiarano i campi del report, l'origine dati deve fornire i dati corrispondenti a tutti i campi definiti nel modello di report.

Dichiarazione sul campo

La dichiarazione sul campo viene eseguita come mostrato di seguito:

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

L'attributo del nome

L' attributo name dell'elemento <field> è obbligatorio. Fa riferimento al campo nelle espressioni del report per nome.

L'attributo di classe

L' attributo class specifica il nome della classe per i valori del campo. Il suo valore predefinito è java.lang.String . Questo può essere modificato in qualsiasi classe disponibile in fase di esecuzione. Indipendentemente dal tipo di campo del report, il motore si occupa di eseguire il casting nelle espressioni del report in cui viene utilizzato il token $ F {}, rendendo quindi superflui i cast manuali.

Descrizione del campo

L'elemento <fieldDesciption> è un elemento facoltativo. Ciò è molto utile quando si implementa un'origine dati personalizzata. Ad esempio, possiamo memorizzare una chiave o alcune informazioni, mediante le quali possiamo recuperare il valore di field dall'origine dati personalizzata in fase di esecuzione. Utilizzando l'elemento <fieldDesciption> invece del nome del campo, è possibile superare facilmente le restrizioni delle convenzioni di denominazione dei campi durante il recupero dei valori dei campi dall'origine dati.

Di seguito è riportato un pezzo di codice dal nostro file JRXML esistente (Chapter Report Designs ). Qui possiamo vedere l'utilizzo diname, class, e fieldDescription elementi.

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

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

Ordina campi

Nei momenti in cui è richiesto l'ordinamento dei dati e l'implementazione dell'origine dati non lo supporta (ad esempio, l'origine dati CSV), JasperReports supporta l'ordinamento dell'origine dati basata sul campo in memoria. L'ordinamento può essere eseguito utilizzando uno o più elementi <sortField> nel modello di report.

Se viene specificato almeno un campo di ordinamento, durante il processo di compilazione del rapporto, l'origine dati viene passata a un'istanza JRSortableDataSource . Questo a sua volta, recupera tutti i record dall'origine dati, esegue l'ordinamento in memoria in base ai campi specificati e sostituisce l'origine dati originale.

Il nome del campo di ordinamento dovrebbe essere identico al nome del campo del rapporto. I campi utilizzati per l'ordinamento dovrebbero avere tipi che implementano java.util.Comparable. L'ordinamento in ordine naturale viene eseguito per tutti i campi ad eccezione di quelli di tipo java.lang.String (per il tipo String, viene utilizzato il collator corrispondente alla locale di riempimento del report). Quando vengono specificati più campi di ordinamento, l'ordinamento verrà eseguito utilizzando i campi come chiavi di ordinamento nell'ordine in cui appaiono nel modello di rapporto. L'esempio seguente mostra la funzione di ordinamento.

Esempio di rapporto ordinato

Aggiungiamo il <sortField> Per il nostro modello di report esistente (capitolo Rapporto disegni ). Ordiniamo il paese del campo in ordine decrescente. Il modello di rapporto rivisto (jasper_report_template.jrxml) è il seguente. Salvalo nella directory 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>

I codici Java per la compilazione del report rimangono invariati. Il contenuto del fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sono come indicato di seguito -

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

Il contenuto del file POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sono come indicato di seguito -

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

Il contenuto del file C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sono come indicato di seguito -

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

Generazione di report

Compileremo ed eseguiremo il file sopra utilizzando il nostro normale processo di compilazione ANT. I contenuti del file build.xml (salvato nella directory C: \ tools \ jasperreports-5.0.1 \ test) sono i seguenti.

Il file di importazione - baseBuild.xml viene prelevato dal capitolo Configurazione dell'ambiente e dovrebbe essere posizionato nella stessa directory di 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>

Quindi, apriamo la finestra della riga di comando e andiamo alla directory in cui si trova build.xml. Infine, esegui il comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport è la destinazione predefinita) come segue:

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

Come risultato della compilazione di cui sopra, si apre una finestra di JasperViewer come mostrato nella schermata sotto riportata -

Qui possiamo vedere che i nomi dei paesi sono disposti in ordine alfabetico decrescente.