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

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

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

  • Report Template - Это актуальный файл JasperReport.

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

  • Data Source- Мы можем заполнить файл 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, когда данные, которые необходимо заполнить, доступны в других формах.

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

Напишем шаблон отчета. Содержимое файла 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 beans) в 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).