Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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 cmo usarlos en nuestras aplicaciones Java. Dividir estos
ejemplos en varios post dedicando cada uno a una forma muy particular de la creacin de reportes.
Para estos ejemplos usaremos las ltimas versiones de ambas herramientas (que en esta
actualizacin
son
las
3.7.6)
Lo primero que haremos es bajar el JasperReports y iReport. Este ltimo lo usaremos en su
faceta de aplicacin standalone y no como plugin para NetBeans. Esto por aquellos que nos les
guste
usar
el
NetBeans.
Como ya haba dicho: La ltima versin 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 cmo crear reportes haciendo uso de una conexin 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 versin 5.1, el cual
pueden descargar desde su pgina oficial. Usando el conector para Java versin 5.1.13 que
pueden descargar desde la pgina 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 creacin de esta tabla:
PRIMARY KEY
('ID')
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values
(1,'Participante
1','par1user','part1pass','comentarios
participante 1');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values
(2,'Participante
2','par2user','part2pass','comentarios
participante 2');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values
(3,'Participante
3','par3user','part3pass','comentarios
participante 3');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values (4,'Participante 4','par4user','part4pass','comentarios respecto
al participante 4');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values (5,'Participante 5','par5user','part5pass','sin comentarios para
el participante 5');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values (6,'Participante 6','par6user','part6pass',NULL);
insert
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
into
values
(7,'Participante
7','par7user','part7pass','comentatios
participante 7');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values
(8,'Participante
8','par8user','part8pass','comentarios
participante 8');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values
(9,'Participante
9','par9user','part9pass','comentarios
participante 9');
insert
into
'participantes'('ID','NOMBRE','USERNAME','PASSWORD','COMENTARIOS')
values (10,'Participante 10','par10user','part10pass',NULL);
Ahora que tenemos nuestros datos crearemos un "datasource" en iReport para poder acceder
a nuestros datos y hacer pruebas directamente, sin necesidad de una aplicacin Java (por el
momento). 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 conexin a una base de datos de prueba en HSQLDB.
Ahora hacemos clic en el botn "New" para crear nuestro nuevo datasource.
Antes de guardar esta configuracin hagan clic en el botn "Test" para probar que todos los datos
proporcionados son correctos. Si todo ha salido bien, al hacer clic en el botn "Save" la ventana
actual debe cerrarse y nuestro datasource debe estar ahora en la ventana "Connections /
Datasources".
Ahora pasaremos a crear nuestro nuevo reporte. Esta ser la primer y nica ocasin en la que
haremos uso del "Report Wizard" para ayudarnos a generar el reporte. Para esto vamos al
men "File -> New...". Con esto se abrir la ventana de "New File" en la que
seleccionaremos el formato de nuestro reporte. En mi caso seleccionar la plantilla "Wood" aunque
pueden seleccionar la que ustedes deseen, y hacemos clic en el botn "Launch Report
Wizard"
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 lnea de cdigo Java. Estos 7 pasos son:
1. Seleccin de la ubicacin en la que se guardar nuestro reporte.
2. Seleccin del datasource e introduccin del query para obtener los datos que nos
interesan.
Los pasos interesantes son el 3 y el 4, as que ser en estos en los que nos enfocaremos ms.
El paso 1 se realiza de forma automtica, as que no tenemos mucho que hacer en l. En el paso 2
(en donde comenzamos) seleccionamos el directorio en el que queremos guardar nuestro reporte y
el
nombre
que
tendr.
Nota: La extensin de documentos de reportes generados por JasperReports es ".jrxml" que significa
"jasper reports xml", y es un documento xml que contiene los datos para generar un archivo compilado
(".jasper") que es el que usaremos principalmente en nuestras aplicaciones Java (aunque tambin
podriamos optar por compilar nuestro archivo ".jrxml" desde la misma aplicacin Java y as generar el
archivo
".jasper"
correspondiente).
En este momento no importa mucho en donde guardemos el archivo que se generar, ya que
posteriormente tendremos que moverlo para que nuestra aplicacin java pueda encontrarlo. Por mi
parte
llamar
al
archivo
"reporte1".
Hacemos clic en el botn "Next" para continuar con el paso 3. En este paso debemos seleccionar
el datasource desde el que los datos del reporte sern tomados. Por default est seleccionado el
"Empty datasource". As que nosotros seleccionamos el datasource "Conexion MySQL
Pruebas"
(el
datasource
que
creamos
anteriormente).
Al hacer el cambio del datasource veremos que aparece un textarea con el ttulo "Query(SQL)" y
en la parte inferior debemos tener un mensaje de error que dice "Invalid query".
Esto ocurre porque, efectivamente, en el textarea no tenemos una consulta vlida (de hecho no
tenemos ninguna). Por lo que ahora corregiremos eso. Para esto tenemos 3 opciones:
1. Escribir una consulta nosotros mismos de forma directa.
2. Cargar una consulta que tengamos guardada en algn archivo .sql o .txt.
Nosotros haremos uso del diseador de consultas. Hacemos clic en el botn "Design query" con
lo que se abrir una nueva ventana que est dividida en tres secciones.
Con esto ya tendremos nuestra consulta en el textarea correspondiente y podemos continuar con
el
paso
4,
para
lo
que
hacemos
clic
en
el
botn
"Next".
En este paso solo tenemos que seleccionar cules campos del query generado en el paso anterior
queremos que se muestren en el reporte. Como nosotros queremos que se muestren todos
pasamos todos los campos del lado izquierdo al lado derecho y hacemos clic en el botn "Next".
Ahora en el paso 5 debemos seleccionar cmo queremos que los datos sean agrupados. Esto lo
explicar en algn otro post, pero por el momento dejemos todo en blanco y demos clic en el botn
"Next".
El ltimo paso es el solamente una felicitacin por haber creado un nuevo reporte ^-^.
Ahora hacemos clic en el botn "Finish" y ya podremos ver la plantilla de nuestro reporte.
Si queremos ver como se ver el reporte final, en este caso, podemos ver un preview con los datos
reales si cambiamos a la vista de "preview" en la ventana del editor.
Tenemos una base de datos poblada (esto es muy importante, ya que si no tiene datos
obtendremos un mensaje de error).
Nuestro reporte hace una consulta directa a esta base de datos a travs del datasource
anterior.
Como veremos en los siguientes posts, podra ser que no todas estas condiciones se cumplan al
mismo tiempo, por lo que tendremos problemas para ver los datos en el preview del reporte.
Algo importante que ocurre al hacer este preview es que el reporte se compila generando el
archivo "reporte1.jasper" el cual es el archivo que usaremos desde la aplicacin Java que
crearemos
en
un
momento.
Si queremos compilar nuestro reporte de forma manual podemos hacer clic en el botn "Compile
Report" de la vista de diseo:
Haremos algunas modificaciones para que este reporte se vea un poco mejor: primero
cambiaremos el ttulo que dice "Wood Title" por "Reporte de Participantes", cambiamos
el color de texto a negro, y eliminamos el fondo y el subtitulo que tiene.
Adems cambiamos el ttulo de cada una de las columnas por algo ms claro. Por ejemplo,
podemos cambiar el ttulo de la columna "participantes_USERNAME" a "Usuario",
"participantes_NOMBRE"
a
"Nombre",
etc.
Al final mi reporte queda de esta forma:
Ahora que tenemos un reporte que nos agrada (o al menos que no se ve tan mal) veremos cmo
generar
este
reporte
desde
una
aplicacin
Java.
Nota: Hay algunas notaciones usadas en la plantilla del reporte que tal vez no comprendan como
$F{participantes_USERNAME} y $V{PAGE_NUMBER}. Esta es una sintaxis especial que usa JasperReports
para definir campos de objetos y variables, respectivamente. Existe otro tipo de dato que se usa llamado
propiedades ($P{propiedad}). Como todo esto fue colocado por el wizard no lo explicar hasta el siguiente
post,
por
ahora
solo
confen
en
que
deben
estar
ah.
Lo primero que haremos es crear un nuevo proyecto en NetBeans. Para esto vamos al men
"File -> new Project...". En la ventana de nuevos proyectos seleccionamos la categora
"Java" y de tipo de proyecto seleccionamos "Java Application" y hacemos clic en el botn
"Next". En la siguiente ventana introducimos el nombre de nuestro proyecto y dejamos
seleccionada la opcin "Create Main Class" y "Set as Main Project".
Hacemos clic en el botn "Finish" para que nuestro proyecto se genere. Lo que haremos a
continuacin es crear una biblioteca que contenga los archivos jars bsicos necesarios de
JasperReports. De esta forma no tendremos que agregar cada uno de los jars cada vez que
necesitemos usar JasperReports en un proyecto. Adems si actualizamos la versin del API que
usamos,
solo
debemos
actualizar
esta
biblioteca.
Para crear nuestra biblioteca vamos al men "Tools -> Libraries":
Con esto se abrir la ventana del "Library Manager". En esta ventana hacemos clic en el botn
"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 opcin "Class Libraries".
Al hacer clic en el botn "OK" regresaremos al "Library Manager" y tendremos nuestra nueva
biblioteca creada. Pero an nos hace falta agregar los archivos jars que conformarn esta
biblioteca. Nos aseguramos que la pestaa "Classpath" est seleccionada y hacemos clic en el
botn "Add Jar/Folder" situado a la derecha. Se abrir un cuadro de dialogo para que
seleccionemos los jars que queremos agregar.
Navegamos hasta el directorio en el que tenemos los jars de JasperReports que bajamos
anteriormente. Para que los ejemplos que haremos ms adelante (en los siguientes posts)
funcionen, debemos agregar a la biblioteca los siguientes jars:
jasperreports-3.7.6.jar
jasperreports-3.7.6-javaflow.jar
jasperreports-fonts-3.7.6.jar
commons-beanutils-1.8.0.jar
commons-collections-2.1.1.jar
commons-digester-1.7.jar
commons-logging-1.0.4.jar
commons-javaflow-20060411.jar
groovy-all-1.7.5.jar
iText-2.1.7.jar
png-encoder-1.5.jar
poi-3.6.jar
Algunos de estos jars se encuentran en el directorio "dist" y otros en el directorio "lib" del
archivo
.zip
de
JasperRepots
que
bajamos
anteriormente.
Hacemos clic en el botn "Add Jar/Folder" y con esto tendremos lista nuestra biblioteca
"JasperReports" para agregarla a nuestro proyecto.
Hacemos
clic
en
el
botn
"OK"
para
regresar
al
ambiente
de
trabajo.
Ahora hacemos clic derecho en el nodo "Libraries" de la ventana "Projects". Con esto se
abrir un men contextual con 4 opciones, seleccionamos la opcin "Add Library..."
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 raz del
proyecto de NetBeans que acabamos de crear (la raz del proyecto es el directorio en el que se
encuentran los subdirectorios "nbproject", "src", entre otros).
Ahora
veremos
el
cdigo
para
generar
el
reporte
en
varios
formatos.
Lo primero es crear una conexin a la base de datos que creamos anteriormente. Si no saben
cmo crear una conexin JDBC desde Java, pueden ver este artculo. Si recuerdan nuestra base
de datos se llama "pruebareportes". Por lo que el cdigo para generar la conexin en el
siguiente:
Class.forName("com.mysql.jdbc.Driver");
Connection
conexion
DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebareportes"
, "usuario", "password");
Nota: No olviden agregar el jar del driver de MySQL que bajamos anteriormente (mysql-connector-java5.1.13-bin.jar) al proyecto al nodo "Libraries" de la ventana "Project" usando la opcin "Add
JAR/Folder" o tambin pueden agregar la biblioteca "MySQL JDBC Driver" que ya trae incluido el
NetBeans,
de
la
misma
forma
que
agregamos
la
de
JasperReports.
Seguramente en este momento el NetBeans les est marcando un error en estas dos lneas que
hemos agregado. Esto es porque al tratar de hacer la conexin es posible que ocurra un error, y
por lo tanto es posible que se lance una excepcin de tipo "java.sql.SQLException". Para
solucionar esto pueden hacer dos cosas. La primera es rodear estas lneas (y las siguientes que
crearemos) en una clausula try/catch. La segunda opcin (la que yo usar) es agregar la
clausula throws Exception en el mtodo main:
conexion
DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebareportes"
, "root", "123");
}
run:
BUILD SUCCESSFUL (total time: 0 second)
JasperReport
reporte
(JasperReport)
JRLoader.loadObject("reporte1.jasper");
Nota: Podemos cargar el archivo de esta forma gracias a que colocamos el archivo "reporte1.jasper" en
la raz del proyecto. Si lo colocaron en otra ubicacin ser necesario que pasen como parmetro al mtodo
"loadObject"
la
url
absoluta
en
la
que
se
encuentr
el
archivo.
Ahora el objeto "reporte" contiene la definicin del reporte, pero an hace falta que llenemos este
reporte con los datos que obtendr de la base de datos. Para esto usamos la clase
"net.sf.jasperreports.engine.JasperFillManager". Esta clase tiene un mtodo
esttico, "fillReport", 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 conexin que usaremos en un momento, veremos qu otras fuentes de
datos existen y cmo usarlos en los siguientes posts). En este caso la fuente de datos es la
conexin directa a la base de datos que creamos anteriormente (el objeto conexion):
JasperPrint
jasperPrint
JasperFillManager.fillReport(reporte,
null,
conexion);
Pasamos "null" como segundo parmetro porque no estamos pasando ningn parmetro al
reporte
(esto
tambin
lo
veremos
despus).
El objeto "JasperPrint" que obtenemos como resultado de la invocacin del mtodo
"fillReport" es la representacin de nuestro reporte (ahora con datos) que podemos mandar a
imprimir, mostrar en pantalla (si estamos usando una aplicacin swing o awt), o, como en este
caso,
guardarlo
en
un
archivo.
Si estn haciendo una aplicacin swing y quieren mostrar este reporte directamente en un
componente pueden pasar el objeto "JasperPrint" que acabamos de crear como parmetro a un
nuevo objeto "net.sf.jasperreports.view.JasperViewer", el cual es un componente
swing,
y
agregar
este
ltimo
a
un
panel.
Para
guardar
este
reporte
a
un
"net.sf.jasperreports.engine.JRExporter".
archivo
debemos
usar
un
HTML
CSV
RTF
TXT
XLS
XML
XLSX
DOCX
PPTX
Entre
muchos
otros.
Ser esta referencia la que usaremos de ahora en adelante. Para que nuestro reporte sea
guardado
en
formato
PDF
creamos
un
objeto
de
tipo
"net.sf.jasperreports.engine.export.JRPdfExporter" y lo asignamos a nuestra
referencia exporter:
Ahora, las siguientes lneas son comunes no importando el formato en el que vaya a quedar
nuestro reporte:
exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE,new
java.io.File("reportePDF.pdf"));
exporter.exportReport();
La primer lnea asigna a nuestro objeto "exporter" el "jasperPrint" (el reporte con datos) que
creamos anteriormente. La segunda lnea le dice al "exporter" cul ser el nombre del archivo
generado (en este caso "reportePDF.pdf"). Recuerden cambiar el nombre y la extensin del
archivo
cada
vez
que
cambiemos
de
formato.
La
ltima
lnea
es
la
que
realiza
el
proceso
de
exportacin.
Si ahora ejecutamos nuestra aplicacin veremos que en el directorio raz del proyecto se ha creado
un archivo llamado "reportePDF.pdf":
Por
lo
que
nuestra
prueba
ha
sido
exitosa
^-^.
Ahora, para que nuestro reporte sea exportado a formato HTML cambiamos la lnea:
por
Como pudimos ver, con un par de modificaciones pudimos hacer que nuestro reporte se generara
en un formato completamente distinto. Con el resto de los formatos es igual de simple. Usamos las
siguientes clases para generar los reportes en los siguientes formatos:
PDF: net.sf.jasperreports.engine.exportJRPdfExporter
HTML: net.sf.jasperreports.engine.exportJRHtmlExporter
CSV: net.sf.jasperreports.engine.exportJRCsvExporter
RTF: net.sf.jasperreports.engine.exportJRRtfExporter
XLS: net.sf.jasperreports.engine.exportJRXlsExporter
XML: net.sf.jasperreports.engine.exportJRXmlExporter
TXT: net.sf.jasperreports.engine.exportJRTextExporter
XLSX: net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter
DOCX: net.sf.jasperreports.engine.export.ooxml.JRDocxExporter
PPTX: net.sf.jasperreports.engine.export.ooxml.JRPptxExporter
Entre
muchos
otros
Para generar archivos .txt tendrn que agregar, adems, estas dos lneas:
^_^
exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH,
12);//text exporter
exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT,
12);//text exporter
conexion
DriverManager.getConnection("jdbc:mysql://localhost:3306/pruebareportes"
, "usuario", "password");
JasperReport
reporte
(JasperReport)
JRLoader.loadObject("reporte1.jasper");
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte,
null, conexion);
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT,
jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
java.io.File("reportePDF.pdf"));
exporter.exportReport();
}
new
Espero que este post, aunque algo largo, les sea de mucha utilidad. El los post siguientes ampliar
un
poco
la
forma
en
la
que
es
posible
trabajar
con
JasperRepots.
No
olviden
dejar
sus
dudas,
Saludos.
Descarga los archivos de este tutorial desde aqu:
Entradas Relacionadas:
Parte 6: Grupos
Parte 7: Subreportes
comentarios
sugerencias.