Ejemplo básico con Jasper Report

De ChuWiki

¿Qué es Jasper Report?[editar]

Jasper Report es una librería para la generación de informes. Está escrita en java y es libre. https://community.jaspersoft.com/

El funcionamiento consiste en escribir un fichero jrxml (Jasper Report XML) donde se recogen las particularidades del informe. Este jrxml lo tratan las clases del Jasper para obtener una salida. Esta salida puede ser un PDF, XML, HTML, CSV, XLS, RTF, TXT.

Otra ventaja de utilizar Jasper Report es que se integra perfectamente con JFreeChart que es una librería libre para la generación de todo tipo de graficas. https://www.jfree.org/jfreechart/

Para generar el jrxml lo recomendable es bajarse la herramienta Jaspersoft Studio (descargar Jaspersoft Studio) que es un editor gráfico que está implementado en java y se integra perfectamente con el Jasper Report.

Un ejemplo básico:[editar]

Para generar un reporte con jasper report debemos seguir los siguientes pasos:

  1. Generar un fichero .jrxml en el que se configura cómo queremos el informe
  2. Compilar el fichero .jrxml para obtener un fichero .jasper
  3. Rellenar los datos del informe. Esto generará un fichero .jrprint
  4. Exportar el fichero .jrprint al formato que deseemos (pdf, etc). Esto generará el fichero en cuestión.


Generar el fichero .jrxml[editar]

El fichero .jrxml se puede generar con la herramienta Jaspersoft Studio, mencionada antes, que permite generar el fichero .jrxml de forma visual y más fácil.

En este fichero también se configura cual va a ser la fuente de datos (si es una base de datos, un fichero, etc). Incluso si es base de datos, en este fichero se pone el SELECT que devuelve los datos que queremos para el informe.

Compilado del fichero .jrxml[editar]

Para compilar el fichero .jrxml y generar el fichero .jasper, desde código podemos poner algo como esto

 JasperReport report = JasperCompileManager.compileReport("C:/informes JAsper/JRXML/InformeMySql.jrxml");

Rellenar el informe con datos[editar]

Ahora hay que rellenar el informe con datos. Desde código se hace con algo como esto

 JasperPrint print = JasperFillManager.fillReport(report, parameters, conn);

donde conn es la conexión con la base de datos. No es necesario indicar el select ni nada similar, puesto que esta información está incluida en el .jrxml.

parameters es un Map<String, Object> de Java donde ponemos los parámetros del informe Jasper Report que hayamos definido en él.

Obtener el pdf (o el que sea)[editar]

Finalmente, para obtener el fichero .pdf, la línea es algo como esto

 JasperExportManager.exportReportToPdfFile(print, "C:\\informes JAsper\\PDF's\\InformePaisesMySQL.pdf");

donde el parámetro es el fichero de salida que deseamos.

Tienes otros formatos de salida:

Previsualizar el informe[editar]

Podemos previsualizar el informe desde java con

 JasperViewer.viewReport(print, false);

mostrará una ventana con el informe.

El ejemplo[editar]

Vamos a ver todo esto con un ejemplo concreto.

Este ejemplo saca la información de una tabla en base de datos de países y muestra su id, el nombre del país y un cod de dos letras. En este caso atacamos contra MySQL y estos son los datos:

 
 BBDD :  tecnireg_osc1
 Usuario : root
 Password : No hay password 
 Tabla : countries
 La tabla  countries tiene los siguientes campos :
   countries_id
   countries_name
   countries_iso_code_2
   countries_iso_code_3

