JasperReports - wypełnianie raportów

Głównym celem każdego narzędzia raportowania jest tworzenie wysokiej jakości dokumentów. Proces wypełniania raportów pomaga narzędziu raportującemu to osiągnąć poprzez manipulowanie zbiorami danych.

Główne dane wejściowe wymagane do procesu wypełniania raportów to -

  • Report Template - To jest rzeczywisty plik JasperReport.

  • Report Parameters- Są to w zasadzie nazwane wartości, które są przekazywane w czasie wypełniania raportu do silnika. Omówimy je w rozdziale Parametry raportu .

  • Data Source- Możemy wypełnić plik Jasper z szeregu źródeł danych, takich jak zapytanie SQL, plik XML, plik csv, zapytanie HQL (Hibernate Query Language), zbiór Java Beans itp. Zostanie to szczegółowo omówione w raporcie Rozdział Źródła danych .

Dane wyjściowe generowane przez ten proces to plik .jrprint dokument gotowy do przeglądania, drukowania lub eksportowania do innych formatów. Klasa fasady net.sf.jasperreports.engine.JasperFillManager jest zwykle używana do wypełniania danych szablonu raportu. Ta klasa ma różne metody fillReportXXX () , które wypełniają szablony raportów (szablony mogą znajdować się na dysku, pobierane ze strumieni wejściowych lub są dostarczane bezpośrednio w pamięci).

W tej klasie fasady istnieją dwie kategorie metod fillReportXXX () -

  • Pierwszy typ otrzymuje obiekt java.sql.Connection jako trzeci parametr. W większości przypadków raporty są wypełnione danymi z relacyjnej bazy danych. Osiąga się to poprzez -

    • Połącz się z bazą danych przez JDBC.

    • Umieść zapytanie SQL w szablonie raportu.

    • Silnik JasperReports korzysta z przekazanego połączenia i wykonuje zapytanie SQL.

    • W ten sposób tworzone jest źródło danych raportu do wypełnienia raportu.

  • Drugi typ to obiekt net.sf.jasperreports.engine.JRDataSource, gdy dane do wypełnienia są dostępne w innych formach.

Szablony raportów wypełnienia

Napiszmy szablon raportu. Zawartość pliku JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) jest jak poniżej -

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

Następnie przekażmy zbiór obiektów danych Java (ziaren Java) do JasperReport Engine, aby wypełnić ten skompilowany raport.

Napisz POJO DataBean.java, który reprezentuje obiekt danych (komponent bean Java). Ta klasa definiuje dwa obiekty typu String, tj. „Name” i „country”. Zapisz go w kataloguC:\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;
   }
}

Napisz klasę DataBeanList.java, która ma logikę biznesową do generowania kolekcji obiektów java bean. Jest to dalej przekazywane do silnika JasperReports w celu wygenerowania raportu. Tutaj dodajemy 4 obiekty DataBean do listy. Zapisz go w kataloguC:\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;
   }
}

Napisz główny plik klasy JasperReportFill.java, który pobiera kolekcję java bean z klasy (DataBeanList) i przekazuje ją do silnika JasperReports w celu wypełnienia szablonu raportu. Zapisz go w kataloguC:\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();
      }
   }
}

Generowanie raportów

Teraz będziemy kompilować i uruchamiać te pliki przy użyciu naszego zwykłego procesu kompilacji ANT. Plik build.xml jest taki, jak podano poniżej -

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu co 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>

Następnie otwórzmy okno wiersza poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Na koniec wykonaj polecenie ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport jest domyślnym celem) w następujący sposób -

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

W wyniku powyższego wykonania, w tym samym katalogu co plik .jasper generowany jest plik jasper_report_template.jrprint (w tym przypadku jest on generowany w C: \ tools \ jasperreports-5.0.1 \ test).