reportes en java con jasperreports

Cómo crear reportes en formato PDF utilizando JasperReports y Jaspersoft Studio en Java

Hola que tal, en este tutorial vamos aprender a crear reportes en Java con JasperReports y Jaspersoft Studio.

JasperReports es un conjunto de librerías que permite crear reportes en Java, ya sea para entornos de Escritorio o Web y en diferentes formatos por ejemplo: PDF, HTML, XLS, CSV y XML.

Jaspersoft Studio es un editor gráfico que permite crear reportes de una forma sencilla, bien sea utilizando un Wizard arrastrando y soltando componentes o de forma personalizada.

Cual es la diferencia entre JasperReports y Jaspersoft Studio

Jaspersoft Studio es un entorno visual que permite diseñar reportes y que utiliza JasperReports para la generación de los mismos, ambas herramientas son de código abierto.

Universidad Java: Experto en Java de Cero a Master +64 horas

icon
icon

Descarga e instalación de Jaspersoft Studio

La descarga de Jaspersoft Studio la debes realizar desde su sitio oficial Descarga de Jaspersoft Studio.

reportes en Java con JasperReports

Como podrás ver la versión de Jaspersoft  Studio es la 6.3.1 y se encuentra para varias plataformas, para el ejemplo voy utilizar la versión para Windows 10.

Tener en cuenta que antes de la descarga de pedirá un registro.

La instalación para Windows se resumen en un par de clicks, la cual no voy entrar a detalle por la facilidad de la misma.

Antes de empezar a crear reportes en Java con JasperReports, debemos crear una base de datos y una tabla de la cual vamos a obtener los datos para el reporte.

Cómo crear la base de datos

Ahora creamos la base de datos ESCUELA la misma que debe ser creada en MySQL para esto dejaré el siguiente script que lo puedes ejecutar desde la consola pura de MySQL o con la ayuda de alguna herramienta como por ejemplo phpMyadmin, MySQL Workbench o cualquier otra que utilices.

Una vez creada la base de datos junto a la tabla ALUMNOS, lo siguiente que vamos hacer es, insertar registros en la tabla de manera que podamos mostrar información en el reporte.

Crear la conexión desde JasperSoft Studio a la base de datos MySQL

La primera vez que inicies JasperSoft Studio te mostrará una pantalla de bienvenida, la cual debes cerrar de manera que te permita crear la conexión con MySQL.

En la pestaña Data Adapter das click derecho y escoges la opción Create Data Adapter, como se muestra en la imagen.

reportes en Java con JasperReports

Lo siguiente que debes hacer es escoger la forma de como obtener los datos desde la base, puesto que lo vamos hacer a través de JDBC, vas a elegir la opción Database JDBC Connection.

reportes en Java con JasperReports

Ahora debes agregar los parámetros para la conexión, por ejemplo el nombre de la conexión, la forma de conectarse, (punto 2 en la siguiente imagen), nombre de la base de datos etc.

No olvides cambiar el nombre de usuario y la clave del servidor de MySQL o el nombre de la base, en el caso que hayas puesto otro nombre, en mi caso es escuela, de acuerdo al script anterior.

De todas formas los parámetros de conexión son los siguientes:

Name: Corresponde al nombre de la conexión, puede ser cualquier nombre, pero por lo general es recomendable poner algo relacionado a la base de datos a la que nos vamos a conectar.

JDBC Driver: Se refiere al modo de conexión.

JDBC Url: Es la cadena de conexión, localhost, se refiere a que nuestra máquina funciona como servidor de base de datos, si la base estuviera alojada remotamente debes poner la dirección de IP de la máquina donde se encuentra.

Username: Nombre del usuario de MySQL, por lo general suele ser root (aunque no es recomendable).

Password: Clave del usuario de tu base de datos.

reportes en Java con JasperReports

Puesto que nos vamos a conectar a través de JDBC, debes agregar un Driver de conexión para MySQL, sino lo tienes lo puedes descargar desde el siguiente enlace: Descarga de Driver JDBC para MySQL, es el segundo recurso que se encuentra en formato ZIP.

Descargas el driver de conexión y lo descomprimes.

Sino está del todo claro puedes ver Como conectarse a Mysql desde Java donde te explico más a fondo la descarga del driver.

Bien, asumiendo que ya tienes descargado el driver de conexión, debes ir a la pestaña Driver Classpath (opción 6 de la imagen anterior), en esta pestaña vas agregar el driver de acuerdo a la siguiente imagen.

