JasperReports - Kreuztabellen

Kreuztabellenberichte (Kreuztabellenberichte) sind Berichte, die Tabellen enthalten, die Daten in Tabellenform über Zeilen und Spalten hinweg anordnen. Das Kreuztabellenobjekt wird zum Einfügen eines Kreuztabellenberichts in den Hauptbericht verwendet. Kreuztabellen können mit jeder Datenebene (nominal, ordinal, Intervall oder Verhältnis) verwendet werden und zeigen normalerweise die in den Berichtsvariablen enthaltenen zusammengefassten Daten in Form einer dynamischen Tabelle an. Variablen werden verwendet, um aggregierte Daten wie Summen, Zählungen und Durchschnittswerte anzuzeigen.

Kreuztabelleneigenschaften

JRXML-Element <crosstab> wird verwendet, um eine Kreuztabelle in einen Bericht einzufügen.

Attribut

Es folgt eine Liste der Attribute eines <crosstab> Element -

  • isRepeatColumnHeaders- Gibt an, ob die Spaltenüberschriften nach einem Seitenumbruch erneut gedruckt werden sollen. Der Standardwert ist true .

  • isRepeatRowHeaders- Gibt an, ob die Zeilenüberschriften nach einem Kreuztabellen-Spaltenumbruch erneut gedruckt werden sollen. Der Standardwert ist true .

  • columnBreakOffset- Wenn ein Spaltenumbruch auftritt, wird der in Pixel gemessene vertikale Abstand vor dem nachfolgenden Kreuztabellenstück angegeben, das unter dem vorherigen auf derselben Seite platziert werden soll. Der Standardwert ist 10.

  • runDirection- Gibt an, ob die Kreuztabellendaten von links nach rechts (LTR) oder von rechts nach links (RTL) gefüllt werden sollen. Der Standardwert ist LTR.

  • ignoreWidth- Gibt an, ob die Kreuztabelle die anfängliche Breite der Kreuztabellenbreite überschreitet und keine Spaltenumbrüche generiert. Andernfalls wird das Rendern von Spalten innerhalb der Grenzwerte für die Kreuztabellenbreite beendet und die verbleibenden Spalten werden erst fortgesetzt, nachdem alle Zeilen mit dem Rendern begonnen haben. Der Standardwert ist false .

Unterelemente

Ein <crosstab> -Element hat folgende Unterelemente:

  • <reportElement>- Dieses Element definiert die Position, Breite und Höhe der Kreuztabelle innerhalb ihrer Umschließung. Zu den Attributen für dieses Element gehören alle Standardattribute <reportElement>.

  • <crosstabParameter>- Mit diesem Element können Sie über die Kreuztabelle auf Berichtsvariablen und -parameter zugreifen. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Parameternamen.

    • Klasse - Dies gibt die Parameterklasse an.

  • <parametersMapExpression>- Dieses Element wird verwendet, um eine Berichtsvariable oder einen Parameter mit einer Instanz von java.util.Map als Parametersatz für die Kreuztabelle zu übergeben. Dieses Element enthält keine Attribute.

  • <crosstabDataset>- Dieses Element definiert das Dataset, das zum Auffüllen der Kreuztabelle verwendet werden soll (eine ausführliche Erläuterung finden Sie im nächsten Abschnitt). Zu den Attributen für dieses Element gehören -

    • isDataPreSorted - Gibt an, ob die Daten im Dataset vorsortiert sind. Der Standardwert ist false .

  • <crosstabHeaderCell>- Dieses Element definiert den Inhalt des Bereichs in der oberen linken Ecke der Kreuztabelle, in dem sich Spalten- und Zeilenüberschriften treffen. Die Größe dieser Zelle wird automatisch anhand der definierten Zeilen- und Spaltenbreiten und -höhen berechnet.

  • <rowGroup>- Dieses Element definiert eine Gruppe, mit der die Daten in Zeilen aufgeteilt werden. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Namen der Zeilengruppe.

    • width - Definiert die Breite der Zeilengruppe.

    • headerPosition - Definiert die Position des Header-Inhalts (oben, Mitte, unten, Stretch).

    • totalPosition - Definiert die Position der gesamten Spalte (Start, Ende, Keine).

    Dieses Element enthält die folgenden Unterelemente:

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup>- Dieses Element definiert eine Gruppe, mit der die Daten in Spalten aufgeteilt werden. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Namen der Spaltengruppe.

    • height - Dies definiert die Höhe des Spaltengruppen-Headers.

    • headerPosition - Definiert die Position des Header-Inhalts ( rechts, links, Mitte, Dehnung ).

    • totalPosition - Definiert die Position der gesamten Spalte ( Start, Ende, Keine ).

    Dieses Element enthält die folgenden Unterelemente:

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure>- Dieses Element definiert die Berechnung, die zeilen- und spaltenübergreifend durchgeführt werden soll. Zu den Attributen für dieses Element gehören -

    • name - Definiert den Namen der Kennzahl.

    • Klasse - Dies gibt die Kennzahlklasse an.

    • Berechnung - Dies gibt die Berechnung an, die zwischen Kreuztabellenzellenwerten durchgeführt werden soll. Die Werte können beliebig sein: Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Varianz und First . Standardwert istNothing.

  • <crosstabCell>- Dieses Element definiert, wie Daten in Nicht-Header-Zellen angeordnet werden. Zu den Attributen für dieses Element gehören -

    • columnTotalGroup - Gibt die Gruppe an, die zur Berechnung der Spaltensumme verwendet werden soll.

    • Höhe - Dies definiert die Höhe der Zelle.

    • rowTotalGroup - Dies gibt die Gruppe an, die zur Berechnung der Zeilensumme verwendet werden soll.

    • width - Dies definiert die Breite der Zelle.

  • <whenNoDataCell>- Dieses Element definiert, was in einer leeren Kreuztabellenzelle angezeigt werden soll. Dieses Element enthält keine Attribute.

