You are on page 1of 19

Creación de Reportes con JasperRepots y iReports - Parte 1

:
Reportes con Conexión a Base de Datos

En un post anterior hablé un poco de las ventajas que tenemos al crear reportes con el
API JasperReports y la herramienta iReport.
Ahora veremos unos ejemplos de cómo usarlos en nuestras aplicaciones Java. Dividiré estos
ejemplos en varios post dedicando cada uno a una forma muy particular de la creación de
reportes.
Para estos ejemplos usaremos las últimas versiones de ambas herramientas (que en esta
actualización son las 3.7.6)
Lo primero que haremos es bajar el JasperReports y iReport. Este último lo usaremos en
su faceta de aplicación standalone y no como plugin para NetBeans. Esto por aquellos que nos
les guste usar el NetBeans.
Como ya había dicho: La última versión de iReport está basada en la plataforma de NetBeans
por lo que, como pueden observar en la imagen siguiente, las interfaces de ambos son muy
parecidas.

En este primer post veremos cómo crear reportes haciendo uso de una conexión a la base de
datos directamente desde nuestro reporte.
Lo primero que haremos es crear una base de datos con tablas y datos de pruebas para poder
tener algo interesante que ver en nuestros reportes. En este caso usaré MySQL versión 5.1, el
cual pueden descargar desde su página oficial. Usando el conector para Java
versión5.1.13 que pueden descargar desde la página de MySQL. Pero cualquier base de datos
que les guste funcionará para nuestros ejemplos.
La base de datos que usaré se llama "pruebaReportes" y contiene la tabla "participantes".
Este es el script para la creación de esta tabla:

