
En estos últimos días he estado jugando un poco con JasperReports, y de verdad que es muy sencillo hacer reportes, lo más dificultoso, es el encontrar documentación, los ejemplos que hay en Internet no están muy claros, y no abarcan todo lo que uno necesita saber, es por eso que me dediqué a realizar una búsqueda exhaustiva con respecto al tema.
En esta entrada, voy a explicar los conceptos básicos para hacer reportes, no voy a profundizar en todas las opciones, pretendo hacerlo más adelante, quiero presentar a grandes rasgos el proceso para generar un reporte en pdf.
Para comenzar es necesario descargar la última versión de esta herramienta, directamente desde la página del proyecto http://www.jasperforge.org/ para poder descargar es necesario registrarse en el sitio, así que regístrate rápidamente, luego en la página principal encontrarás varios proyectos, el primero de la lista es JasperReports, da clic sobre el link que dice downloads, descarga la última versión (1.3.4 es la actual), luego de esto aparecen archivos, algunos JARS, y un zip, el que tienes que descargar es el *-proyect.zip, de aproximadamente 35 MG.
Una vez que termine la descarga, descomprime el archivo, aquí hay varias carpetas, la que nos interesa es la que dice lib y dist, de la carpeta dist, sacamos el jar de jasperReport, creas un proyecto nuevo, en eclipse, netbeans, etc. creas una carpeta lib en tu nuevo proyecto, y pegas el jar, ahora copia los siguientes jars de la carpeta lib de jasperReports a la carpeta lib de tu proyecto.
bsh-1.x.x.jar
itext-1.x.x.jar
commons-digester.jar
commons-collections.jar
commons-login-1.x.x.jar
commons-beanutils.jar
commons-javaflow-20060411.jar
Es de suma importancia que copies todas estas librerías, y las agregues al classpath, de lo contrario el compilador te marcará errores pidiendo las librerías.
Una vez ya tengas en el classpath todas las librerías, vamos a crear nuestro primer reporte, uno muy sencillo, todavía no voy a mostrar como pasarle datos ni parámetros, el ejemplo de hoy solo imprimirá el hola mundo.
Para crear reportes el procedimiento es el siguiente, primero necesitas diseñar el reporte, esto lo haces con XML, es muy sencillo pues es semejante a diseñar una página XHTML, funciona manera semejante, una vez tengas listo el diseño del reporte lo guardas con extensión .jrxml, después necesitas compilar el XML y generar un archivo *.jasper, la compilación se hace una sola vez, luego ya que tienes el fichero.jasper, este lo cargas a memoria y le mandas los parámetros e información que quieres desplegar (Si es necesario), lo exportas al formato deseado y lo escribes en el disco.
Pues bien, eso es todo el procedimiento, sencillo no? la verdad es que en unas pocas líneas de código Java, haces todo el proceso. Una vez teniendo en mente el procedimiento completo, comencemos con el primer paso, el cual es diseñar el reporte en XML. Primero creamos un archivo llamado primerReporte.jrxml, luego escribes el siguiente código.
Esta es la cabecera del documento, aquí no hay mucho que explicar, simplemente que todos los reportes que diseñemos tienen que llevar esta cabecera.
Este es el nodo principal del documento y es obligatorio, dentro de este va toda la información que queramos desplegar, dividido en las siguiente secciones.
<background> - En esta seccion se puede poner cualquier cosa que quieras que aparesca por debajo de todas las otras seccion, esta sección es el fondo del documento.
<title> - El contenido de esta sección será impreso solo una vez al principio del reporte, como su nombre lo dice es el título que el reporte tendrá.
<pageHeader> - Esta sección será impresa en cada página que el reporte contenga, es la cabecera del reporte.
<columnHeader> - Esta sección se utiliza para poner la cabecera de la sección “detail”, en otras palabras el titulo de la información desplegada en el “detail”.
<detail> - En esta sección es donde se colocan la información a desplegar del reporte, es el cuerpo principal del reporte, generalmente en esta sección se despliegan tablas.
<pageFooter> - Esta sección el pie de página y es impresa al final de cada página del reporte, aquí puedes poner el número de página o alguna otra información.
Dentro de estas secciones es que se ponen etiquetas estáticas, dinámicas, líneas, imágenes, etc. es importante mencionar que todas estas secciones contienen la etiqueta <band>, que es donde la información está contenida, es obligatoria solo cuando necesitas ponerle contenidos a cualquiera de las cuatro secciones anteriores.
Suficiente teoría por ahora, es hora de seguir diseñando el reporte, para este caso dije que sólo imprimiría “Hola mundo” en el reporte, así que sólo voy a ocupar la sección detail, poner un texto estático especificándole las medidas y posición donde estará, el código final quedará así.
Aquí no hay mucho que comentar, excepto que el band debe tener especificado el alto que será, en este caso 20 (Las medidas son en píxeles), y que los objetos que contenga dentro de este, no deben superar esta medida, de lo contrario el compilador nos marcará un error, hasta este punto solo esta imprimiendo un texto estático, puedes hacer pruebas agregándole más textos y posicionándoles en lugares diferentes, no olvides que el height de los objetos, no deben superar los 20px que declaramos al band.
Una vez esta listo el diseño del reporte y guardado como primerReporte.jrxml es necesario crear una clase que continué con el procedimiento, el código de dicha clase es el siguiente.
Como puedes ver, el procedimiento es muy sencillo, primero compilamos el jrxml, para aplicaciones reales, esto lo haces solo una vez, y generas un archivo jasper, en esta ocasión no lo estoy generando, eso lo explicaré mas a detalle en futuras entradas, por ahora en el paso 1 se compila y se mantiene en memoria, en el paso 2 se le pasan tres parámetros a la función fillReport, el cual es el reporte, un HashMap con los parámetros y no se le pasa información, por ahora no le estamos pasando nada, en futuras entradas hablaré al respecto, este es solo una introducción, por último, en el paso 3 se exporta a pdf y se guarda en disco como holaMundo.pdf.
Solo basta correr la aplicación y ver los resultados, si has seguido los pasos al pie de la letra, no tendrás errores, al compilar el jrxml tarda un poco, pero es normal, es por eso que repito otra vez, que solo se hace una sola vez y se guarda el archivo compilado con extensión .jasper, en este caso no lo hacemos, pero sigue pendiente en este blog pues hablaré al respecto en un futuro no muy lejano.
Update 17 Enero 2008
Para facilitar el tutorial, ahora voy a proporcionar el código fuente para que lo puedas ver funcionando, es un proyecto configurado para eclipse.
Muy bueno
Holasn chico.. estuve leyendo tu web de jasper report y me quede igual.. no pude hacer ni un report,.. es q soy muy nueva en esto de reportes y struts y todo esto.. pordrias asyudarme???
Hola, sabes muy interesante tu articulo sobre JasperReport, te felicito. Pero me saltan un montón de dudas, la primera es que al investigar manuales y tutoriales sobre el tema siempre que creean un reporte lo hacen de una Base de Datos se puede hacer desde un bean o una collection de object?? te agradeceria mucho si tienes algo de información y la compartes conmigo. Saludos Manuel Méndez.
Buenas, tengo la siguiente duda a ver si alguien me puede ayudar, ya tengo una serie de reportes creados con el IREPORT, bien ahora muchos de estos tiene parametros, mi duda o mi problema es que tengo una pagina web en html y algunos detalles en java y necesito crear un link hacia estos reportes, como hago esto???
me marca un error al compilar el reporte..
Exception in thread “AWT-EventQueue-0″ java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:151)
ojala me puedan dar una idea de ke es lo que esta mal
@FER
El error es muy claro, el compilador te esta diciendo que no encuentra la clase Digester, segurametne no has agregado al classpath el commons-digester.jar
Agregalo y el error te desaparecera.
Saludos ![]()
Hola he probado el ejemplo descargándomelo e importándolo a eclipse 3.2 y me da el siguiente error.
net.sf.jasperreports.engine.JRException: Error compiling report java source files : C:workspaceProyectopruebasprimer_reporte_1208078803171_397718.java
…..
….
Caused by: java.io.IOException: CreateProcess: javac -classpath C:workspaceProyectopruebasbin;C:workspaceProyectopruebaslibbsh-1.3.0.jar;C:workspaceProyectopruebaslibcommons-beanutils-1.7.jar;C:workspaceProyectopruebaslibcommons-collections-2.1.jar;C:workspaceProyectopruebaslibcommons-digester-1.7.jar;C:workspaceProyectopruebaslibcommons-javaflow-20060411.jar;C:workspaceProyectopruebaslibcommons-logging-1.0.2.jar;C:workspaceProyectopruebaslibitext-1.3.1.jar;C:workspaceProyectopruebaslibjasperreports-1.3.1.jar C:workspaceProyectopruebasprimer_reporte_1208078803171_397718.java error=2
gracias por tu tiempo, y si puedes me dices algo.
Hola soy yo otra vez parace ser que la cosa estaba clara, he tenido que configurar el path para que apunte a c:jdkxxbin y pueda encontrar javac, no se porque no utilizaba el configurado en eclipse. un saludo.
Hola Crysfel!, explendido artículo, me está sirviendo de gran ayuda. Solo tengo un pequeño problema, ¿donde pongo el archivo jrxml?, me dice un FileNotFoundException: reporte.jrxml, el nombre esta correcto y lo tengo en la misma carpeta que el jsp, es que en lugar de hacer una clase e introducido el código dentro de un jsp. Muchisimas gracias, un saludo!
@Juan Carlos
Lo que necesitas hacer es pasarle el path completo del jrxml, es decir necesitas pasarle algo como esto “C:\\\\path\\atu\\servidor\\reporte\\reporte.jrxml”.
Algo como lo anterior debe de pasarle, para saber cual es el path donde esta tu proyecto, puedes utilizar la siguiente instruccion:
getServletConfig().getServletContext().getRealPath(”")
Esa instrucción te regresa un String con el path donde tu proyecto se esta ejecutando en el servidor, lo siguiente es concatenarle el jrxml.
saludos ![]()
Buenas tardes CrysFel, tengo que hacer un xml(con una estructuda distinta a la proporcionada por esta herramienta) a partir de otro xml, esta herramienta me lo permite? Yo de momento lo unico que consigo es un xml de salida con el formato ya preestablecido.Gracias
Saludos
Hola mi nombre es Enmanuel de Venezuela, necesito generar reportes de manera grafica si alguien tiene ejemplos que me los mande a mi correo killswitch077@hotmail.com o sannchiss@gmail.com gracias