reportes en Java con JasperReports

Debe quedar como se muestra a continuación:

reportes en Java con JasperReports

Posterior a esto debes hacer un Test (paso 1) para comprobar que la conexión es satisfactoria y luego el paso 2 de la imagen anterior.

Si tienes algún error, verifica el nombre de la base de datos, clave y usuario que sean correctos.

Esta es la imagen como te debería quedar al final:.

reportes en Java con JasperReports

Cómo crear reportes en Java JasperReports y Jaspersoft Studio utilizando el Wizard

Cuando se crea un reporte utilizando el Wizard por lo general se utiliza una plantilla prediseñada para el reporte así mismo internamente se creará el Query para la consulta.

Algo que acotar es que esta plantilla también se la puede modificar una vez terminado el reporte, por ejemplo si quieres cambiar tipos de letra, tamaño de letra, colores etc.

Para crear un reporte utilizando el Wizard hacemos lo siguiente.

Se asume que tienes abierto Jaspersoft Studio.

File->New-> Jasper Report, como se ve en la imagen:

Entendiendo las Expresiones Lambda paso a paso

En esta parte debes elegir la plantilla con la que mejor te sientas a gusto.

En la parte izquierda encuentras las categorías y en la parte derecha, las plantillas que pertenecen a esa categoría, hay un sin número de plantillas a nivel de diseño que puedes utilizar, en este ejemplo he utilizado la plantilla Invoice.

reportes en Java con JasperReports

Aquí lo único que das es el nombre del reporte, yo le di el nombre de ReporteAlumnos,jrxml

Algo importante a tener en cuenta, los reportes en Jaspersoft Studio, se crean con la extensión .jrxml, cunado un reporte es compilado crea un archivo con la extensión .jasper, éste es el que sirve y que se lo puede llamar desde el código Java.

reportes en Java con JasperReports

En esta parte se define el Query para extraer los datos de la tabla o de las tablas.

Lo primero que se elije es la conexión a la base de datos que se va utilizar paso 1.

En la parte inferior derecha hay 3 pestañas Text, Outline, Diagram, y te permite definir el Query o consulta que vas a utilizar, para hacerlo más fácil debes seleccionar la pestaña Diagram.

Luego elijes la base de datos, en este caso se llama escuela, posteriormente en la sección Table elijes la tabla o tablas que vayas a utilizar y las arrastras a la parte derecha y seleccionas los campos que vayas a mostrar, en la imagen dejo la secuencia de pasos de lo que debes realizar.

Una vez echo esto puedes seleccionar la pestaña Text y te darás cuenta que se generó el select para la tabla que queremos mostrar.

Continuas con Next. 

reportes en Java con JasperReports

En esta imagen pasas los campos que vas a mostrar ya en la tabla, los campos se encuentran en la parte izquierda, realizando el paso 1 pasas todos los campos a la parte derecha.

Si sólo deseas pasar ciertos campos lo puedes hacer de uno en uno utilizando el primer botón (operador mayor que).

Por último realiza el paso 2.

reportes en Java con JasperReports

Si todo ha ido bien te mostrará algo parecido a la siguiente imagen, este es nuestro ansiado reporte jeje.

Como te darás cuenta lo que en verdad nos interesa son los campos de la base de datos y por ahí una que otra cosa como por ejemplo, algunos campos para poner los datos de la empresa, el campo de la fecha, logo, aquí puedes modificar la plantilla como tu desees.

reportes en Java con JasperReports

Lo que ahora nos interesa es cómo compilar nuestro reporte para que se lo pueda llamar desde una aplicación Java.

Bueno antes de eso también nos importa conocer las pestaña de la parte inferior del reporte que están enumeradas desde el uno hasta el tres.

  1. Design: Esta pestaña mantiene al reporte en modo diseño de manera que podemos modificar cualquier cosa a nivel de diseño, así como también a nivel de back end, es decir el Query, esta parte la mostraré mas adelante.
  2. Source: Muestra por decirlo así, el código del reporte, que no es más lenguaje XML.
  3. Preview: Como su nombre lo dice, es la visualización del reporte.
  4. Por último y no menos importante, el área donde se encuentra el número cuatro. Esta consola muestra información de compilación, errores, entre otras cosas. Es muy importante a la hora de depurar errores.

Modificando algunas cosas del reporte

Si bien es cierto hemos visto lo más importante, pero muchas de las veces se necesita hacer algunos cambios más sobre el reporte como por ejemplo cambiar el Query de la consulta, poner el número de registros en la consulta entre otras cosas, y no voy ha entrar de lleno a esto pero si trataré lo más importante.

