Exportar Reportes Gráficos a Excel usando JasperReport

Anteriormente, había hecho mención de la posibilidad de generar archivos de Excel desde Java usando la librería POI. Sin embargo, al tratar de exportar gráficos ésta tarea me fue imposible de realizar, por esto, me vi en la necesidad de usar las librerías de JasperReport.

Para la exportación de gráficos a Excel, primero, se genera mediante una plantilla generada con la aplicación iReport (versión 1.3.3 para este tutorial), el cual no es más que un generador de plantillas para luego ser usadas en nuestra aplicación.

Para el presente tutorial realizaremos un reporte gráfico de la cantidad de Recomendaciones según su Estado por Tipo de Informe, para esto nuestra tabla estará formada de la siguiente manera.

tut0201_tabla.png

Los primeros dos campos guardan información del tipo de informe, los dos siguientes sobre el estado de la recomendación y el último guarda la cantidad de recomendaciones en sus diferentes estados. Se asemeja a una FactTable empleada en Data warehousing.

Así que antes de mencionar cómo hacemos la exportación empezaremos con la creación de la plantilla.

Creación de la Plantilla

  1. En el iReport seleccionamos Fichero > Nuevo Documento (Ctrl + N) y a continuación establecemos las configuraciones iniciales, como el tipo de hoja, la orientación, los márgenes, etc.

tut0202_property.png

  1. Después de realizar las configuraciones la plantilla nos quedará así.

tut0203_regions.png

 

  1. A continuación, vamos a modificar las bandas existentes en nuestra plantilla, para ello iremos a Ver > Bandas. Una vez allí, vamos a establecer la altura de “title”,”columnHeader”, “detail”, “columnFooter”, “pageFooter”, “lastPageFooter” y “summary” en 0.

tut0204_pageheader.png

A medida que vayamos estableciendo la altura, iremos pulsando el botón Aplicar, si no lo hacemos se perderá el valor de cada Banda.

  1. Luego de definir nuestra conexión (para más información pueden ver el manual de iReport) vamos a definir la consulta que poblará nuestro reporte. Para ello iremos a “Datos > Consulta de Informe” e ingresaremos la sentencia “select * from reporte_grafico”. Aseguremos que el IReport haya recuperado la definición de los campos como se ve a continuación:

tut0205_select.png

 

Luego de recuperado los campos debemos cambiar su tipo. Por defecto iReport considera que los números son de tipo java.math.BigDecimal necesitamos cambiarlos por java.lang.Integer. Para esto vamos a “Ver > Campos de Informe”.

  1. Ahora, vamos a crear un “Grupo” de nombre “Prueba” para ello vamos a “Ver > Grupos de Informe”.

tut0206_addparam.png

En vista de que vamos a mostrar un gráfico por cada tipo de informe vamos a enlazar el grupo con el campo NU_ID_TIPO_INFORME, en iReport las referencias a campos llevan el formato que se aprecia en el gráfico anterior. Tomar en cuenta que ya que no vamos a presentar registros sino un gráfico, no es necesario mostrar la cabecera y por ello la altura tiene por valor 0, mientras que al pie del grupo le hemos puesto el valor de 356. Hecho esto nuestra plantilla quedará de la siguiente manera:

tut0207_pruebafooter.png

  1. Ahora vamos a crear el gráfico para ello pulsamos el botón de Herramientas Gráficas tut0208_icon.png. Luego llevamos el puntero del ratón a la banda “PruebaFooter” y allí arrastramos el cursor a fin de determinar el tamaño de nuestro gráfico, automáticamente, se nos mostrará el siguiente cuadro en el que seleccionaremos el tipo de gráfico a crear.

tut0209_report.png

 

Para nuestro ejemplo seleccionaremos el gráfico de barras 3D y luego pulsaremos OK. La plantilla quedará de la siguiente manera.

tut0210_graphic.png

  1. Sobre la imagen haremos clic con el botón derecho del ratón, seleccionaremos la opción “Propiedades de Diseño” y luego la pestaña “Datos de la Gráfica”. Allí configuraremos los Reajustes de estilo y grupo.

tut0211_propgraphic.png

  1. Luego pasaremos a la pestaña “Detalles” y pulsaremos sobre la opción “Añadir”. Allí estableceremos la información que se mostrará en nuestro gráfico de la siguiente manera.

tut0212_datos.png

 

De esta forma le estamos diciendo al iReport que tome como serie el Estado de la Recomendación (si tomáramos el Tipo de Informe, aparecería un solo gráfico con la información de todos los tipos de informe y sus estados), el ID del estado irá en nuestro eje horizontal y la Cantidad de Recomendaciones determinará la altura de cada una de las barras.

  1. Ya para finalizar nuestra plantilla le agregaremos algunos parámetros (Ver > Parámetros de Informe), en este caso el título así como la información del período los enviaré desde la aplicación. También, un campo que nos mostrará la información del tipo de informe que será obtenido al momento de la consulta. La plantilla nos debe quedar así…

