Учебники

JasperReports — Заполнение отчетов

Основная цель любого инструмента отчетности — выпуск документов высокого качества. Процесс заполнения отчетов помогает инструменту отчетности достичь этого путем манипулирования наборами данных.

Основные входные данные, необходимые для процесса заполнения отчета:

  • Шаблон отчета — это фактический файл JasperReport.

  • Параметры отчета — это в основном именованные значения, которые передаются в механизм заполнения отчета. Мы обсудим их в главе « Параметры отчета» .

  • Источник данных — мы можем заполнить файл Jasper из ряда источников данных, таких как запрос SQL, файл XML, файл csv, запрос HQL (Hibernate Query Language), коллекция Java Beans и т. Д. Это будет подробно обсуждаться в главе « Источники данных отчета» .

Шаблон отчета — это фактический файл JasperReport.

Параметры отчета — это в основном именованные значения, которые передаются в механизм заполнения отчета. Мы обсудим их в главе « Параметры отчета» .

Источник данных — мы можем заполнить файл Jasper из ряда источников данных, таких как запрос SQL, файл XML, файл csv, запрос HQL (Hibernate Query Language), коллекция Java Beans и т. Д. Это будет подробно обсуждаться в главе « Источники данных отчета» .

Выходные данные, генерируемые этим процессом, представляют собой документ .jrprint, который готов для просмотра, печати или экспорта в другие форматы. Класс фасада net.sf.jasperreports.engine.JasperFillManager обычно используется для заполнения шаблона отчета данными. Этот класс имеет различные методы fillReportXXX (), которые заполняют шаблоны отчетов (шаблоны могут находиться на диске, выбираться из входных потоков или предоставляться непосредственно в оперативной памяти).

В этом классе фасада есть две категории методов fillReportXXX ():

  • Первый тип, получить объект java.sql.Connection в качестве третьего параметра. В большинстве случаев отчеты заполняются данными из реляционной базы данных. Это достигается путем —

    • Подключитесь к базе данных через JDBC.

    • Включите SQL-запрос в шаблон отчета.

    • Движок JasperReports использует переданное соединение и выполняет запрос SQL.

    • Таким образом, создается источник данных отчета для заполнения отчета.

  • Второй тип, получает объект net.sf.jasperreports.engine.JRDataSource, когда данные, которые необходимо заполнить, доступны в других формах.

Первый тип, получить объект java.sql.Connection в качестве третьего параметра. В большинстве случаев отчеты заполняются данными из реляционной базы данных. Это достигается путем —

Подключитесь к базе данных через JDBC.

Включите SQL-запрос в шаблон отчета.

Движок JasperReports использует переданное соединение и выполняет запрос SQL.

Таким образом, создается источник данных отчета для заполнения отчета.

Второй тип, получает объект net.sf.jasperreports.engine.JRDataSource, когда данные, которые необходимо заполнить, доступны в других формах.

Заполнение шаблонов отчетов

Давайте напишем шаблон отчета. Содержимое файла JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) приведено ниже:

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

Далее, давайте передадим коллекцию объектов данных Java (Java-бинов) в JasperReport Engine, чтобы заполнить этот скомпилированный отчет.

Напишите POJO DataBean.java, который представляет объект данных (Java bean). Этот класс определяет два объекта String, т. Е. «Имя» и «страна». Сохраните его в каталоге C: \ 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;
   }
}

Напишите класс DataBeanList.java, который имеет бизнес-логику для генерации коллекции объектов Java-бина. Затем он передается в движок JasperReports для генерации отчета. Здесь мы добавляем 4 объекта DataBean в список. Сохраните его в каталоге C: \ 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;
   }
}

Напишите файл основного класса JasperReportFill.java , который получает коллекцию Java-бинов из класса (DataBeanList) и передает ее в механизм JasperReports, чтобы заполнить шаблон отчета. Сохраните его в каталоге C: \ 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();
      }
   }
}

Генерация отчетов

Теперь мы скомпилируем и выполним эти файлы, используя наш обычный процесс сборки ANT. Файл build.xml как показано ниже —

Файл импорта — baseBuild.xml выбирается из главы « Настройка среды» и должен быть расположен в том же каталоге, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, где находится build.xml. Наконец, выполните команду ant -Dmain-class = com.tutorialspoint.JasperReportFill ( executereport является целью по умолчанию) следующим образом:

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

В результате выполнения вышеупомянутого файла jasper_report_template.jrprint создается в том же каталоге, что и файл .jasper (в этом случае он создается в C: \ tools \ jasperreports-5.0.1 \ test).