Compilar el reporte

Con lo visto hasta ahora no sirve de mucho tener el reporte, claro que hemos echo bastante, pero para que un reporte pueda ser invocado, llamado desde Java o como se le quiera llamar, se necesita compilar el archivo hasta tener un archivo con extensión .jasper.

Entonce para compilar realizamos los siguientes pasos, en realidad es muy sencillo, basta con dar un click en la parte del recuadro en negro.

REPORTES EN JAVA CON JASPERREPORTS

Al compilar se genera un archivo ReporteAlumnos.jasper.

Para saber donde se guardó el archivo anterior puedes ir a Project->properties y luego en la pestaña Resources, ahí te aparecerá la ruta donde se guardó el archivo.

Otras funciones que también encontramos en la imagen anterior es la del Zoom, configuración de vista (Settings) y otra opción en la que pública tu reporte en el servidor. Sobre esta opción no se mucho es nueva para mi.

Modificar la consulta del reporte

Varias veces se da que se necesita cambiar la consulta del reporte cuando ya está creado, por ejemplo añadir o quitar campos, si esto te ocurre puedes seguir los pasos.

Java EE: Desde cero a Experto (EJB, JPA, Web Services, JSF)

icon
icon

Primero debes dar click sobre el botón dentro del borde de color negro, posteriormente se te presentará una pantalla, donde puedes cambiar la conexión, cambiar la base de datos, las tablas, lo puedes hacer bien sea de forma gráfica (Sección Diagram) o a través de comando SQL (pasos 2) , el área donde está el número tres, te muestra cada campo que retorna de la base de datos con su respectivo tipo de dato.

REPORTES EN JAVA CON JASPERREPORTS

Otros elementos del reporte

Ahora te voy ha mostrar la paleta de Jaspersoft Studio, así mismo la separado por áreas:

REPORTES EN JAVA CON JASPERREPORTS

El área numerada con uno, muestra los elementos básicos para el diseño de un reporte, por ejemplo etiquetas, cajas de texto, si quisieras crear subreportes, etc.

Esta parte ya es cuestión de empezar arrastrar y soltar elementos, para ver como se comportan y para que sirven.

Luego se muestra otros elementos pre diseñados, por ejemplo si quieres poner la fecha en el reporte, la hora, el número total de registros, etc.

Por último están las propiedades de los elementos que están actualmente en el reporte.

No olvides que cada vez que hagas un cambio debes volver a compilar el reporte para que se vean reflejados los cambios en el archivo .jasper que se genera.

Por esta vez no centramos en la creación del reporte, como obtener los datos desde la MySQL y como llamar al reporte desde Java, en un próximo tutorial veremos como hacer cambios en el diseño, modificar el tipo de letra etc..

Cómo llamar a un reporte desde una aplicación Java

Para que una aplicación Java pueda llamar a un reporte debes descargar varias librerías que se encuentran en distintos sitios pero para tu mayor comodidad las he dejado en un sólo lugar para que las descargues (incluye el conector MySQL) Librerías para generar reportes Jasperreport en Java.

La estructura del proyecto debe quedar como se muestra a continuación, recuerda que debes tener una conexión a la base de datos y añadir cada librería al Build Path del proyecto, click derecho sobre cada librería->Build Path -> Add.

estructura-del-proyecto-con-librerias-jasperreport

En el siguiente ejemplo muestro como llamar al reporte, que tiene que estar previamente creado.

Conexión a la base de datos.

En el primera ejemplo el reporte se descarga en la misma carpeta del proyecto, con la segunda forma se muestra en una ventana independiente de la cual puede ser descargado.

Finalmente este es código para llamar a los reportes, no olvides que el reporte debe estar compilado en otras palabras debe estar con extensión .jasper.

En un próximo tutorial veremos como crear subreportes y como enviar parámetros de consulta desde código Java.

Hasta pronto!!! Nos vemos en la próxima entrada.

Si quieres empezar el tema de programación Web con Java, puedes revisar los siguientes enlaces:

Opt In Image
Programación Web Full Stack
Suscríbete ahora y recibe los mejores contenidos sobre Programación Web en tu correo.

Tus datos estarán protegidos y 100% libre de Spam

Full Stack Developer, JavaScript, PHP, Java, Spring, Laravel, Vuejs, Blogger, aprendiendo y compartiendo conocimientos. Cursos de Programación Web en: https://programacionfullstack.com/