tut0213_final.png

  1. Bien, ahora que tenemos nuestra plantilla vamos a guardar la plantilla con el nombre “ReporteEjemplo.jrxml” en la raíz (C:\). Hemos terminado nuestra plantilla, no olviden probarla desde el mismo iReport para ver si puebla los datos.

A continuación, procederemos a indicar la manera de efectuar la exportación y la integración con nuestra aplicación. Antes que nada asegúrense de contar con las siguientes librerías en vuestra aplicación, si no las tienen pueden copiarlas de las librerías que se encuentran en la carpeta del iReport:

  • jasperreports-1.3.3.jar (o la versión que dispongan)
  • jasperreports-extensiones-1.3.1.jar
  • commons-digester.jar
  • commons-digester-1.7.jar
  • jcommon-1.0.0.jar
  • jfreechart-1.0.0.jar
  • jxl-2.6.jar

Primero, creamos un objeto de tipo HashMap el cual contendrá los valores de los parámetros definidos en nuestra plantilla.

   // se crea un HashMap como objeto que ALMACENARÁ LOS PARÁMETROS
   // que reciba la plantilla del reporte, en vista de que no enviamos
   // parametro alguno, solo se instancia el objeto.
   HashMap params = new HashMap();
   params.put("P_PERIODO",strPeriodo);
   params.put("P_TITULO","RESUMEN SITUACIONAL DE LAS RECOMENDACIONES POR TIPO DE INFORME");

A continuación, instanciamos un objeto de conexión a la base de datos.

   // Se obtiene la conexión que se empleará para poblar el reporte
   con = getFReportesOCI().connectionPool.getConnection();

Luego cargamos la plantilla..

   // Se obtiene la ruta fisica de la plantilla del reporte
   String strRutaPlantilla = “C:/”;
   String reportFile = strRutaPlantilla + "ReporteEjemplo.jrxml";

   // Cargamos la plantilla
   JasperDesign objJasperDesign = JRXmlLoader.load(reportFile);

La compilamos y poblamos la plantilla con los parámetros y le enviamos el objeto de conexión al base de datos.

   // Compilamos la plantilla
   JasperReport objJasperReport =
                     JasperCompileManager.compileReport(objJasperDesign);
   // Poblamos la plantilla con los datos de la BD y parametros
   JasperPrint objJasperPrint =
                       JasperFillManager.fillReport(objJasperReport, params, con);

Finalmente, instanciamos las clases que se encargarán de realizar la exportación y establecemos algunas propiedades

   // Instanciamos la clase exportadora
   JExcelApiExporter xlsExporter = new JExcelApiExporter();
   JRXlsExporter exporterXLS = new JRXlsExporter();

   xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT,
                                         objJasperPrint);
   xlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
                                         Boolean.TRUE);
   xlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
                                         “C:/archivo.xls”);

La primera y la última propiedad son obligatorias porque en ellas indicamos de qué tipo es el archivo desde el que hacemos la exportación y cual será el nombre del archivo de salida.

Para finalizar, les presento todo el código, nunca olviden cerrar la conexión luego de realizada la exportación, por ello lo pongo dentro de un “finally”.

// ---- Generando archivo XLS INICIO ---- //
try {

   // se crea un HashMap como objeto que ALMACENARÁ LOS PARÁMETROS
   // que reciba la plantilla del reporte, en vista de que no enviamos
   // parametro alguno, solo se instancia el objeto.
   HashMap params = new HashMap();
   params.put("P_PERIODO",strPeriodo);
   params.put("P_TITULO","RESUMEN SITUACIONAL DE LAS RECOMENDACIONES POR TIPO DE INFORME");
   // Se obtiene la conexión que se empleará para poblar el reporte
   con = getFReportesOCI().connectionPool.getConnection();

   // Se obtiene la ruta fisica de la plantilla del reporte
   String strRutaPlantilla = “C:/”;
   String reportFile = strRutaPlantilla + "ReporteEjemplo.jrxml";

   // Cargamos la plantilla
   JasperDesign objJasperDesign = JRXmlLoader.load(reportFile);
   // Compilamos la plantilla
   JasperReport objJasperReport =
                     JasperCompileManager.compileReport(objJasperDesign);
   // Poblamos la plantilla con los datos de la BD y parametros
   JasperPrint objJasperPrint =
                       JasperFillManager.fillReport(objJasperReport, params, con);
   // Instanciamos la clase exportadora
   JExcelApiExporter xlsExporter = new JExcelApiExporter();
   JRXlsExporter exporterXLS = new JRXlsExporter();

   xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT,
                                         objJasperPrint);
   xlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,
                                         Boolean.TRUE);
   xlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
                                         “C:/archivo.xls”);

   /* Antes de exportar verificamos que el archivo no exista
    * Crea un objeto File a fin de apuntar a la ruta que vamos a
    * almacenar */
   File objFile = new File(“C:/archivo.xls”);

   // Si el archivo existe...
   if (objFile.exists()) {
      // ...elimina el archivo y la variable apunta a 'null'
      objFile.delete();
      objFile = null;
   }

   // ...exporta!!!!
   xlsExporter.exportReport();

   // la variable flag se pasa a true para indicar que funcionó
   flag = true;
} catch (Exception e) {
   flag = false;
   e.printStackTrace();
   throw new Exception(e);
} finally {
   //pase lo que pase cierra la conexión
   if (con != null) {
      getFReportesOCI().connectionPool.free(con);
   }
}
// ---- Generando archivo XLS FIN ---- //

