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 🧁
Tipos de informes
| Tipo | Ejemplo | Características |
|---|---|---|
| Listado | Clientes ordenados por ciudad | Una fila por registro; filtros y ordenación |
| Agrupado con totales | Ventas por categoría con subtotales | Cabecera y pie por grupo, cálculos |
| Documento | Factura, certificado, etiqueta | Diseño fijo, un registro por página |
| Maestro-detalle | Pedidos con sus líneas | Subinformes anidados |
| Resumen / gráfico | Evolución mensual de ventas | Gráficos de barras, líneas, sectores |
| Tabla cruzada | Ventas por producto y mes | Filas y columnas calculadas (crosstab) |
Herramientas
| Herramienta | Ecosistema | Notas |
|---|---|---|
| JasperReports + Jaspersoft Studio | Java | La librería de informes más usada en Java; plantillas .jrxml (XML) diseñadas con un editor visual |
| BIRT | Java / Eclipse | Alternativa de código abierto integrada en Eclipse |
| Crystal Reports | .NET, SAP | Clásico en aplicaciones Windows |
| Microsoft Report Builder / SSRS, Power BI | .NET, SQL Server | Informes empresariales y cuadros de mando |
| iText / OpenPDF, Apache PDFBox | Java | Generar PDF por código, sin plantilla |
| Apache POI | Java | Generar hojas de Excel |
| HTML + CSS de impresión | Web | Informes 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.
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.
3. Crear informes con JasperReports
- Diseñar la plantilla en Jaspersoft Studio (arrastrando campos a las bandas). Se guarda como
.jrxml, un XML. - Compilar la plantilla a
.jasper(lo hace el editor oJasperCompileManager). - Rellenar: la plantilla + los datos + los parámetros →
JasperPrint(JasperFillManager). - Exportar a PDF, XLSX, HTML, DOCX o CSV, o mostrarlo en un visor (
JasperViewer).
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>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/SimpleOutputStreamExporterOutputFuentes de datos
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.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
ResourceBundley formatos de número y fecha según la configuración regional.
| Formato de exportación | Cuándo |
|---|---|
| Documentos finales: facturas, certificados, informes para imprimir o enviar | |
| XLSX / CSV | Cuando el usuario quiere seguir trabajando con los datos en una hoja de cálculo |
| HTML | Mostrar el informe en una aplicación web o en un correo |
| DOCX / ODT | Documentos que se van a retocar a mano |
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».
(sin mensajes)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.
6. Ejercicios
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.
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.