JasperReports - Diseño de informes de compilación

Hemos generado la plantilla JasperReport (archivo JRXML) en el capítulo anterior. Este archivo no se puede utilizar directamente para generar informes. Tiene que ser compilado en el formato binario nativo de JasperReport, llamadoJasperarchivo. Al compilar, transformamos el objeto JasperDesign en el objeto JasperReport -

La interfaz net.sf.jasperreports.engine.design.JRCompiler juega un papel central durante la compilación. Esta interfaz tiene varias implementaciones según el lenguaje utilizado para las expresiones de informe, que se pueden escribir en Java, Groovy, JavaScript o cualquier otro lenguaje de scripting siempre que la implementación del compilador pueda evaluarlo en tiempo de ejecución.

Podemos compilar el archivo JRXML de las siguientes dos formas:

  • Recopilación programática.
  • Compilación mediante tarea ANT.

Compilación programática de JRXML

La API de JasperReports ofrece una clase de fachada net.sf.jasperreports.engine.JasperCompileManager para compilar un JasperReport. Esta clase consta de varios métodos estáticos públicos para compilar plantillas de informes. La fuente de las plantillas pueden ser archivos, flujos de entrada y / o objetos de memoria.

El contenido del archivo JRXML (jasper_report_template.jrxml) es el siguiente. Se guarda en el directorioC:\tools\jasperreports-5.0.1\test -

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

El siguiente código demuestra la compilación del archivo jasper_report_template.jrxml anterior .

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;

public class JasperReportCompile {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test" + 
         "/jasper_report_template.jrxml";

      System.out.println("Compiling Report Design ...");
      try {
          /**
          * Compile the report to a file name same as
          * the JRXML file name
          */
         JasperCompileManager.compileReportToFile(sourceFileName);
      } catch (JRException e) {
         e.printStackTrace();
      }
      System.out.println("Done compiling!!! ...");
   }
}

Compilación de plantillas

Como siguiente paso, guardemos el contenido anterior en el archivo. C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javae importe baseBuild.xml en el archivo build.xml como se muestra a continuación. El baseBuild.xml ya tiene elcompile y run objetivos -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">

   <import file = "baseBuild.xml"/>

</project>

A continuación, abramos la ventana de la línea de comandos y vayamos al directorio donde se coloca build.xml. Finalmente, ejecute el comandoant -Dmain-class = com.tutorialspoint.JasperReportCompile como -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportCompile
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.JasperReportCompile
   [java] Compiling Report Design ...
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] Done compiling!!! ...

BUILD SUCCESSFUL
Total time: 8 seconds

Como resultado de la compilación anterior, verá que el archivo de plantilla jasper_report_template.jasper se generó en el directorio C: \ tools \ jasperreports-5.0.1 \ test.

Vista previa de la plantilla de informe compilado

El net.sf.jasperreports.view.JasperDesignViewer se puede utilizar para obtener una vista previa de las plantillas de informes compiladas y las plantillas JRXML.

Para avanzar más, agreguemos un nuevo objetivo viewDesignal archivo build.xml anterior, que nos permitirá obtener una vista previa del informe compilado. A continuación se muestra el build.xml revisado:

El archivo de importación, baseBuild.xml, se selecciona del capítulo Configuración del entorno y debe colocarse en el mismo directorio que build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesign" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description="Design viewer is launched 
      to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

Ejecutemos el comando - ant(viewDesign es el destino predeterminado) en el símbolo del sistema. Se abre la ventana JasperDesignViewer mostrando el archivo Jasper como se muestra a continuación:

Compilación a través de la tarea ANT

Como la compilación de plantillas de informes se parece más a un trabajo en tiempo de diseño que a un trabajo en tiempo de ejecución, la biblioteca JasperReport tiene una tarea ANT personalizada. Para ciertas situaciones, cuando se crea un archivo JRXML en tiempo de ejecución, no podemos usar esta tarea ANT. La tarea ANT personalizada se llama JRC y la implementa la clase: net.sf.jasperreports.ant.JRAntCompileTask . Su sintaxis y comportamiento son muy similares a los integrados<javac> Tarea ANT.

Compilación de plantillas

Agreguemos un nuevo objetivo compilereportdesinga nuestro build.xml existente. Aquí, la carpeta de origen se especifica mediante una etiqueta <src> anidada con los catálogos de archivos. La etiqueta de origen anidada permite compilar plantillas de informes que se encuentran dispersas en muchas ubicaciones diferentes y no están agrupadas en una única carpeta de origen de informes raíz. A continuación se muestra el build.xml revisado:

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "compilereportdesing" basedir = ".">
   
   <import file = "baseBuild.xml" />
   <target name = "viewDesign" description = "Design viewer is 
      launched to preview the compiled report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-F${file.name}.jasper" />
         <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 continuación, abramos el símbolo del sistema y vayamos al directorio donde se coloca build.xml. Ejecuta el comandoant(compilereportdesing es el destino predeterminado); La salida es la siguiente:

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See
   http://logging.apache.org/log4j/1.2/faq.html#noconfig
   for more info.
   [jrc] File :
   C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

BUILD SUCCESSFUL
Total time: 5 seconds

El archivo jasper_report_template.jasper se genera en el sistema de archivos (en nuestro caso C: \ tools \ jasperreports-5.0.1 \ test directorio). Este archivo es idéntico al archivo generado mediante programación llamando a net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Podemos obtener una vista previa de este archivo jaspe, ejecutandoant viewDesign.