Ok, no olviden enviarme sus sugerencias, comentarios y/o correcciones para mejorar esta primera versión del tutorial.

~ por apiconz en Octubre 22, 2007.

19 comentarios to “Exportar Reportes Gráficos a Excel usando JasperReport”

  1. Muy bueno el tutorial, pero puedes hacer algo para que se vean las imagenes.
    Gracias

  2. Ya he corregido las imágenes de este Tutorial :D

  3. [...] Más Vistos Cómo generar Hojas de Excel en una aplicación JAVA usando Apache POIExportar Reportes Gráficos a Excel usando JasperReportHeroes (todos los espisodios en Pando)Procedimiento almacenado con consulta dinámicaJava: Convertir [...]

  4. En vista de que vamos a mostrar un gráfico por cada tipo de informe vamos a enlazar el grupo con el campo NU_ID_TIPO_INFORME, en iReport las referencias a campos

  5. Gracias al final he conseguido tener algún resultado, eso sí, he tenido que cambiar mi idea inicial de hacerlo desde la jsp directamente a usar un servlet, pero bueno, algo es algo.
    Gracias

  6. olas una pregunta as studiado en cibertec xq t me haces mui konocido d ahi kualkier cosa agregame xq tngo dudas con respeto s irreports gracias!!!!!!!
    muy bueno la pagina!!!!

    bye

  7. bueno, sip, soy ex-alumno de Cibertec :D

  8. gracias por tu publicacion me ha servido mucho solo esta q lo aplique con spring MVC de igual modo un muy buen trabajo muchas gracias

  9. Gracias por tomarse el tiempo de compartir sus conocimientos con nosotros, el ejemplo también me está funcionando correctamente, Saludos y nuevamente gracias.

  10. HOLA QUE TAL, ME PREGUNTABA TU SABES SI ES POSIBLE ABRIR UN REPORTE DE ESTE TIPO DESDE UN JSP Y TAL COMO SE LO ABRE UN UNA APLICACIÒN NORMAL SE LO PUEDA EXPORTAR A XLS, XML, PDF Y TODAS LAS OPCIONES QUE PERMITE EL JASPERREPORT
    TE AGRADECERÌA MUCHO TU RESPUESTA

  11. Alguien sabe como modificar el tamaño de los números que se muestran en las barras de los gráficos (Si hemos señalado mostrar etiquetas), que no se oculten y que el ancho de las barras siempre sea del mismo tamaño cuando tenemos varios gráficos en el mismo ireport.

  12. Alex, tengo tu mismo problema, no hay manera de modificar el tamaño de la etiqueta en un grafico (la etiqueta que aparece dentro de las barritas del grafico)

    ¿Alquien sabe cómo hacerlo?

    Muchisimas gracias

  13. oye disculpa me interesa mucho tu tutorial
    se te agredece mucho

    y quisiere que me pases si se pudiera el archivo fuente porfavor

    saludos y gracias

  14. Hola esta muy bueno el tutorial pero estoy teniendo problemas con mi gráfico de barras, en mi caso quisiera que en la barra vertical me muestre un numero de año, por ejemplo que inicia en 1980 y concluya en 2008 pero no he podido hacer esto, el gráfico se muestra bien pero no se como cambiar el rango que se muestra en los ejes X y Y

  15. Hola muy buen tutorial, tengo un problema, al realizar el reporte quiero abrir el archivo en la maquina cliente, con un servlet, pero no se actualiza el resource de tomcat, como hago para abrir el reporte desde la maquina client sin tener problemas?

  16. Se me tira el programa en la parte de

    JasperDesign objJasperDesign = JRXmlLoader.load(reportFile);
    y ta todo bien por que primero lo pruebo en el ireport y sale el grafico de mill maravillas pero cuando lo hago desde java se tira me dice que no conoce la libreria org.algomas.jfreereport AYUDA PO FAVOR URGENTE..

  17. Te haz asegurado de tener todos los jars con los que trabaja el Jasper? En particular, el que corresponde al JFreeChart?

  18. Hola muy bueno tu tutorial me podrías pasar el código fuente please please

  19. Me lo podrias mandar e mi correo rubi21_20@hotmail.com por favor

Escribe un comentario