Artículos Recomendados

24 Thoughts to “Cómo crear reportes en Java con JasperReports y Jaspersoft Studio”

  1. Susana

    Hola,
    Muy bueno el tutorial.
    No tengo mucha experiencia en java, y deseo hacerte una consulta respecto de un error que obtengo.
    Desarrolle una aplicacion web con jsp y servlets en java 8.
    Genere el reporte desde jasperreports 6.3.0
    Inclui en mi servlet el codigo tuyo.
    Se ejecuta sin error, pero el pdf creado no se puede abrir.

    Tienes idea de lo que esta mal ?
    Tu ejemplo es para mostrar con reportviewer. Tienes alguno para web ? Tal vez ahi esta el problema ?

    Muchas gracias por tu ayuda.
    Susana

    1. Susana

      Hola, soy Susana nuevamente.
      Lo he resuelto con el siguiente código, que dejo por si le sirve a alguien:

      response.setHeader(“Content-Disposition”, “attachment; filename=\”Klienten.pdf\”;”);
      response.setHeader(“Cache-Control”, “no-cache”);
      response.setHeader(“Pragma”, “no-cache”);
      response.setDateHeader(“Expires”, 0);
      response.setContentType(“application/pdf”);
      ServletOutputStream out = response.getOutputStream();

      try
      {
      String ru= getServletContext().getRealPath(“WEB-INF/Cherry.jasper”);
      JasperPrint jasperPrint = JasperFillManager.fillReport(ru, null, ReportConnectionFactory.conectar());
      OutputStream outStream = response.getOutputStream();
      JasperExportManager.exportReportToPdfStream(jasperPrint, outStream);

      }
      catch (Exception e)
      {
      e.printStackTrace();
      }

      1. Elivar Largo

        Hola Susana, mil disculpas, estaba un poco ocupado que no había podido responder a tiempo y si, la razón por la que no te servía el código es porque el entorno de escritorio y web son totalmente diferentes además que el ejemplo sólo permitía la vista con reportviewer y no descarga, por último gracias por compartir tu código de seguro a alguien le va ayudar. Saludos!!!

  2. Juan

    Saludos Excelente Trabajo me ayud mucho.. me puedes apoyar para hacer un reporte con imagenes ya sea desde base de datos o con path, saludos

    1. Elivar Largo

      Si te refieres a como poner imágenes en un reporte, sólo arrastras la etiqueta imagen desde la parte superior, das click derecho en propiedades, en la pestaña imagen pones la ruta donde está la imagen que quieres utilizar, por ejemplo, para windows: “C://Documentos//Descargas//nombre_imagen.jpg” en linux sólo con \. Saludos..

  3. como crear subreportes y como enviar parámetros de consulta desde código Java

    Elivar, puedes indicar si ya publicó “como crear subreportes y como enviar parámetros de consulta desde código Java”, sus aportes son claros y concisos

    1. Elivar Largo

      Gracias por el comentario, todavía no está publicado, he estado un poco full, espero sacar un tiempo para hacerlo en los próximos días.

  4. Gracias me has ayudado bastante, bien explicado, y por otros topan el error de grooby , en ireport en propiedades del reporte cambien la opcion languaje: grooby por languaje: java

    1. Elivar Largo

      Gracias por tu aporte. Saludos

  5. Saludos cordiales

    Tengo un pequeño problema, diseñé un reporte con jaspersoft en el Ide funciona correctamente se lo ve perfecto….sin embargo el lanzarlo a producción en el navegador las letras se cambian de tamaño..

    Por favor ayuden…

    1. Elivar Largo

      Que tal Geovanny, la verdad no me ha pasado, de pronto lo has probado en todos los navegadores a ver si el resultado es el mismo?. Si ya encontraste la solución no dudes en publicarla de seguro a alguien que se pasa por el blog le ayuda. Saludos..

  6. Miguel

    Saludos, muy buen trabajo, de bastante ayuda.

    Si te es posible podrias hacer un ejemplo de como generar el reporte en una nueva pagina web y no en la misma de donde se lo llama.

    Gracias de antemano

    1. Elivar Largo

      Hola Miguel, para un sistema web el código cambia un poco, pero espero contar con el tiempo para subirlo. Saludos

  7. Hugo

    Muy buen tutorial… de los pocos que permiten hacer un reporte llevandote de la mano, pero tengo una consulta… es posible integrar jasperReport y/o jasperStudio en otro Ide como por ejemplo intelliJ

    1. Elivar Largo

      Hola Hugo, siempre he usado JasperStudio digamos como un entorno aparte, para eclipse se que existen plugins pero lo ponen muy pesado y por eso siempre lo trabajo aparte. La verdad no he usado intelliJ no te podría aportar con nada.
      Por cierto gracias por pasarte por el blog, un saludo.

  8. zartos

    Amigo elivar , tengo problemas la pasar un parametro al subreporte, tengo el plugin del jasper en el eclipse, y en la perspectiva del jasper si me funciona todo correctamente, en el codigo java lo mando llamar desde un boton, mando llamar al padre pero al parecer no me inyecta el parametro en el subreporte (tomo como parametro un campo del reporte padre para que me llene la consulta del subreporte)

    1. Elivar Largo

      Sería bueno saber algo referente al error, de pronto no estás enviando el parámetro en las propiedades del sub reporte (en el reporte padre)

  9. Juan CArlos

    Hola Elivar, disculpa que te moleste tengo un problema al momento de generar un reporte desde la aplicación no se despliega, estoy enviando como parámetros fechas de inicio y fin, lo mas raro es que al momento de exportar a un pdf, excel, etc. funciona correctamente, se descargar el reporte y se visualiza todo correctamente.
    Al probar en el navegador con la ruta en el siguiente error me sale:
    1) Esta página no funciona
    Si el problema persiste, ponte en contacto con el propietario del sitio web.
    HTTP ERROR 400

    PDF.js v1.0.21 (build: f954cde)
    Message: Unexpected server response (400) while retrieving PDF “http://localhost:8080/erp-web/pages/report/viewer.html?reportUnitName=geren0001&paramsAsJsonString={“p_fechafin”:{“valor”:”27/06/2017″,”tipoDato”:”DATE”},”p_titulo”:{“valor”:”Historial+de+Compras”,”tipoDato”:”STRING”},”p_fechaini”:{“valor”:”01/01/2014″,”tipoDato”:”DATE”}}&pfdrid_c=false&uid=7fd44f25-9281-4a34-abfe-b610e4674f26″.

    1. Elivar Largo

      Hola Juan Carlos, no se como tienes tu código pero intenta poner esto en el response de tu código, esto te debería dejar ver el reporte en el navegador, espero te sirva. Saludos
      response.setContentType (“aplicación / pdf”);
      response.setHeader (“Content-Disposition”, “inline”);

  10. Sergio Figueros

    Saludos Elivar, espero me puedas orientar, tengo un proyecto de facturación en Java Web GWT, y el problema es que hago una factura (procesos de entrada/salida de la BD todo bien) al momento de hacer ventas en varias terminales todo funciona bien, el problema aparece cuando las transacciones son totalmente simultaneas, ya que todo en la bd sale bien, pero el archivo jasper, muestra la misma factura en todas las terminales, he llegado a la conclusión que es problema del jasper, así que he intentado como ejecutarlo de diferentes maneras y el código que ustedes presentan funciona a la perfección, ahora bien, que opinas que puede estar pasando con mi código original? o bien, según tu código como puedo hacer que en vez de visualizar el archivo, lo descargue de forma automática y solo refresque mi pagina actual?

    desde ya gracias por tu tiempo.

    1. Hola Sergio, el tema al parecer es algo de concurrencia pero si mencionas que en la DB todo están bien ósea se guardan las transacciones de acuerdo a la terminal correctamente pensaría que es algo que tiene que ver con tu código básicamente con la consulta que haces a la base de datos, no se cómo estará parametrizado tu proyecto de todas maneras revisa la consulta puede ser que el mismo usuario que hace una transacción, cuando ejecuta el reporte en la consulta es posible que pueda acceder a la de todas las terminales y por eso sale el mismo reporte en todas, bueno el tema creo que va por ahí, la otra forma de saber es usando el log al momento de hacer las transacciones simultaneas y replicando la información por ejemplo usuario y id de la transacción ahí podrías tener idea de que está pasando realmente. Saludos

  11. Luis

    Elivar, excelente aporte, se te agradece. Una colsulta: como crear un reporte sin coneccion a una bbdd, pasando la informacion directamente desde un formulario. Tienes algun tutorial al respecto….Muchas gracias de antemano. Saludos cordiales

    1. Hola Luis, no he realizado lo que tu dices, sin embargo podrías pasarle la información como parámetros y mostrarla en el reporte aunque no se hasta que punto sea factible. Saludos

Dejar un Comentario