JasperReports - Rapporti di riempimento

Lo scopo principale di qualsiasi strumento di reporting è produrre documenti di alta qualità. Il processo di compilazione dei report aiuta lo strumento di reporting a raggiungere questo obiettivo manipolando set di dati.

I principali input richiesti per il processo di compilazione del report sono:

  • Report Template - Questo è il file JasperReport effettivo.

  • Report Parameters- Questi sono fondamentalmente valori denominati che vengono passati al momento del riempimento del report al motore. Li discuteremo nel capitolo Parametri del rapporto .

  • Data Source- Possiamo compilare un file Jasper da una gamma di origini dati come una query SQL, un file XML, un file csv, una query HQL (Hibernate Query Language), una raccolta di Java Beans, ecc. Questo sarà discusso in dettaglio in Report Capitolo Origini dati .

L'output generato da questo processo è un file .jrprint documento pronto per essere visualizzato, stampato o esportato in altri formati. La classe della facciata net.sf.jasperreports.engine.JasperFillManager viene solitamente utilizzata per riempire un modello di report con i dati. Questa classe ha vari metodi fillReportXXX () che riempiono i modelli di report (i modelli possono essere localizzati su disco, prelevati da flussi di input o forniti direttamente come in memoria).

Esistono due categorie di metodi fillReportXXX () in questa classe di facciata:

  • Il primo tipo riceve un oggetto java.sql.Connection come terzo parametro. La maggior parte delle volte, i report sono riempiti con i dati di un database relazionale. Ciò si ottiene:

    • Connettiti al database tramite JDBC.

    • Includere una query SQL all'interno del modello di report.

    • Il motore JasperReports utilizza la connessione passata ed esegue la query SQL.

    • Viene così prodotta una fonte di dati del report per compilare il report.

  • Il secondo tipo riceve un oggetto net.sf.jasperreports.engine.JRDataSource, quando i dati che devono essere riempiti sono disponibili in altre forme.

Modelli di report di riempimento

Scriviamo un modello di rapporto. I contenuti del file JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) sono i seguenti:

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

Successivamente, passiamo una raccolta di oggetti dati Java (Java bean), al motore JasperReport, per compilare questo report compilato.

Scrivi un POJO DataBean.java, che rappresenta l'oggetto dati (Java bean). Questa classe definisce due oggetti String cioè "nome" e "paese". Salvalo nella directoryC:\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;
   }
}

Scrivere una classe DataBeanList.java, che abbia una logica di business per generare una raccolta di oggetti Java bean. Questo viene ulteriormente passato al motore JasperReports, per generare il rapporto. Qui stiamo aggiungendo 4 oggetti DataBean nella lista. Salvalo nella directoryC:\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;
   }
}

Scrivi un file di classe principale JasperReportFill.java, che ottiene la raccolta di Java bean dalla classe (DataBeanList) e la passa al motore JasperReports, per riempire il modello di report. Salvalo nella directoryC:\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();
      }
   }
}

Generazione di rapporti

Ora compileremo ed eseguiremo questi file utilizzando il nostro normale processo di compilazione ANT. Il file build.xml è come mostrato di seguito:

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

Quindi, apriamo la finestra della riga di comando e andiamo alla directory in cui si trova build.xml. Infine, esegui il comando ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport è l'obiettivo predefinito) 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

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

Come risultato dell'esecuzione sopra, viene generato un file jasper_report_template.jrprint nella stessa directory del file .jasper (in questo caso, viene generato in C: \ tools \ jasperreports-5.0.1 \ test).