Relatório Jasper - Exibir e imprimir relatórios

A saída dos objetos JasperPrint do processo de preenchimento de relatório pode ser visualizada usando um componente visualizador embutido, ou impressa, ou exportada para formatos de documento mais populares como PDF, HTML, RTF, XLS, ODT, CSV ou XML. A visualização e impressão dos documentos Jasper serão discutidas neste capítulo e a exportação será discutida no próximo capítulo, ou seja, 'Relatórios de exportação'.

Exibindo relatórios

JasperReport fornece um visualizador integrado para visualizar os relatórios gerados em seu formato original. É um componente baseado em swing e outras aplicações Java podem integrar este componente sem ter que exportar os documentos para outros formatos para serem visualizados ou impressos. A classe net.sf.jasperreports.view.JRViewer representa esse componente visual. Essa classe também pode ser personalizada de acordo com as necessidades do aplicativo, por meio de subclassificação.

JasperReports também possui um aplicativo Swing, que usa o componente visual para visualizar os relatórios. Este aplicativo ajuda a visualizar relatórios no mesmo formato em que * .jrprint é produzido. Este aplicativo Swing é implementado na classe net.sf.jasperreports.view.JasperViewer . Para visualizar relatórios usando esta classe, precisamos envolvê-lo em um alvo ANT.

Visualizando o relatório gerado

O exemplo a seguir demonstra - como visualizar um relatório usando a classe JasperViewer -

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

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

Vamos escrever um alvo viewFillReportpara o arquivo build.xml. O arquivo build.xml é o seguinte -

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 = "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>

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(viewFillReport é o destino padrão). Como resultado, vemos uma janela JasperViewer conforme mostrado na tela abaixo -

Imprimindo Relatórios

Podemos imprimir os documentos gerados pela biblioteca JasperReports (em seu formato proprietário, ou seja, objetos JasperPrint ) usando a classe net.sf.jasperreports.engine.JasperPrintManager . Esta é uma classe de fachada que se baseia na API Java 2 Printing. Também podemos imprimir os documentos, uma vez que os documentos JasperReport são exportados para outros formatos, como HTML ou PDF.

Imprimindo o relatório gerado

O código a seguir demonstra a impressão de um relatório. Vamos atualizar nossa classe JasperReportFill existente. Usaremos o método JasperPrintManager.printReport () . Este método recebe o nome do arquivo de origem (aqui passamos o arquivo .jrprint , que geramos na etapa anterior usando o método JasperFillManager.fillReportToFile ()) como primeiro parâmetro. O segundo parâmetroéo booleano para mostrar a janela de impressão padrão (nós o configuramos paratrue aqui).

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.JasperPrintManager;
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";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
    	   printFileName = JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
         if(printFileName != null){
            JasperPrintManager.printReport( printFileName, true);
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Agora, vamos salvar este arquivo no diretório C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Vamos compilar e executar este arquivo usando ANT. O conteúdo de build.xml é fornecido a seguir -

<?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 o prompt de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comandoant -Dmain-class=com.tutorialspoint.JasperReportPrint. Como resultado, uma caixa de diálogo de impressão é exibida. Clique em ok para imprimir o documento.