Cómo generar informes al vuelo mediante DynamicJasper
Índice de contenidos
- 1. Introducción
- 2. Entorno
- 3. Configuración del proyecto para Maven
- 4. Nuestro primer informe
- 5. Conclusiones
- 6. Referencias
1. Introducción
Hoy en día es muy común que por pequeña que sea nuestra aplicación tengamos que generar algún tipo de informe. En el mundo Java existe un estándar de facto llamado JasperReports, ampliamente extendido. Si bien generar un informe al vuelo con JasperReports es técnicamente posible, requiere de un exhaustivo conocimiento de la herramienta, su comportamiento y posibilidades.
Para simplificar esa tarea y ayudarnos en la medida de lo posible, disponemos de un framework llamado DynamicJasper, que apoyándose en JasperReports, oculta su complejidad y nos permite realizar informes profesionales de una manera muy sencilla.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil MacBook Pro Retina 15″ (2.2 Ghz Intel Core I7, 16GB DDR3).
- Sistema Operativo: Mac OS Yosemite 10.10
- Entorno de desarrollo: IDEA IntelliJ 16.01 EAP
- Maven 3.3.9
- Flyway
- PostgreSQL 9.5.1
3. Creación del proyecto con Maven
Lo primero que necesitamos es importar la librería de DynamicJasper. Optamos por la manera más sencilla, que es crearnos un proyecto Maven, en el que incluimos el repositorio de DynamicJasper y su dependencia:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... <repositories> <repository> <id>fdvsolution.public</id> <url>http://nexus.fdvs.com.ar/content/groups/public/</url> </repository> </repositories> ... <dependencies> ... <dependency> <groupId>ar.com.fdvs</groupId> <artifactId>DynamicJasper</artifactId> <version>5.0.2</version> </dependency> ... </dependencies> ... |
Con esta sencilla configuración ya estamos listos para utilizar DynamicJasper en nuestro proyecto.
4. Nuestro primer informe
La estructura de nuestro primer informe va a ser muy sencilla. Va a constar de un encabezado de página, un subtítulo que indique la fecha y hora de generación y una linea de detalle en la que mostrar nuestra información.
Lo que a priori parece sencillo, utilizando JasperReports directamente supondría realizar tareas de configuración del informe, definición de elementos, gestión de bandas de impresión, parámetros, etc. Ahora veremos como queda resuelto con este framework.
Para el caso que nos ocupa, vamos a dividir nuestro proyecto en datasource, exporter y clase principal. Únicamente vamos a comentar las clases de generación y exportación del informe. Para el resto del proyecto, podéis importarlo desde el repositorio de GitHub aquí.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public DynamicReport buildReport() throws ClassNotFoundException { FastReportBuilder fastReportBuilder = new FastReportBuilder(); fastReportBuilder.addColumn("ID", "id", Long.class.getName(), 50) .addColumn("Nombre", "firstname", String.class.getName(), 200) .addColumn("Apellidos", "surname", String.class.getName(), 200) .addColumn("Fecha Incorporación", "startDate", String.class.getName(), 120) .addColumn("Salario", "salary", String.class.getName(), 120) .addColumn("Departamento", "department", String.class.getName(), 180) .setTitle("Mi primer Informe con DynamicJasper").setSubtitle("Generado el " + new Date()) .setPrintBackgroundOnOddRows(true).setUseFullPageWidth(true); return fastReportBuilder.build(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public static void exportReport(JasperPrint jp, String path) throws JRException, FileNotFoundException { LOGGER.debug("Exporing report to: " + path); JRPdfExporter exporter = new JRPdfExporter(); File outputFile = new File(path); File parentFile = outputFile.getParentFile(); if (parentFile != null) parentFile.mkdirs(); FileOutputStream fos = new FileOutputStream(outputFile); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, fos); exporter.exportReport(); LOGGER.debug("Report exported: " + path); } |
Como podemos ver, la generación de informes sencillos de manera dinámica no podría ser más simple. Sólo tenemos que instanciar el builder que nos proporciona DynamicJasper, ir añadiendo las columnas que necesitemos en el orden de salida, títulos y demás propiedades. La exportación se delega a los métodos de JasperReports, ya que lo que obtenemos es un objeto JasperPrint.
5. Conclusiones
Si bien hemos conseguido generar un informe muy simple, DynamicJasper nos brinda multitud de posibilidades a la hora de trabajar con reports. Podemos gestionar virtualización, grupos, layouts, tablas, estilos, subreports, plantillas, etc. con la misma facilidad que este pequeño informe. Merece la pena dedicar un tiempo a revisar todas las posibilidades que nos ofrece esta librería.
6. Referencias
- DynamicJasper: Documentación oficial
- DynamicJasper How-To: Trucos y soluciones para problemas comúnes
Para los usuarios de linux Mint (no sé otros). Hay que instalar la fuente arial (por defecto no lo está), si no da un error.
Buen artículo!
DynamicJasper trae una dependencia jar (DynamicJasper-core-fonts) que trae la fonts más comunes, entre ellas «Arial».
Por otro lado, DynamicJasper ya esta disponible en el repositorio central de maven, por lo que no hace falta agregar el repo en el pom
Saludos