Datengruppierung in Kreuztabelle

Die Kreuztabellenberechnungs-Engine aggregiert Daten, indem sie die zugehörigen Dataset-Datensätze durchläuft. Um Daten zu aggregieren, müssen sie zuerst gruppiert werden. In einer Kreuztabelle basieren Zeilen und Spalten auf bestimmten Gruppenelementen, die aufgerufen werdenbuckets. Eine Bucket-Definition sollte enthalten -

  • BucketExpression - Der Ausdruck, der ausgewertet werden soll, um Datengruppenelemente abzurufen .

  • compareatorExpression - Wird benötigt, wenn die natürliche Reihenfolge der Werte nicht die beste Wahl ist.

  • orderByExpression - Gibt den Wert an, der zum Sortieren von Daten verwendet wird.

Zeilen- und Spaltengruppen (oben definiert) in einer Kreuztabelle sind abhängig von buckets.

Integrierte Kreuztabellen-Gesamtvariablen

Nachfolgend finden Sie eine Liste des aktuellen Messwerts und der Summen verschiedener Ebenen, die der Zelle entsprechen. Über Variablen, die gemäß dem folgenden Schema benannt wurden, kann auf sie zugegriffen werden:

  • Der aktuelle Wert einer Kennzahlberechnung wird in einer Variablen mit demselben Namen wie die Kennzahl gespeichert.

  • <Maßnahme> _ <Spaltengruppe> _ALL - Dies ergibt die Summe aller Einträge in der Spaltengruppe aus derselben Zeile.

  • <Maßnahme> _ <Zeilengruppe> _ALL - Dies ergibt die Summe aller Einträge in der Zeilengruppe aus derselben Spalte.

  • <Maßnahme> _ <Zeilengruppe> _ <Spaltengruppe> _ALL - Dies ergibt die Gesamtsumme, die allen Einträgen in Zeilen- und Spaltengruppen entspricht.

Beispiel

