Como usar el JRXmlDataSource de JasperReports 3.1.2 (Hola Mundo JRXmlDataSource)
Introducción
Este articulo muestra como usar utilizar el JRXmlDataSource de jasperReports.
Como fuente de datos usaremos un archivo XML y la salida sera un archivo PDF.
Para los que quieren una introducción acerca del archivo de definición de reporte, pueden ver: Comenzando con JasperReports (de David R. Heffelfinger) - Traducción
Definiendo el archivo de datos.
Lo nombraremos data.xml y tendrá el siguiente contendido.
<?xml version="1.0" encoding="UTF-8"?> <users> <user> <firstName>Carlos</firstName> <lastName>Rodrigues</lastName> <age>34</age> <id>12345678</id> </user> <user> <firstName>Esteban</firstName> <lastName>Arce</lastName> <age>21</age> <id>00000001</id> </user> <user> <firstName>Milton</firstName> <lastName>Laura</lastName> <age>50</age> <id>12003001</id> </user> <user> <firstName>Luis</firstName> <lastName>Pimentel</lastName> <age>45</age> <id>11004011</id> </user> </users> |
Creamos el archivo de definición del reporte.(helloJasperReportXML.jrxml)
Este archivo lo genere con la herramienta iReport. le quite la mayoría de los tags y lo deje con lo mas esencial para explicarlo.
<?xml version="1.0" encoding="UTF-8"?> <jasperReport name="helloHasperXML" xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"> <field name="FIRST_NAME" class="java.lang.String"> <fieldDescription><![CDATA[firstName]]></fieldDescription> </field> <field name="LAST_NAME" class="java.lang.String"> <fieldDescription><![CDATA[lastName]]></fieldDescription> </field> <field name="AGE" class="java.lang.String"> <fieldDescription><![CDATA[age]]></fieldDescription> </field> <field name="ID" class="java.lang.String"> <fieldDescription><![CDATA[id]]></fieldDescription> </field> <detail> <band height="18"> <textField isBlankWhenNull="false"> <reportElement key="textField-1" x="10" y="2" width="50" height="15"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{FIRST_NAME}]]></textFieldExpression> </textField> <textField isBlankWhenNull="false"> <reportElement key="textField-2" x="70" y="2" width="50" height="15"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{LAST_NAME}]]></textFieldExpression> </textField> <textField isBlankWhenNull="false"> <reportElement key="textField-3" x="130" y="2" width="50" height="15"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{AGE}]]></textFieldExpression> </textField> <textField isBlankWhenNull="false"> <reportElement key="textField-4" x="190" y="2" width="50" height="15"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{ID}]]></textFieldExpression> </textField> </band> </detail> </jasperReport> |
<field>, Define un campo que sera usado en el reporte. En este caso estamos definiendo 4 fields: FIRST_NAME, LAST_NAME, AGE y ID. Como verán, dentro de cada <field> hay un elemento <fieldDescription> este es como un mapa entre el field que sera usado en el reporte y el origen de datos. En Esta caso el origen de datos esta dado por el nombre del tag que corresponde en el archivo data.xml.
Importante: Para obtener los datos estamos usando en este caso XPATH, si quisieremos sacar una propiedad tendriamos que usar algo como @firstName
<textField>, este elemento se usa para, definir en que posición del reporte se desplegara un campo. Como verán tiene tres sub elementos: <reportelement>, que define la posición, <textElement>, que indica es es un campo texto y <textFieldExpression>, que indica de que field viene la informacion.
Creamos la clase HelloXMLJasperReport.
package bo.sumasoftware.hellojasper; import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRXmlDataSource; import java.util.HashMap; /** * @author renan * @since Mar 11, 2009 4:39:00 PM */ public class HelloXMLJasperReport { public static void main(String args[]) throws Exception { JasperReport jasperReport = JasperCompileManager.compileReport("src/main/resources/helloHasperXML.jrxml"); JRXmlDataSource xmlDataSource = new JRXmlDataSource("src/main/resources/data.xml","users//user"); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), xmlDataSource); JasperExportManager.exportReportToPdfFile(jasperPrint, "report_from_xml.pdf"); } } |
JasperCompileManager, nos permite crear una instancia de JasperReport que viene de compila nuestro archivo de definición de reporte, como verán se le pasa la ruta del mencionado archivo. Generalmente si no definiste bien los fields, te dará un error acá.
JRXmlDataSource, al crear la instancia le estamos pasando dos parámetros: path, que es el camino de nuestro archivo de datos y una expresión xpath, que indica de que parte del archivo xml se extraerá la información. En este caso con “users//user”, estamos indicando que recogeremos todos los elementos user que estan dentro del elemento users.
JRXmlDataSource, nos permite pasar pasar el DataSource y algunos parámetros antes de imprimirlo.
JasperExportManager, finalmente nos ayuda a imprimir el reporte en un archivo pdf….
fuiiiu fue largo el caminio.
Nota para los usuarios de iReport, si quieres usar esta herramienta para visualizar el reporte, tendrás que adicionar:
<queryString language="xPath"> <![CDATA[users//user]]> </queryString> |
como primer elemento hijo del tag <jasperReport≶ y una conexión XML referenciando al archivo data.xml. Con querySring, indicamos de donde se obtendrá la información.
También comparto el código fuente :), que también tiene aparte un ejemplo con base de datos.
Hasta la próxima :), si tienes comentarios no duden en hacerlos.
Follow me on twitter
Recent Comments