JasperReports - Relatórios de preenchimento

O principal objetivo de qualquer ferramenta de relatório é produzir documentos de alta qualidade. O processo de preenchimento de relatórios ajuda a ferramenta de relatórios a conseguir isso, manipulando conjuntos de dados.

As principais entradas necessárias para o processo de preenchimento de relatórios são -

  • Report Template - Este é o arquivo JasperReport real.

  • Report Parameters- Esses são basicamente valores nomeados que são passados ​​no tempo de preenchimento do relatório para o mecanismo. Vamos discuti-los no capítulo Parâmetros do relatório .

  • Data Source- Podemos preencher um arquivo Jasper a partir de uma variedade de fontes de dados, como uma consulta SQL, um arquivo XML, um arquivo csv, uma consulta HQL (Hibernate Query Language), uma coleção de Java Beans, etc. Isso será discutido em detalhes no Relatório Capítulo Fontes de dados .

A saída gerada por este processo é um .jrprint documento que está pronto para ser visualizado, impresso ou exportado para outros formatos. A classe de fachada net.sf.jasperreports.engine.JasperFillManager é geralmente usada para preencher um modelo de relatório com dados. Essa classe tem vários métodos fillReportXXX () que preenchem modelos de relatório (os modelos podem estar localizados no disco, selecionados de fluxos de entrada ou fornecidos diretamente como na memória).

Existem duas categorias de métodos fillReportXXX () nesta classe de fachada -

  • O primeiro tipo recebe um objeto java.sql.Connection como o terceiro parâmetro. Na maioria das vezes, os relatórios são preenchidos com dados de um banco de dados relacional. Isso é alcançado por -

    • Conecte-se ao banco de dados por meio de JDBC.

    • Inclui uma consulta SQL dentro do modelo de relatório.

    • O mecanismo JasperReports usa a conexão passada e executa a consulta SQL.

    • Uma fonte de dados de relatório é então produzida para preencher o relatório.

  • O segundo tipo, recebe um objeto net.sf.jasperreports.engine.JRDataSource, quando os dados que precisam ser preenchidos estiverem disponíveis em outros formulários.

Modelos de relatório de preenchimento

Vamos escrever um modelo de relatório. O conteúdo do arquivo JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) é o seguinte -

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

A seguir, vamos passar uma coleção de objetos de dados Java (Java beans), para o JasperReport Engine, para preencher este relatório compilado.

Escreva um POJO DataBean.java, que representa o objeto de dados (Java bean). Esta classe define dois objetos String, ou seja, 'nome' e 'país'. Salve-o no diretórioC:\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;
   }
}

Escreva uma classe DataBeanList.java, que possui lógica de negócios para gerar uma coleção de objetos java bean. Isso é posteriormente passado para o mecanismo JasperReports, para gerar o relatório. Aqui estamos adicionando 4 objetos DataBean na lista. Salve-o no diretórioC:\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;
   }
}

Escreva um arquivo de classe principal JasperReportFill.java, que obtém a coleção de java bean da classe (DataBeanList) e a passa para o mecanismo JasperReports, para preencher o modelo de relatório. Salve-o no diretórioC:\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();
      }
   }
}

Gerando relatórios

Agora iremos compilar e executar esses arquivos usando nosso processo regular de construção ANT. O arquivo build.xml é fornecido abaixo -

O arquivo de importação - baseBuild.xml é escolhido no capítulo Configuração do ambiente e deve ser colocado no mesmo diretório que o 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>

A seguir, vamos abrir a janela da linha de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comando ant -Dmain-class = com.tutorialspoint.JasperReportFill (executereport é o destino padrão) da seguinte forma -

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

Como resultado da execução acima, um arquivo jasper_report_template.jrprint é gerado no mesmo diretório que o arquivo .jasper (neste caso, ele é gerado em C: \ tools \ jasperreports-5.0.1 \ test).