Algunos detalles con jasperreports y java

From ChuWiki
Jump to navigation Jump to search

Algunos detalles que me he ido encontrando al jugar con jasperreports-library

maven/gradle[edit]

La dependencia tal cual la trae mvnrepository no funciona bien, no encuntra una dependencia transitiva de itext. Este es el apaño que he hecho para que me funcione, en gradle

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile('net.sf.jasperreports:jasperreports:6.7.0') {
        exclude group:'com.lowagie'
    }
    compile group: 'com.lowagie', name: 'itext', version: '2.1.7'
}

He excluido el itext (grupo com.lowagie) que viene y he puesto una versión similar pero que sí existe. Funciona, pero sale un warning al generar informes de que la librería de itext no está parcheada, pero aparentemente funciona.

ADVERTENCIA: Unpatched iText found, cannot use glyph rendering

Será cuestión de buscar una librería de itext que sí esté parcheada y que sí esté en los repositorios de maven.

Parámetros en Jasper[edit]

A la hora de crear la plantilla de un informe con iReport o su versión nueva, Jasper Studio, podemos crear parámetros que luego, a la hora de generar el informe, se podrán rellenar para obtener un informe concreto. Estos parámetros pueden ser para lo que queramos, por ejemplo, poner la clausula where de la consulta a la base de datos a partir de la cual generamos el informe, o añadir una foto/logo en el título, o cualquier otra cosa que queramos que se rellene en el momento de generar el informe y que no esté fijo desde el momento de diseñar la plantilla con iReport o Jasper Studio.

Una imagen como parámetro[edit]

En la siguiente imagen creamos un parámetro de nombre the_image y de tipo java.lang.String

Parameters-the image.png

Luego, el el informe, añadimos una imagen donde queramos de tipo "custom expression". Ahí rellenamos con $P{the_image} donde the_image es el nombre que hemos dado a nuestro parámetro

Jasper-studio-crear-imagen-parametro.png

Nuestro fichero jrxml debería tener algo como esto

...
<parameter name="the_image" class="java.lang.String"/>
...
<image>
	<reportElement x="48" y="29" width="50" height="50" uuid="67c761e8-8fcf-4b9d-973b-f63af98dd150"/>
	<imageExpression><![CDATA[$P{the_image}]]></imageExpression>
</image>

Ahora, a la hora de generar el informe desde código java, solo tenemos que rellenar el parámetro con un path donde esté la imagen que nos interesa. Ojo si el path es relativo, tenemos que asegurarnos que se encuentra desde donde se está ejecutando nuestro programa.

        // Compilar el fichero jrxml
        JasperReport report = JasperCompileManager.compileReport(
                "src/main/files/Blank_A4.jrxml");

        // Rellenamos los parámetros del informe con valores
        Map<String,Object> parameters = new HashMap<>();
        parameters.put("the_image","src/main/files/the_image.png");

        // Conexión a la base de datos donde están los datos del informe
        Class.forName("org.postgresql.Driver");
        Connection conn = null;
        conn = DriverManager.getConnection(
                "jdbc:postgresql://localhost/prueba","postgres", "postgres");

        // rellenamos el informe con datos y parámetros
        JasperPrint print = JasperFillManager.fillReport(report, parameters, conn);

        // Y a guardar en un pdf !!
        JasperExportManager.exportReportToPdfFile(print,
                "build/Blank_A4.pdf");

Un parámetro para la consulta[edit]

De la misma forma, podemos crear un parámetro para poner en el where de la consulta de la que queremos generar el informe. Por ejemplo, si creamos un parámetro de tipo java.lang.String y de nombre the_code, en jasper studio, donde se pone la query de consulta, podemos poner

select * from films where code = $P{the_code}

como se muestra en la siguiente imagen

Query-con-parametro.png

En este ejemplo, la campo code de base de datos es un String, y por eso nuestro parámetro es un java.lang.String. Deberíamos elegir un tipo de parámetro acorde al tipo del campo en la base de datos. Fíjate también que no hemos entrecomillado $P{the_code} en la consulta, jasper es suficientemente listo como para hacerlo él.

En el fichero jrxml debe quedar algo parecido a esto

<parameter name="the_code" class="java.lang.String">
...
<queryString language="SQL">
	<![CDATA[select * from films where code = $P{the_code}]]>
</queryString>

y a la hora de generar el informe desde java, sólo tenemos que rellenar el valor de ese parámetro con algún valor que exista en ese campo de la base de datos

...
Map<String,Object> parameters = new HashMap<>();
parameters.put("the_code","pepe2");
parameters.put("the_image","src/main/files/the_image.png");  // esta es la imagen de antes :)