'USERNAME'.'NOMBRE'.'NOMBRE'.'PASSWORD'.'part6pass'. insert into 'participantes'('ID'.NULL).'PASSWORD'.'comentarios participante 2').'par3user'.'COMENTARIOS') values (5.'par10user'.'NOMBRE'.'PASSWORD'.'USERNAME'.'COMENTARIOS') values (3. insert into 'participantes'('ID'.'comentatios participante 7').'PASSWORD'.'Participante 8'.'COMENTARIOS')values (1. 'USERNAME' varchar(100) NOT NULL. . 'PASSWORD' varchar(100) NOT NULL.'Participante 9'. insert into 'participantes'('ID'.'comentarios participante 9').'par6user'.'Participante 6'.'COMENTARIOS') values (6.'PASSWORD'.'PASSWORD'.'COMENTARIOS') values (10.'USERNAME'.'COMENTARIOS') values (2.'Participante 1'.'NOMBRE'. insert into 'participantes'('ID'.'USERNAME'.'Participante 2'.'PASSWORD'.'Participante 10'. insert into 'participantes'('ID'.'part8pass'.'COMENTARIOS') values (9.'par5user'.'COMENTARIOS') values (8.'par4user'.NULL).'USERNAME'.'NOMBRE'. 'COMENTARIOS' varchar(100) default NULL.'part4pass'.'Participante 3'. PRIMARY KEY ('ID') ) ENGINE=InnoDB DEFAULT CHARSET=latin1 Y este es el script para poblar la tabla anterior: Insert into 'participantes'('ID'.'PASSWORD'. 'NOMBRE' varchar(100) NOT NULL.'par2user'.'NOMBRE'. insert into 'participantes'('ID'.'comentarios participante 8').'Participante 7'.CREATE TABLE 'participantes' ( 'ID' bigint(21) NOT NULL.'par1user'.'part3pass'.'USERNAME'.'par9user'.'NOMBRE'.'USERNAME'.'PASSWORD'.'par8user'.'NOMBRE'.'part1pass'.'par7user'. insert into 'participantes'('ID'.'part7pass'.'comentarios participante 1').'NOMBRE'. insert into 'participantes'('ID'.'Participante 4'.'part2pass'.'USERNAME'.'part9pass'.'COMENTARIOS') values (4. insert into 'participantes'('ID'.'part5pass'.'USERNAME'.'Participante 5'.'part10pass'.'comentarios respecto al participante 4').'COMENTARIOS') values (7.'PASSWORD'.'sin comentarios para el participante 5').'comentarios participante 3').'USERNAME'.'NOMBRE'.

Para crear este datasource hacemos clic en el ícono "Report Datasources" ubicado en la barra de herramientas de iReport: Con lo que se abrirá la ventana de "Connections / Datasources" que en este momento debe contener solo un "Empty datasource" y la conexión a una base de datos de prueba en HSQLDB. sin necesidad de una aplicación Java (por el momento).Ahora que tenemos nuestros datos crearemos un "datasource" en iReport para poder acceder a nuestros datos y hacer pruebas directamente. En la nueva ventana que se abre seleccionamos "Database JDBC connection" y presionamos el botón "Next". Ahora hacemos clic en el botón "New" para crear nuestro nuevo datasource. Después de llenar estos datos su ventana debe haber quedado más o menos como la siguiente (recuerden usar el "JDBC Driver" que corresponda al manejador de base de datos que estén usando: . En la siguiente ventana debemos proporcionar algunos datos como el nombre se le dará al datasource y los datos para realizar la conexión de la base de datos.

Antes de guardar esta configuración hagan clic en el botón "Test" para probar que todos los datos proporcionados son correctos. En mi caso seleccionaré la plantilla "Wood" aunque pueden seleccionar la que ustedes deseen.. Si todo ha salido bien..". Esta será la primer y única ocasión en la que haremos uso del "Report Wizard" para ayudarnos a generar el reporte. y hacemos clic en el botón "Launch Report Wizard" . Con esto se abrirá la ventana de "New File" en la que seleccionaremos el formato de nuestro reporte. Ahora pasaremos a crear nuestro nuevo reporte. Para esto vamos al menú "File -> New. al hacer clic en el botón "Save" la ventana actual debe cerrarse y nuestro datasource debe estar ahora en la ventana "Connections / Datasources".

jasper") que es el que usaremos principalmente en nuestras aplicaciones Java (aunque también podriamos optar por compilar nuestro archivo ". En este paso debemos seleccionar el datasource desde el que los datos del reporte serán tomados. Hacemos clic en el botón "Next" para continuar con el paso 3. Selección del layout o acomodo de los datos en el reporte 6. . 3. Creación de grupos para el reporte (se explicará en un post posterior). ya que posteriormente tendremos que moverlo para que nuestra aplicación java pueda encontrarlo. Estos 7 pasos son: 1. Selección de la ubicación en la que se guardará nuestro reporte. Al hacer el cambio del datasource veremos que aparece un textarea con el título "Query(SQL)" y en la parte inferior debemos tener un mensaje de error que dice "Invalid query". Así que nosotros seleccionamos el datasource "Conexion MySQL Pruebas" (el datasource que creamos anteriormente).jasper" correspondiente). Selección de los datos que queremos mostrar en el reporte.jrxml" que significa "jasper reports xml". En este momento no importa mucho en donde guardemos el archivo que se generará. y es un documento xml que contiene los datos para generar un archivo compilado (". Felicitación por tenerminar nuestro reporte =D. 4.Este wizard nos ayudará a crear un reporte 100% funcional en 6 pasos (en realidad 5 ya que empezamos directamente en el paso 2) que podremos ver desde el mismo iReport sin necesidad de escribir una solo línea de código Java. 2. así que será en estos en los que nos enfocaremos más. Por mi parte llamaré al archivo "reporte1". 5. Nota: La extensión de documentos de reportes generados por JasperReports es ". Por default está seleccionado el "Empty datasource". Selección del datasource e introducción del query para obtener los datos que nos interesan. así que no tenemos mucho que hacer en él. El paso 1 se realiza de forma automática.jrxml" desde la misma aplicación Java y así generar el archivo ". Los pasos interesantes son el 3 y el 4. En el paso 2 (en donde comenzamos) seleccionamos el directorio en el que queremos guardar nuestro reporte y el nombre que tendrá.

Escribir una consulta nosotros mismos de forma directa. Para esto tenemos 3 opciones: 1. efectivamente. Con esto aparecerá en la tercer sección otra ventana con el título "participantes" y un conjunto de checkboxes. La primer sección es la de la estructura de la consulta. cada uno con un campo de nuestra tabla. y temporales locales). Ya solo damos clic en el botón "OK". Para esto hacemos doble clic sobre el nombre de la tabla "participantes" en la segunda sección de la ventana que tenemos abierta. en el textarea no tenemos una consulta válida (de hecho no tenemos ninguna). 3. con excepción del "ID". La segunda sección es la de los elementos de nuestra base de datos (tablas. La consulta que haremos será para obtener todos los datos de la tabla "participantes".).txt. Aquí básicamente podremos cambiar entre las sentencias que estamos editando (SELECT. Cargar una consulta que tengamos guardada en algún archivo . 2. Para generar la consulta que nos interesa solamente seleccionamos todos los checkboxes (con excepción del "ID") y veremos que la consulta se genera en la primer sección. Nosotros haremos uso del diseñador de consultas. Por lo que ahora corregiremos eso.sql o . Crear una consulta usando el "diseñador de consultas". etc. . WHERE. Aquí podremos seleccionar los elementos de los que queremos obtener datos para la consulta. Finalmente la tercer sección nos muestra los elementos que hemos seleccionado de la segunda sección para que podamos seleccionar los datos a obtener. vistas. Hacemos clic en el botón "Design query" con lo que se abrirá una nueva ventana que está dividida en tres secciones. ORDER BY.Esto ocurre porque.

Ahora en el paso 5 debemos seleccionar cómo queremos que los datos sean agrupados. pero por el momento dejemos todo en blanco y demos clic en el botón "Next". En este paso solo tenemos que seleccionar cuáles campos del query generado en el paso anterior queremos que se muestren en el reporte. . para lo que hacemos clic en el botón "Next".Con esto ya tendremos nuestra consulta en el textarea correspondiente y podemos continuar con el paso 4. Como nosotros queremos que se muestren todos pasamos todos los campos del lado izquierdo al lado derecho y hacemos clic en el botón "Next". Esto lo explicaré en algún otro post. El último paso es el solamente una felicitación por haber creado un nuevo reporte ^-^.

podemos ver un preview con los datos reales si cambiamos a la vista de "preview" en la ventana del editor. Como veremos en los siguientes posts. en este caso. Si queremos compilar nuestro reporte de forma manual podemos hacer clic en el botón "Compile Report" de la vista de diseño: .  Tenemos un datasource configurado para esta base de datos.  Nuestro reporte hace una consulta directa a esta base de datos a través del datasource anterior. Al hacer clic en la pestaña de "preview". nuestro reporte se compilará y se mostrará. ya que si no tiene datos obtendremos un mensaje de error). por lo que tendremos problemas para ver los datos en el preview del reporte. En este caso el reporte puede ser pre-visualizado porque las siguientes condiciones se cumplen:  Tenemos una base de datos poblada (esto es muy importante.jasper" el cual es el archivo que usaremos desde la aplicación Java que crearemos en un momento. podría ser que no todas estas condiciones se cumplan al mismo tiempo.  El reporte está preparado para mostrar los datos recuperados anteriormente. Algo importante que ocurre al hacer este preview es que el reporte se compila generando el archivo "reporte1.Ahora hacemos clic en el botón "Finish" y ya podremos ver la plantilla de nuestro reporte. Si queremos ver como se verá el reporte final.

Además cambiamos el título de cada una de las columnas por algo más claro. Por ejemplo. por ahora solo confíen en que deben estar ahí. Esta es una sintaxis especial que usa JasperReports para definir campos de objetos y variables. Existe otro tipo de dato que se usa llamado propiedades ($P{propiedad}). y eliminamos el fondo y el subtitulo que tiene. . respectivamente. Como todo esto fue colocado por el wizard no lo explicaré hasta el siguiente post.. Nota: Hay algunas notaciones usadas en la plantilla del reporte que tal vez no comprendan como $F{participantes_USERNAME} y$V{PAGE_NUMBER}. etc.. cambiamos el color de texto a negro. Lo primero que haremos es crear un nuevo proyecto en NetBeans. Para esto vamos al menú "File -> new Project. podemos cambiar el título de la columna "participantes_USERNAME" a "Usuario". "participantes_NOMBRE" a "Nombre".Haremos algunas modificaciones para que este reporte se vea un poco mejor: primero cambiaremos el título que dice "Wood Title" por "Reporte de Participantes".". En la ventana de nuevos proyectos seleccionamos la categoría "Java" y de tipo de proyecto seleccionamos "Java Application" y hacemos clic en el botón "Next". Al final mi reporte queda de esta forma: Con este preview: Ahora que tenemos un reporte que nos agrada (o al menos que no se ve tan mal) veremos cómo generar este reporte desde una aplicación Java. En la siguiente ventana introducimos el nombre de nuestro proyecto y dejamos seleccionada la opción "Create Main Class" y "Set as Main Project".

Lo que haremos a continuación es crear una biblioteca que contenga los archivos jars básicos necesarios de JasperReports. solo debemos actualizar esta biblioteca. Además si actualizamos la versión del API que usamos.Hacemos clic en el botón "Finish" para que nuestro proyecto se genere. De esta forma no tendremos que agregar cada uno de los jars cada vez que necesitemos usar JasperReports en un proyecto. Para crear nuestra biblioteca vamos al menú "Tools -> Libraries": .

Nos aseguramos que la pestaña "Classpath" esté seleccionada y hacemos clic en el botón "Add Jar/Folder" situado a la derecha. . Al hacer clic en el botón "OK" regresaremos al "Library Manager" y tendremos nuestra nueva biblioteca creada. En esta ventana hacemos clic en el botón "New Library": En la ventana que se abre escribimos el nombre de la nueva biblioteca (en mi caso será "JasperReports") y en el tipo de la biblioteca seleccionamos la opción "Class Libraries".Con esto se abrirá la ventana del "Library Manager". Se abrirá un cuadro de dialogo para que seleccionemos los jars que queremos agregar. Pero aún nos hace falta agregar los archivos jars que conformarán esta biblioteca.

7.jar commons-collections-2.5.1.jar groovy-all-1.0.jar commons-logging-1.4.6.jar jasperreports-3.5.1.6-javaflow.jar commons-beanutils-1.7.jar commons-javaflow-20060411.jar png-encoder-1.jar commons-digester-1.jar Algunos de estos jars se encuentran en el directorio "dist" y otros en el directorio "lib" del archivo .7.6. Para que los ejemplos que haremos más adelante (en los siguientes posts) funcionen.zip de JasperRepots que bajamos anteriormente.7.jar poi-3.jar jasperreports-fonts-3.Navegamos hasta el directorio en el que tenemos los jars de JasperReports que bajamos anteriormente. debemos agregar a la biblioteca los siguientes jars:             jasperreports-3.0.7.7.6.8.jar iText-2.1. .

" del menú contextual ." En la ventana que se abre seleccionamos la biblioteca que creamos anteriormente ("JasperReports") y hacemos clic en el botón "Add Library". Con esto se abrirá un menú contextual con 4 opciones.Hacemos clic en el botón "Add Jar/Folder" y con esto tendremos lista nuestra biblioteca "JasperReports" para agregarla a nuestro proyecto. Ahora hacemos clic derecho en el nodo "Libraries" de la ventana "Projects".. Hacemos clic en el botón "OK" para regresar al ambiente de trabajo... Al hacer esto veremos se agregar al nodo "Libraries" de nuestro proyecto todos los jars que tiene nuestra biblioteca. seleccionamos la opción "Add Library.. Nota: Si no crearon la biblioteca como se indica en pasos anteriores pueden agregar cada uno de los jars manualmente seleccionando la opción "Add JAR/Folder.

Ahora veremos el código para generar el reporte en varios formatos. Esto es porque al tratar de hacer la conexión es posible que ocurra un error.Driver").13-bin.1.jdbc. Por lo que el código para generar la conexión en el siguiente: Class.getConnection("jdbc:mysql://localhost:3306/pruebareporte s".¿Recuerdan que cuando vimos el preview del reporte que creamos en iReports se generó un archivo "reporte1.jasper"? Tomamos este archivo y lo colocamos en el directorio raíz del proyecto de NetBeans que acabamos de crear (la raíz del proyecto es el directorio en el que se encuentran los subdirectorios "nbproject".forName("com. Si recuerdan nuestra base de datos se llama "pruebareportes". "src". "password").SQLException". de la misma forma que agregamos la de JasperReports. entre otros). Seguramente en este momento el NetBeans les está marcando un error en estas dos líneas que hemos agregado. Lo primero es crear una conexión a la base de datos que creamos anteriormente.mysql. Connection conexion = DriverManager. pueden ver este artículo. Si no saben cómo crear una conexión JDBC desde Java. y por lo tanto es posible que se lance una excepción de tipo "java.jar) al proyecto al nodo "Libraries" de la ventana "Project" usando la opción "Add JAR/Folder" o también pueden agregar la biblioteca "MySQL JDBC Driver" que ya trae incluido el NetBeans. Para solucionar esto pueden hacer dos cosas. La primera es rodear estas líneas (y las siguientes que crearemos) en una clausula try/catch.sql. "usuario". La segunda opción (la que yo usaré) es agregar la clausula throws Exception en el métodomain: . Nota: No olviden agregar el jar del driver de MySQL que bajamos anteriormente (mysqlconnector-java-5.

jasper"). el cual es un componente swing. Pasamos "null" como segundo parámetro porque no estamos pasando ningún parámetro al reporte (esto también lo veremos después). "fillReport". y agregar este último a un panel. pero aún hace falta que llenemos este reporte con los datos que obtendrá de la base de datos.util.sf.jasperreports.engine. o. "root". Lo siguiente que debemos hacer es cargar el archivo ".jasper" generado anteriormente y colocarlo en un objeto "net. "123"). como en este caso.fillReport(reporte.getConnection("jdbc:mysql://localhost:3306/pruebareporte s". Si la conexión se realiza correctamente veremos el mensaje run: BUILD SUCCESSFUL (total time: 0 second) En la ventana "Output". que nos permite llenar el reporte con datos obtenidos de distintas fuentes de datos (una de estas fuentes es la sentencia SQL que escribimos al generar el reporte con el wizard en iReports y la conexión que usaremos en un momento.sf. conexion).jasper" en la raíz del proyecto. De lo contrario verán el error el en stacktrace de la excepción que se lanzó. guardarlo en un archivo.public static void main(String[] args) throws Exception { Class.engine. veremos qué otras fuentes de datos existen y cómo usarlos en los siguientes posts). Una vez que la conexión se realice exitosamente podremos proseguir con los pasos restantes. Connection conexion = DriverManager.JRLoader": JasperReport reporte = (JasperReport) JRLoader. .mysql.sf.JasperReport".jasperreports. En este caso la fuente de datos es la conexión directa a la base de datos que creamos anteriormente (el objeto conexion): JasperPrint jasperPrint = JasperFillManager. Para esto usamos la clase "net.loadObject("reporte1.jasperreports. Si lo colocaron en otra ubicación será necesario que pasen como parámetro al método "loadObject" la url absoluta en la que se encuentré el archivo.JasperFillManager". Ahora el objeto "reporte" contiene la definición del reporte. El objeto "JasperPrint" que obtenemos como resultado de la invocación del método "fillReport" es la representación de nuestro reporte (ahora con datos) que podemos mandar a imprimir. Nota: Podemos cargar el archivo de esta forma gracias a que colocamos el archivo "reporte1. Si están haciendo una aplicación swing y quieren mostrar este reporte directamente en un componente pueden pasar el objeto "JasperPrint" que acabamos de crear como parámetro a un nuevo objeto "net.Driver").engine. Esta clase tiene un método estático.jdbc. null.jasperreports. } Pueden probar que la conexión se realiza correctamente presionando F6 o haciendo clic en el botón "Run Main Project". mostrar en pantalla (si estamos usando una aplicación swing o awt).sf.JasperViewer". Para esto hacemos uso de la clase de utilidad "net.view.forName("com.

OUTPUT_FILE.setParameter(JRExporterParameter. Recuerden cambiar el nombre y la extensión del archivo cada vez que cambiemos de formato.jasperPrint). Para que nuestro reporte sea guardado en formato PDF creamos un objeto de tipo "net.pdf": .sf. "net.sf. Veremos cómo generar los reportes en los siguientes formatos:  PDF  HTML  CSV  RTF  TXT  XLS  XML  XLSX  DOCX  PPTX Entre muchos otros.export.engine.jasperreports.jasperreports.pdf"). y las clases que la implementan nos permiten generar el reporte en distintos formatos de una forma sencilla. exporter. Primero declaramos una referencia a un objeto de tipo "JRExporter" de la siguiente forma: JRExporter exporter = Será esta referencia la que usaremos de ahora en adelante. La segunda línea le dice al "exporter" cuál será el nombre del archivo generado (en este caso "reportePDF.io.JASPER_PRINT. las siguientes líneas son comunes no importando el formato en el que vaya a quedar nuestro reporte: exporter. Si ahora ejecutamos nuestra aplicación veremos que en el directorio raíz del proyecto se ha creado un archivo llamado "reportePDF. La última línea es la que realiza el proceso de exportación.setParameter(JRExporterParameter.ara guardar este reporte a un archivo debemos usar un "net.engine.new java.exportReport(). Ahora. exporter.JRExporter" es una interface.pdf")). La primer línea asigna a nuestro objeto "exporter" el "jasperPrint" (el reporte con datos) que creamos anteriormente.JRPdfExporter" y lo asignamos a nuestra referencia exporter: JRExporter exporter = new JRPdfExporter().jasperreports.sf.JRExporter".engine.File("reportePDF.

para que nuestro reporte sea exportado a formato HTML cambiamos la línea: JRExporter exporter = new JRPdfExporter().html" en el directorio raíz de la aplicación: Con el siguiente contenido: . Al ejecutar nuevamente nuestra aplicación tendremos veremos que se genera el archivo "reporteHTML.Con el siguiente contenido: Por lo que nuestra prueba ha sido exitosa ^-^.html".pdf" a "reporteHTML. por JRExporter exporter = new JRHtmlExporter(). y el nombre del archivo de "reportePDF. Ahora.

engine.sf.setParameter(JRTextExporterParameter. además.engine.ooxml.engine.setParameter(JRTextExporterParameter.jasperreports.engine.sf. Usamos las siguientes clases para generar los reportes en los siguientes formatos:  PDF: net.CHARACTER_HEIGHT.engine.exportJRTextExporter  XLSX: net.export.jasperreports.exportJRXmlExporter  TXT: net.engine. con un par de modificaciones pudimos hacer que nuestro reporte se generara en un formato completamente distinto.exportJRCsvExporter  RTF: net.export.txt tendrán que agregar.CHARACTER_WIDTH.jasperreports.export. Con el resto de los formatos es igual de simple.jasperreports.sf. 12).sf.exportJRRtfExporter  XLS: net.sf. 12).jasperreports.engine.JRDocxExporter  PPTX: net.exportJRHtmlExporter  CSV: net.//text exporter exporter.exportJRXlsExporter  XML: net.jasperreports.sf.engine.JRXlsxExporter  DOCX: net.sf.engine.exportJRPdfExporter  HTML: net.//text exporter Este es el código de la clase "Main": public class Main { /** ^_^ .sf.jasperreports. estas dos líneas: exporter.JRPptxExporter Entre muchos otros Para generar archivos .engine.jasperreports.ooxml.ooxml.sf.jasperreports.Como pudimos ver.sf.jasperreports.

exporter.JASPER_PRINT.jdbc.forName("com.OUTPUT_FILE. } } new . null. "usuario".mysql.setParameter(JRExporterParameter.* @param args argumentos recibidos por la linea de comandos */ public static void main(String[] args) throws Exception { Class.loadObject("reporte1.Driver"). exporter.getConnection("jdbc:mysql://localhost:3306/pruebareport es". Connection conexion = DriverManager. exporter. "password"). JasperReport reporte = (JasperReport) JRLoader.jasper").io.File("reportePDF. java.exportReport(). JRExporter exporter = new JRPdfExporter().setParameter(JRExporterParameter. JasperPrint jasperPrint = JasperFillManager.fillReport(reporte. conexion).pdf")). jasperPrint).