Um die Kreuztabellen zu demonstrieren, schreiben wir eine neue Berichtsvorlage (jasper_report_template.jrxml). Hier fügen wir die Kreuztabelle zum Zusammenfassungsabschnitt hinzu. Speichern Sie es im VerzeichnisC:\tools\jasperreports-5.0.1\test. Der Inhalt der Datei ist 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">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <field name = "name" class = "java.lang.String"/>
   <field name = "country" class = "java.lang.String"/>
   
   <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>
   
   <summary>
      <band height = "60">
      
      <crosstab>
         <reportElement width = "782" y = "0" x = "0" height = "60"/>
          
         <rowGroup name = "nameGroup" width = "100">
         
            <bucket>
               <bucketExpression class = "java.lang.String">
                  <![CDATA[$F{name}]]>
               </bucketExpression>
            </bucket>
            
            <crosstabRowHeader>
            
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  
                  <textField>
                     <reportElement width = "100" y = "0" x = "0" height = "20"/>
                     <textElement textAlignment = "Right" 
                        verticalAlignment = "Middle"/>
                     
                     <textFieldExpression>
                        <![CDATA[$V{nameGroup}]]>
                     </textFieldExpression>
                  </textField>
            
               </cellContents>
         
            </crosstabRowHeader>

         </rowGroup>
         
         <columnGroup name = "countryGroup" height = "20">
            <bucket>
               
               <bucketExpression class = "java.lang.String">
                  $F{country}
               </bucketExpression>
            </bucket>
            
            <crosstabColumnHeader>
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  <textField isStretchWithOverflow = "true">
                     <reportElement width = "60" y = "0" x = "0" height = "20"/>
                     <textElement verticalAlignment = "Bottom"/>
                     <textFieldExpression>
                        <![CDATA[$V{countryGroup}]]>
                     </textFieldExpression>
                  </textField>
               </cellContents>
            </crosstabColumnHeader>

         </columnGroup>
         
         <measure name = "tailNumCount" class = "java.lang.Integer"  
            calculation = "Count">
            <measureExpression>$F{country}</measureExpression>
         </measure>
         
         <crosstabCell height = "20" width = "60">
            <cellContents backcolor = "#FFFFFF">
               <box borderColor = "black" border = "Thin"/>
               <textField>
                  <reportElement x = "5" y = "0" width = "55" height = "20"/>
                  <textElement textAlignment = "Left" 
                     verticalAlignment = "Bottom"/>
                  <textFieldExpression class = "java.lang.Integer">
                      $V{tailNumCount}
                  </textFieldExpression>
               </textField>
            </cellContents>
         </crosstabCell>
      
      </crosstab>
      
      </band>
   </summary>
	
</jasperReport>

Die Details der obigen Datei sind wie folgt:

  • Kreuztabelle wird durch das Element <kreuztabelle> definiert.

  • Das Element <rowGroup> definiert eine Gruppe, um die Daten in Zeilen aufzuteilen. Hier werden in jeder Zeile Daten für einen anderen Namen angezeigt.

  • Die Elemente <bucket> und <bucketExpression> definieren, welcher Berichtsausdruck als Gruppenbegrenzer für <rowGroup> verwendet werden soll. Hier haben wir das Namensfeld als Trennzeichen verwendet, um die Zeilen nach Namen aufzuteilen.

  • Das Element <crosstabRowHeader> definiert den Ausdruck, der als Zeilenkopf verwendet werden soll. Es enthält ein einzelnes Unterelement, nämlich <cellContents>, das sich wie ein inneres Band innerhalb der Kreuztabelle verhält. Anstatt den Variablennamen für das Textfeld in <crosstabRowHeader> zu definieren, haben wir <rowGroup> den Namen zugewiesen (über sein Namensattribut), sodass eine implizite Variable erstellt wird. Das Element <crosstabRowHeader> definiert den Inhalt der Kopfzelle für die gesamte Zeile. Es wird ein einzelnes <cellContents> -Element als einziges Unterelement verwendet.

  • Das <columnGroup> -Element sowie seine Unterelemente sind analog zum <rowGroup> -Element, außer dass es Spalten anstelle von Zeilen beeinflusst.

  • Das <measure> -Element definiert die Berechnung, die zeilen- und spaltenübergreifend durchgeführt werden soll. Das Berechnungsattribut wird auf Count gesetzt .

  • Das <crosstabCell> -Element definiert, wie Daten in Nicht-Header-Zellen angeordnet werden. Dieses Element enthält auch ein einzelnes <crosstabCell> -Element als einziges Unterelement.

Die Java-Codes für das Ausfüllen von Berichten bleiben unverändert. Der Inhalt der DateiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sind wie unten angegeben -

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

Der Inhalt der POJO-Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sind wie folgt -

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

Der Inhalt der Datei C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sind wie folgt -

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

Berichterstellung

Als nächstes kompilieren wir die obigen Dateien und führen sie mit unserem regulären ANT-Erstellungsprozess aus. Der Inhalt der Datei build.xml (gespeichert im Verzeichnis C: \ tools \ jasperreports-5.0.1 \ test) ist wie folgt.

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

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

Ö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 ausant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport 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

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

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
   [javac] Compiling 3 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: 20 minutes 53 seconds

Als Ergebnis der obigen Kompilierung wird ein JasperViewer-Fenster geöffnet, wie im folgenden Bildschirm gezeigt -

Hier sehen wir, dass jedes Land und jeder Name tabellarisch aufgeführt sind.