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.
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
- 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.
- Después de realizar las configuraciones la plantilla nos quedará así.
- 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.
A medida que vayamos estableciendo la altura, iremos pulsando el botón Aplicar, si no lo hacemos se perderá el valor de cada Banda.
- 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:
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”.
- Ahora, vamos a crear un “Grupo” de nombre “Prueba” para ello vamos a “Ver > Grupos de Informe”.
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:
- Ahora vamos a crear el gráfico para ello pulsamos el botón de Herramientas Gráficas
. 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.
Para nuestro ejemplo seleccionaremos el gráfico de barras 3D y luego pulsaremos OK. La plantilla quedará de la siguiente manera.
- 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.
- 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.
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.
- 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í…
- 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.

Muy bueno el tutorial, pero puedes hacer algo para que se vean las imagenes.
Gracias
Ya he corregido las imágenes de este Tutorial
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
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
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
bueno, sip, soy ex-alumno de Cibertec
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
Gracias por tomarse el tiempo de compartir sus conocimientos con nosotros, el ejemplo también me está funcionando correctamente, Saludos y nuevamente gracias.
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
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.
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
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
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
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?
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..
Te haz asegurado de tener todos los jars con los que trabaja el Jasper? En particular, el que corresponde al JFreeChart?
Hola muy bueno tu tutorial me podrías pasar el código fuente please please
Me lo podrias mandar e mi correo rubi21_20@hotmail.com por favor
oye que buen material, por cuestiones del destino yo no puedo generar la plantilla, genere una para reportes sin grafica, cambia mucho una plantilla con garfica? que tanto? podrias postearla?
esta es la mia, como vez? algo en especial que agregar para generar la grafica?
<![CDATA[
query!!!!
no salio el xml…
bueno en realidad es uno muy sencillo, solo le paso algunos parametros, formo un query, y precento los resultados, despues genero un pdf
ya salio, solo que me salen 2 graficas, a que se debera?
mi estimado tengo el mismo problema me salen dos graficas al crear mi excel o mi html, tu pudiste solucionar esto..
Hola, baje las librerias del iReport que segun dicen son para trabajar con el net beans, pero no se de que forma se le agregan eseo pluggins al net beans. Agradeceria cualquier sugerencia.. Gracias
holap puesde agregar los plugins de dos formas la primera ve a tools luego a plugins y en Downloaded y le das Add plugins y alli busca la carpeta donde los tienes y estos deben estar en formado *nbm la otra forma de agregar plugins es por librerias bueno espero te sirva
…gracias por la ayuda
Excelente aporte amigo, tarde dias en saber como exportar un reporte a excel hasta que me tope con esta pagina. SE TE AGREDECE, NO SABES DEL APURO QUE ME ACABAS DE SACAR
Hola como estas, oye he seguido tu tutorial al pie de la letra, solo que he tenido un problema al momento de la exportacion a Excel ya que si me trae la plantilla, no me marca nigun error y me aparecen los parametros que le mando, pero no me aparece la grafica, ya la probe en el ireport y si aparece todo bien pero en el archivo .xls que genera no se la trae, tu codigo lo puse en una jsp no se si eso tenga algo que ver con que no se traiga la imagen y el .jasper y el .jrxml estan en la misma carpeta que mi jsp, espero que me puedas ayudar, te agradezco de antemano!!
Brother ta chevre tu tuto pero quisiera saber si se podia hacer con eclipse esto?
… ciertamente, se puede realizar este tutorial con cualquier ide, es solo cuestión de configurar nuestro proyecto para que haga uso de los jars correspondientes.
Gracias por la explicación de JExcelAPIExporter, me salvo de un problema de corrupción de archivos de excel utilizando el exportador de jasper que utiliza POI, ahora todo va de 10.
Buenas tardes, la presente es para saber sipuede exportar un reporte de ireport en xml ( como seria el codigo en java para q el reporte me salga en xml?
Buenas dias, la presente es para saber sipuede exportar un reporte de ireport en xml ( como seria el codigo en java para q el reporte me salga en xml?
ciertamente, el formato de cada plantilla viene como jrxml el cual es un xml en sí, a menos que te refieras al resultado del reporte..
holas!!! kisiera saber si hay alguna forma de mostrar estos reporte en la web …… en un jsp!!
salu2!!!!
… tengo entendido que la librería o mejor dicho la aplicación iReport te da la opción para exportar estos informes y mostrarlos en web.
xvr broth m ayudastes bastante (Y)
hola me parece muy bien tu tutorial, pero tngu¿o una duda, para que usas el objeto
“JRXlsExporter exporterXLS = new JRXlsExporter();”