JasperReports - Berichte ausfüllen

Der Hauptzweck eines Berichtstools besteht darin, qualitativ hochwertige Dokumente zu erstellen. Der Berichterfüllungsprozess hilft dem Berichterstellungstool, dies zu erreichen, indem Datensätze bearbeitet werden.

Die wichtigsten Eingaben, die für das Ausfüllen von Berichten erforderlich sind, sind:

  • Report Template - Dies ist die aktuelle JasperReport-Datei.

  • Report Parameters- Dies sind im Grunde benannte Werte, die zum Zeitpunkt der Berichterfüllung an die Engine übergeben werden. Wir werden sie im Kapitel Berichtsparameter diskutieren .

  • Data Source- Wir können eine Jasper-Datei aus einer Reihe von Datenquellen wie einer SQL-Abfrage, einer XML-Datei, einer CSV-Datei, einer HQL-Abfrage (Hibernate Query Language), einer Sammlung von Java Beans usw. füllen. Dies wird im Bericht ausführlich erläutert Kapitel Datenquellen .

Die durch diesen Prozess erzeugte Ausgabe ist a .jrprint Dokument, das zum Anzeigen, Drucken oder Exportieren in andere Formate bereit ist. Die Fassadenklasse net.sf.jasperreports.engine.JasperFillManager wird normalerweise zum Füllen einer Berichtsvorlage mit Daten verwendet. Diese Klasse verfügt über verschiedene fillReportXXX () -Methoden, mit denen Berichtsvorlagen gefüllt werden (Vorlagen können sich auf der Festplatte befinden, aus Eingabestreams ausgewählt oder direkt als In-Memory-Vorlagen bereitgestellt werden).

In dieser Fassadenklasse gibt es zwei Kategorien von fillReportXXX () -Methoden:

  • Der erste Typ empfängt ein java.sql.Connection-Objekt als dritten Parameter. In den meisten Fällen werden Berichte mit Daten aus einer relationalen Datenbank gefüllt. Dies wird erreicht durch -

    • Stellen Sie über JDBC eine Verbindung zur Datenbank her.

    • Fügen Sie eine SQL-Abfrage in die Berichtsvorlage ein.

    • Die JasperReports-Engine verwendet die übergebene Verbindung und führt die SQL-Abfrage aus.

    • Auf diese Weise wird eine Berichtsdatenquelle zum Ausfüllen des Berichts erstellt.

  • Der zweite Typ empfängt ein net.sf.jasperreports.engine.JRDataSource-Objekt, wenn die zu füllenden Daten in anderen Formularen verfügbar sind.

Berichtsvorlagen füllen

Lassen Sie uns eine Berichtsvorlage schreiben. Der Inhalt der JRXML-Datei (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) lautet wie folgt:

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

Als Nächstes übergeben wir eine Sammlung von Java-Datenobjekten (Java-Beans) an die JasperReport Engine, um diesen kompilierten Bericht zu füllen.

Schreiben Sie eine POJO DataBean.java, die das Datenobjekt (Java Bean) darstellt. Diese Klasse definiert zwei String-Objekte, nämlich 'Name' und 'Land'. Speichern Sie es im VerzeichnisC:\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;
   }
}

Schreiben Sie eine Klasse DataBeanList.java, die über eine Geschäftslogik verfügt, um eine Sammlung von Java-Bean-Objekten zu generieren. Dies wird weiter an die JasperReports-Engine übergeben, um den Bericht zu generieren. Hier fügen wir der Liste 4 DataBean-Objekte hinzu. Speichern Sie es im VerzeichnisC:\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;
   }
}

Schreiben Sie eine Hauptklassendatei JasperReportFill.java, die die Java-Bean-Sammlung aus der Klasse (DataBeanList) abruft und an die JasperReports-Engine übergibt, um die Berichtsvorlage zu füllen. Speichern Sie es im VerzeichnisC:\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();
      }
   }
}

Berichte erstellen

Wir werden diese Dateien nun mit unserem regulären ANT-Erstellungsprozess kompilieren und ausführen. Die Datei build.xml lautet wie folgt:

Die Importdatei - baseBuild.xml wird aus dem Kapitel Umgebungs-Setup ausgewählt und sollte im selben Verzeichnis wie die build.xml abgelegt werden.

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

Öffnen Sie als Nächstes das Befehlszeilenfenster und wechseln Sie in das Verzeichnis, in dem build.xml abgelegt ist. Führen Sie abschließend den Befehl aus ant -Dmain-class = com.tutorialspoint.JasperReportFill ((executereport ist das Standardziel) wie folgt -

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

Als Ergebnis der obigen Ausführung wird eine Datei jasper_report_template.jrprint im selben Verzeichnis wie die .jasper- Datei generiert (in diesem Fall wird sie unter C: \ tools \ jasperreports-5.0.1 \ test generiert).