Ficheros adjuntos:

  • InformeMySql.java (Main java )
  • InformeMySql.jrxml (Plantilla xml con la definición del informe)
  • InformePaisesMySQL.pdf (Pdf generado `por la aplicación).

En tu proyecto necesitarías todas las librerías de jasperreports library. Una forma cómoda de hacerlo es montando un proyecto Maven con Jasper Report

El fichero .java[editar]

InformeMySql.java

package pruebasInformes;

/*
 * Created on 11-nov-2004
 */

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.view.JasperViewer;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperCompileManager;

/**
 * <p>
 * Ejemplo práctico de visualización de un reporte de JasperReports que contiene
 * un subreporte.
 * </p>
 * <p>
 * Esta clase ha sido desarrollada para ilustrar el tutorial "JasperReports,
 * iReport y Subreportes" .
 * </p>
 */
public class InformeMySql {
  static Connection conn = null;

  /**
   *
   * @param args
   */
  public static void main(String[] args) {
    // Cargamos el driver JDBC
    try {
      Class.forName("com.mysql.jdbc.Driver");
    }
    catch (ClassNotFoundException e) {
      System.out.println("MySQL JDBC Driver not found.");
      System.exit(1);
    }
    //Para iniciar el Logger.
    //inicializaLogger();
    try {
      conn = DriverManager.getConnection("jdbc:mysql://localhost/tecnireg_osc1","root", "");
      conn.setAutoCommit(false);
    }
    catch (SQLException e) {
      System.out.println("Error de conexión: " + e.getMessage());
      System.exit(4);
    }

    try {
      Map parameters = new HashMap();
      parameters.put("TITULO", "PAISES");
      parameters.put("FECHA", new java.util.Date());
      JasperReport report = JasperCompileManager.compileReport(
          "C:\\informes JAsper\\JRXML\\InformeMySql.jrxml");
      JasperPrint print = JasperFillManager.fillReport(report, parameters, conn);
      // Exporta el informe a PDF
      JasperExportManager.exportReportToPdfFile(print,
          "C:\\informes JAsper\\PDF's\\InformePaisesMySQL.pdf");
      //Para visualizar el pdf directamente desde java
      JasperViewer.viewReport(print, false);
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      /*
       * Cleanup antes de salir
       */
      try {
        if (conn != null) {
          conn.rollback();
          System.out.println("ROLLBACK EJECUTADO");
          conn.close();
        }
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }

  }
  /**
   *  Puedes descomentar esto si quieres instanciar  el loger. Necesitas la libreia log4j y el siguiente import
   *  import org.apache.log4j.*;
   *  Debes llamarlo desde el main.
   */
  /*
  static void inicializaLogger()
   {
                 PatternLayout pat = new PatternLayout(
                                 "[%-5p][%t] (%F:%L) : %m%n");
                 Logger.getRootLogger().addAppender(new ConsoleAppender(pat));
     Logger.getRootLogger().setLevel(Level.DEBUG);

   }
   */


} // main()

Fichero de configuración del informe[editar]

InformeMySql.jrxml (creado por Jaspersoft Studio a través de una interface gráfica, no te asustes).

<?xml version="1.0" encoding="UTF-8"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" 
    "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
		 name="InformeMySql"
		 columnCount="1"
		 printOrder="Vertical"
		 orientation="Portrait"
		 pageWidth="595"
		 pageHeight="842"
		 columnWidth="535"
		 columnSpacing="0"
		 leftMargin="30"
		 rightMargin="30"
		 topMargin="20"
		 bottomMargin="20"
		 whenNoDataType="NoPages"
		 isTitleNewPage="false"
		 isSummaryNewPage="false">
	<property name="ireport.scriptlethandling" value="2" />
	<property name="ireport.encoding" value="UTF-8" />
	<import value="java.util.*" />
	<import value="net.sf.jasperreports.engine.*" />
	<import value="net.sf.jasperreports.engine.data.*" />

	<parameter name="TITULO" isForPrompting="false" class="java.lang.String"/>
	<parameter name="FECHA" isForPrompting="false" class="java.util.Date"/>
	<queryString><![CDATA[SELECT * FROM Countries GROUP BY countries_id  ORDER BY countries_name]]></queryString>

	<field name="countries_id" class="java.lang.Integer"/>
	<field name="countries_name" class="java.lang.String"/>
	<field name="countries_iso_code_2" class="java.lang.String"/>
	<field name="countries_iso_code_3" class="java.lang.String"/>
	<field name="address_format_id" class="java.lang.Integer"/>

		<background>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</background>
		<title>
			<band height="50"  isSplitAllowed="true" >
				<staticText>
					<reportElement
						x="165"
						y="11"
						width="104"
						height="26"
						key="staticText-1"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center" verticalAlignment="Middle">
						<font size="18" isBold="true"/>
					</textElement>
				<text><![CDATA[INFORME]]></text>
				</staticText>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" 
                                           hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="278"
						y="11"
						width="100"
						height="26"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Left" verticalAlignment="Middle">
						<font size="18" isBold="true"/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[$P{TITULO}]]></textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" pattern="EEEEE dd MMMMM yyyy" 
                                           isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  
                                           hyperlinkTarget="Self" >
					<reportElement
						x="444"
						y="14"
						width="84"
						height="18"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Right" verticalAlignment="Middle">
						<font/>
					</textElement>
				<textFieldExpression   class="java.util.Date"><![CDATA[$P{FECHA}]]></textFieldExpression>
				</textField>
			</band>
		</title>
		<pageHeader>
			<band height="9"  isSplitAllowed="true" >
			</band>
		</pageHeader>
		<columnHeader>
			<band height="28"  isSplitAllowed="true" >
				<staticText>
					<reportElement
						mode="Opaque"
						x="355"
						y="6"
						width="61"
						height="17"
						forecolor="#FFFFFF"
						backcolor="#666666"
						key="staticText-4"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000"
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center" verticalAlignment="Middle">
						<font size="12" isBold="true"/>
					</textElement>
				<text><![CDATA[COD]]></text>
				</staticText>
				<staticText>
					<reportElement
						mode="Opaque"
						x="84"
						y="6"
						width="41"
						height="17"
						forecolor="#FFFFFF"
						backcolor="#666666"
						key="staticText-2"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" 
                                             rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center" verticalAlignment="Middle">
						<font size="12" isBold="true"/>
					</textElement>
				<text><![CDATA[ID]]></text>
				</staticText>
				<staticText>
					<reportElement
						mode="Opaque"
						x="168"
						y="6"
						width="142"
						height="17"
						forecolor="#FFFFFF"
						backcolor="#666666"
						key="staticText-3"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000"
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center" verticalAlignment="Middle">
						<font size="12" isBold="true"/>
					</textElement>
				<text><![CDATA[NOMBRE]]></text>
				</staticText>
			</band>
		</columnHeader>
		<detail>
			<band height="27"  isSplitAllowed="true" >
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" 
                                           hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="85"
						y="4"
						width="41"
						height="18"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center">
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.Integer"><![CDATA[$F{countries_id}]]>
                                </textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" 
                                           hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="169"
						y="4"
						width="141"
						height="18"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[$F{countries_name}]]>
                                </textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" 
                                           hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="366"
						y="4"
						width="39"
						height="18"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Center">
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[$F{countries_iso_code_2}]]>
                                </textFieldExpression>
				</textField>
			</band>
		</detail>
		<columnFooter>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</columnFooter>
		<pageFooter>
			<band height="31"  isSplitAllowed="true" >
				<line direction="TopDown">
					<reportElement
						x="88"
						y="5"
						width="312"
						height="0"
						key="line-1"/>
					<graphicElement stretchType="NoStretch"/>
				</line>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" 
                                           hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="151"
						y="10"
						width="114"
						height="16"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement textAlignment="Right">
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA["Página " + $V{PAGE_NUMBER} + 
                                                       " de "]]></textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" 
                                           evaluationTime="Report" 
                                           hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="269"
						y="10"
						width="133"
						height="16"
						key="textField"/>
					<box topBorder="None" topBorderColor="#000000" leftBorder="None" 
                                             leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" 
                                             bottomBorder="None" bottomBorderColor="#000000"/>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA["" + $V{PAGE_NUMBER} + 
                                                       ""]]></textFieldExpression>
				</textField>
			</band>
		</pageFooter>
		<lastPageFooter>
			<band height="50"  isSplitAllowed="true" >
			</band>
		</lastPageFooter>
		<summary>
			<band height="50"  isSplitAllowed="true" >
			</band>
		</summary>
</jasperReport>


Fuerza y Honor.