Apuntes DAM
    Tema 5 de 9DI · 2º DAM

    Desarrollo de Interfaces

    Informes

    Generación de informes: tipos, estructura en bandas, JasperReports y Jaspersoft Studio, fuentes de datos, parámetros, agrupaciones, subinformes, gráficos y exportación a PDF y Excel.

    60 min lecturaIntermedio

    1. Informes en las aplicaciones

    Un informe presenta los datos de una aplicación de forma organizada para leerlos, imprimirlos o compartirlos: una factura, un listado de alumnos por grupo, las ventas del mes con sus totales y un gráfico. Casi toda aplicación de gestión necesita generar informes, normalmente en PDF y a veces en Excel o HTML.

    Un informe es como un molde de repostería 🧁

    📐
    La plantilla
    El molde: dónde va el logo, el título, las columnas, los totales. Se diseña una vez.
    🗃️
    Los datos
    La masa: vienen de la base de datos, de una lista de objetos o de un fichero.
    📄
    El informe
    El resultado: la plantilla rellena con los datos, exportada a PDF, Excel o HTML.

    Tipos de informes

    TipoEjemploCaracterísticas
    ListadoClientes ordenados por ciudadUna fila por registro; filtros y ordenación
    Agrupado con totalesVentas por categoría con subtotalesCabecera y pie por grupo, cálculos
    DocumentoFactura, certificado, etiquetaDiseño fijo, un registro por página
    Maestro-detallePedidos con sus líneasSubinformes anidados
    Resumen / gráficoEvolución mensual de ventasGráficos de barras, líneas, sectores
    Tabla cruzadaVentas por producto y mesFilas y columnas calculadas (crosstab)

    Herramientas

    HerramientaEcosistemaNotas
    JasperReports + Jaspersoft StudioJavaLa librería de informes más usada en Java; plantillas .jrxml (XML) diseñadas con un editor visual
    BIRTJava / EclipseAlternativa de código abierto integrada en Eclipse
    Crystal Reports.NET, SAPClásico en aplicaciones Windows
    Microsoft Report Builder / SSRS, Power BI.NET, SQL ServerInformes empresariales y cuadros de mando
    iText / OpenPDF, Apache PDFBoxJavaGenerar PDF por código, sin plantilla
    Apache POIJavaGenerar hojas de Excel
    HTML + CSS de impresiónWebInformes en el navegador; se imprimen o guardan como PDF

    2. Estructura de un informe: las bandas

    Los generadores de informes dividen la página en bandas (secciones horizontales). Cada una se imprime en un momento concreto: una vez al principio, en cada página, por cada registro o por cada grupo.

    Title (título)Solo en la primera página: logo, título y fecha
    Page Header (cabecera de página)Arriba de cada página: nombres de las columnas
    Group Header (cabecera de grupo)Al empezar cada grupo: «Categoría: Audio»
    Detail (detalle)Una vez por cada registro de datos
    Group Footer (pie de grupo)Al terminar cada grupo: subtotal
    Page Footer (pie de página)Abajo de cada página: «Página 2 de 5»
    Summary (resumen)Al final del informe: totales generales, gráfico

    Elementos de una plantilla

    • Campos ($F{nombre}): columnas de la fuente de datos.
    • Parámetros ($P{fechaInicio}): valores que la aplicación pasa al informe (filtros, título, logo).
    • Variables ($V{totalGrupo}): cálculos (suma, media, recuento) que se reinician por grupo, página o informe. $V{PAGE_NUMBER} es el número de página.
    • Expresiones: fórmulas Java/Groovy para formatear o calcular ($F{precio} * 1.21).
    • Elementos: textos estáticos, campos de texto, imágenes, líneas, códigos de barras y QR, gráficos y subinformes.
    1. Introducción a JasperSoft Studio 2025 | Curso de Reportes en Java — Stive Tech

    3. Crear informes con JasperReports

    1. Diseñar la plantilla en Jaspersoft Studio (arrastrando campos a las bandas). Se guarda como .jrxml, un XML.
    2. Compilar la plantilla a .jasper (lo hace el editor o JasperCompileManager).
    3. Rellenar: la plantilla + los datos + los parámetros → JasperPrint (JasperFillManager).
    4. Exportar a PDF, XLSX, HTML, DOCX o CSV, o mostrarlo en un visor (JasperViewer).
    ventas.jrxml (fragmento)
    1<jasperReport name="ventas" pageWidth="595" pageHeight="842" columnWidth="555">
    2  <parameter name="TITULO" class="java.lang.String"/>
    3  <queryString><![CDATA[SELECT categoria, producto, importe FROM ventas ORDER BY categoria]]></queryString>
    4  <field name="categoria" class="java.lang.String"/>
    5  <field name="producto" class="java.lang.String"/>
    6  <field name="importe" class="java.math.BigDecimal"/>
    7
    8  <variable name="subtotal" class="java.math.BigDecimal" resetType="Group" resetGroup="porCategoria" calculation="Sum">
    9    <variableExpression><![CDATA[$F{importe}]]></variableExpression>
    10  </variable>
    11
    12  <group name="porCategoria">
    13    <groupExpression><![CDATA[$F{categoria}]]></groupExpression>
    14    <groupHeader><band height="20">
    15      <textField><reportElement x="0" y="0" width="300" height="20"/>
    16        <textFieldExpression><![CDATA["Categoría: " + $F{categoria}]]></textFieldExpression></textField>
    17    </band></groupHeader>
    18    <groupFooter><band height="20">
    19      <textField pattern="#,##0.00 €"><reportElement x="400" y="0" width="155" height="20"/>
    20        <textFieldExpression><![CDATA[$V{subtotal}]]></textFieldExpression></textField>
    21    </band></groupFooter>
    22  </group>
    23
    24  <title><band height="40">
    25    <textField><reportElement x="0" y="0" width="555" height="30"/>
    26      <textFieldExpression><![CDATA[$P{TITULO}]]></textFieldExpression></textField>
    27  </band></title>
    28  <detail><band height="18">
    29    <textField><reportElement x="20" y="0" width="300" height="18"/>
    30      <textFieldExpression><![CDATA[$F{producto}]]></textFieldExpression></textField>
    31    <textField pattern="#,##0.00 €"><reportElement x="400" y="0" width="155" height="18"/>
    32      <textFieldExpression><![CDATA[$F{importe}]]></textFieldExpression></textField>
    33  </band></detail>
    34  <pageFooter><band height="20">
    35    <textField><reportElement x="455" y="0" width="100" height="20"/>
    36      <textFieldExpression><![CDATA["Página " + $V{PAGE_NUMBER}]]></textFieldExpression></textField>
    37  </band></pageFooter>
    38</jasperReport>
    GeneradorInformes.java
    1import net.sf.jasperreports.engine.*;
    2import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    3import java.sql.Connection;
    4import java.util.*;
    5
    6public class GeneradorInformes {
    7
    8    /** Informe con los datos de una consulta SQL (la consulta está en la plantilla). */
    9    public static void ventasPdf(Connection con, String destino) throws JRException {
    10        JasperReport plantilla = JasperCompileManager.compileReport(
    11                GeneradorInformes.class.getResourceAsStream("/informes/ventas.jrxml"));
    12        Map<String, Object> parametros = new HashMap<>();
    13        parametros.put("TITULO", "Ventas de septiembre");
    14        JasperPrint informe = JasperFillManager.fillReport(plantilla, parametros, con);
    15        JasperExportManager.exportReportToPdfFile(informe, destino);
    16    }
    17
    18    /** Informe a partir de una lista de objetos (JavaBeans con getters). */
    19    public static JasperPrint desdeLista(List<Venta> ventas) throws JRException {
    20        JasperReport plantilla = (JasperReport) net.sf.jasperreports.engine.util.JRLoader
    21                .loadObject(GeneradorInformes.class.getResourceAsStream("/informes/ventas.jasper"));
    22        return JasperFillManager.fillReport(plantilla, Map.of("TITULO", "Ventas"),
    23                new JRBeanCollectionDataSource(ventas));
    24    }
    25}
    26
    27// Mostrar el informe en una ventana:  JasperViewer.viewReport(informe, false);
    28// Exportar a Excel: JRXlsxExporter con SimpleExporterInput/SimpleOutputStreamExporterOutput

    Fuentes de datos

    Un informe puede alimentarse de una conexión JDBC (con la consulta en la plantilla), de una colección de objetos (JRBeanCollectionDataSource), de un fichero XML, JSON o CSV, o de una fuente vacía (JREmptyDataSource) para documentos que solo usan parámetros. Separar la plantilla de los datos permite reutilizarla.
    7. Parámetros y Variables en JasperReports | Reportes Dinámicos en Java — Stive Tech

    4. Filtros, subinformes, gráficos y exportación

    • Filtrar con parámetros: WHERE fecha BETWEEN $P{desde} AND $P{hasta}. La aplicación pide las fechas en un formulario y las pasa al informe.
    • Ordenar y agrupar: la consulta debe venir ordenada por el campo del grupo; si no, un mismo grupo aparece varias veces.
    • Subinformes: un informe dentro de otro, con su propia fuente de datos (las líneas de cada factura).
    • Gráficos (JFreeChart): barras, líneas, sectores; normalmente en la banda Summary o en el pie de grupo.
    • Tablas cruzadas (crosstab): productos en filas, meses en columnas y totales en ambos ejes.
    • Formato condicional: estilos con condiciones (importes negativos en rojo).
    • Imágenes, códigos de barras y QR para etiquetas, entradas o facturas con Verifactu.
    • Internacionalización: textos de un ResourceBundle y formatos de número y fecha según la configuración regional.
    Formato de exportaciónCuándo
    PDFDocumentos finales: facturas, certificados, informes para imprimir o enviar
    XLSX / CSVCuando el usuario quiere seguir trabajando con los datos en una hoja de cálculo
    HTMLMostrar el informe en una aplicación web o en un correo
    DOCX / ODTDocumentos que se van a retocar a mano
    OJO APRENDE A AGRUPAR REGISTROS Y CREAR GRÁFICOS EN JASPERREPORTS STUDIO (IREPORT) — 4SoftwareDevelopers

    5. Informes en aplicaciones web

    En una aplicación web el informe puede generarse en el servidor (PDF con JasperReports, iText o una librería de Node) o directamente en el navegador con HTML y CSS de impresión: tabla con cabeceras que se repiten en cada página (thead), saltos de página controlados y botón «Imprimir / Guardar como PDF».

    Generador de informes: datos (JSON) → informe HTML imprimible
    Consola
    (sin mensajes)
    🧩JS · DOMInforme de ventas agrupado con subtotalesMedio

    Completa generarInforme(ventas) para que pinte en #informe una tabla agrupada por categoría (en orden alfabético). Por cada categoría: una fila <tr class="grupo"> con su nombre, una fila por venta (producto e importe con 2 decimales) y una fila <tr class="subtotal"> con «Subtotal» y la suma de la categoría. Al final, una fila <tr class="total"> con «Total» y la suma general.

    index.htmlsolo lectura
    script.js
    Vista previa

    6. Ejercicios

    Ejercicio Práctico
    Fácil

    Diseña las bandas de una factura

    Indica en qué banda de JasperReports colocarías cada elemento de una factura y qué tipo de elemento es (texto estático, campo, parámetro, variable, imagen, subinforme): logo de la empresa · número de factura · datos del cliente · cabeceras de las columnas · cada línea de producto · subtotal, IVA y total · «Página 1 de 2» · condiciones legales al final · código QR.

    Ejercicio Práctico
    Difícil

    Informe de alumnos con JasperReports

    Con Jaspersoft Studio y una base de datos con alumnos(id, nombre, grupo, nota), crea un informe que: 1. Reciba como parámetro el grupo (o todos si es nulo). 2. Agrupe por grupo mostrando nombre y nota, con la nota en rojo si es menor que 5. 3. Muestre en cada pie de grupo la media y el número de aprobados. 4. Incluya al final un gráfico de barras con la media por grupo. 5. Se genere desde una aplicación Java a PDF y a Excel.

    ¿Has terminado este tema?

    Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

    Guardar mi progreso