icono_twiter
Jose Manuel Sánchez Suárez

Consultor tecnológico de desarrollo de proyectos informáticos.

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2011-08-02

Tutorial visitado 13.821 veces Descargar en PDF
Exportación del contenido de un dataTable de JSF con el soporte de Primefaces.

Exportación del contenido de un dataTable de JSF con el soporte de Primefaces.


0. Índice de contenidos.


1. Introducción

Toda librería de componentes JSF que se precie proporciona un componente que permite la exportación del contenido de un dataTable a distintos formatos, la que menos a csv y la que más a excel y pdf.

Lo ideal es disponer de un componente visual al que se parametrice el id del dataTable a exportar y que él mismo haga todo el trabajo de lectura del contenido del dataTable (con lo que no tenemos que preocuparnos por el formato de los datos en las columnas), realice la conversión al formato de exportación deseado y pronponga la descarga del fichero.

Se hace también imprescindible que, en el caso de la exportación a excel y pdf, el componente permita la configuración del formato del informe: permita modificar formato de fuentes, ancho de columnas, cabeceras; en el caso de pdf la inclusión de una cabecera y pie de página, imágenes, título,...

En este tutorial vamos a analizar el soporte que proporciona primefaces a través del componete dataExporter para llevar a cabo dicha exportación a excel y pdf, así como las posibilidades de configuración de dichos formatos.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 17' (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.1
  • Primefaces 2.2.1
  • JSF 2 - Mojarra-2.0.3

3. Configuración.

Para disponer del soporte a la exportación a excel y pdf del componente dataExporter de Primefaces debemos incluir en nuestras dependencias las librerías que usa el framework para llevar a cabo dicha exportación. Haciendo uso de maven, bastaría con incluir lo siguiente en nuestro pom.xml:

	<dependency>
		<groupId>com.lowagie</groupId>
		<artifactId>itext</artifactId>
		<version>2.1.0</version>
	</dependency>

	<dependency>
	    <groupId>org.apache.poi</groupId>
	    <artifactId>poi</artifactId>
	    <version>3.2-FINAL</version>
	</dependency>

4. Exportación a Excel.

Para llevar a cabo la exportación a excel del contenido de un dataTable con el componente dataExporter, basta con incluir lo siguiente en nuestro fuente:

<h:commandLink id="reportXls">
	<h:graphicImage value="#{pageContext.contextPath}/style/images/xls.png" /> 
	<p:dataExporter type="xls" target="cars" fileName="carsReport" encoding="ISO-8859-1" />
</h:commandLink>
<p:dataTable id="cars" var="report"
			value="#{adminView.cars}" ...

En el atributo target del componente dataExporter asignamos el identificador de nuestro dataTable y, adicionalmente, podemos parametrizar el nombre que tendrá el fichero de descarga y el encoding de los datos que contiene el dataTable, por defecto UTF-8.

Si necesitásemos modificar el formato del fichero excel para, como proponen en el showcase de Primefaces, cambiar el color de la cabecera de la hoja (de la primera fila), podríamos incluir un atributo postProcessor que apunte a un método de un managed bean como sigue "#{dataExporterFilter.postProcessXLS}" y en el podríamos incluir el siguiente código:

	
	public void postProcessXLS(Object document) {
		final HSSFWorkbook wb = (HSSFWorkbook) document; 
		final HSSFSheet sheet = wb.getSheetAt(0); 
		final HSSFRow header = sheet.getRow(0);
		final HSSFCellStyle cellStyle = wb.createCellStyle(); 
		cellStyle.setFillForegroundColor(HSSFColor.BRIGHT_GREEN. index);
		cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		for(int i=0; i < header.getPhysicalNumberOfCells();i++) {
			((HSSFCell) header.getCell(i)).setCellStyle(cellStyle);
		}
	}
	

Como hemos incluido en las dependencias de nuestras liberías, se utiliza poi para la exportación a excel con lo que hay que llevar a cabo la transformación haciendo uso del api de dicha librería.


5. Exportación a Pdf.

De la misma forma que exportamos a excel podemos exportar a pdf con el siguiente código en nuestros fuentes:

<h:commandLink id="reportXls">
	<h:graphicImage value="#{pageContext.contextPath}/style/images/pdf.png" /> 
	<p:dataExporter type="pdf" target="cars" fileName="carsReport" encoding="ISO-8859-1" />
</h:commandLink>
<p:dataTable id="cars" var="report"
			value="#{adminView.cars}" ...

Comparado con el código anterior, solo hemos modificado el tipo de formato y la ruta a la imagen que mostrará en enlace para la descarga.

Y, del mismo modo, podemos hacer referencia a métodos de un managed bean para modificar el formato del pdf que se generará, antes de procesar el contenido del dataTable y después.

<h:commandLink id="reportXls">
	<h:graphicImage value="#{pageContext.contextPath}/style/images/pdf.png" /> 
	<p:dataExporter type="pdf" target="cars" fileName="carsReport" encoding="ISO-8859-1"
		preProcessor="#{dataExporterFilter.preProcessPDF}" postProcessor="#{dataExporterFilter.postProcessPDF}"  />
</h:commandLink>
<p:dataTable id="cars" var="report"
			value="#{adminView.cars}" ...

Así podríamos realizar, por ejemplo, las siguientes modificaciones en el formato del pdf:

	public void preProcessPDF(Object document) throws IOException, DocumentException {

		final Document pdf = (Document) document;
		
		pdf.setPageSize(PageSize.A4.rotate());
		pdf.open();  
	    
		PdfPTable pdfTable = new PdfPTable(2);
		pdfTable.addCell(getImage("autentia.png"));
		pdfTable.addCell(getImage("adictos.png"));

		pdfTable.setWidthPercentage(40f);
		pdfTable.setHorizontalAlignment(0);
		pdf.add(pdfTable);
		
		final Phrase phrase = new Phrase("Informe");
		
		pdf.add(phrase);
	}

	public void postProcessPDF(Object document) throws IOException, DocumentException {
		final Document pdf = (Document) document;
		pdf.setPageSize(PageSize.A4.rotate());
		
	}
	
	private Image getImage(String imageName) throws IOException, BadElementException {
		final Image image = Image.getInstance(getAbsolutePath(imageName));
		image.scalePercent(90f);
		return image;
	}

	private String getAbsolutePath(String imageName) {
		final ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
		final StringBuilder logo = new StringBuilder().append(servletContext.getRealPath(""));
		logo.append(File.separator).append(IMAGE_FOLDER);
		logo.append(File.separator).append(LOGOS_FOLDER);
		logo.append(File.separator).append(imageName);
		return logo.toString();
	}

Como hemos incluido en las dependencias de nuestras liberías, se utiliza itext para la exportación a excel con lo que hay que llevar a cabo la transformación haciendo uso del api de dicha librería.

Con todo lo anterior hemos:

  • modificado el tipo de página para mostrarla apaisada,
  • incluido una tabla con dos imágenes en el comienzo del documento, e
  • incluido un título en la cabecera.

Aún así, no hemos podido, o sabido:

  • eliminar el borde a la tabla de las imágenes,
  • ni hemos podido redimensionar, cambiar el formato de fuente o eliminar los bordes de la tabla que incluye el contenido del dataTable. Revisando el código fuente del componente de exportación, está puesto "a fuego" el tipo de fuente Times Roman y el tamaño de letra y, al parecer, no se puede modificar ni la gente de Primefaces está pensando en que se pueda parametrizar.

Con ello, el resultado del formateo no ha sido el deseado y no es presentable, puesto que se muestra totalmente descuadrada la cabecera en relación al contenido del dataTable, que no se expande al ancho de la página.

Además, nos hemos encontrado con que, si en el contenido de las columnas se incluye un panelGroup no se imprime el contenido del mismo, sino el toString() de este; el componente dataExporter no profundiza en el árbol para pintar su contenido. Esto último también es aplicable a la exportación a excel y también es verdad que, en ambos casos, se puede suplir fácilmente, eliminando el panel group y trasladando a sus hijos las posibles condiciones de renderización.


6. Referencias.


7. Conclusiones.

En princpio, para una exportación simple a Excel nos podrá servir, si necesitásemos exportar a pdf, sin más, también. Pero si necesitamos de una buena personalización a la hora de exportar a Pdf no disponemos de muchas opciones, con lo que seguiremos usando lo que nos comentó en su momento Saúl, relacionado con el framework dynamicJasper y analizaremos la viabilidad de crearnos nuestro propio componente jsf2 de dataExporter. Con nuestro, me refiero a un componente dataExporter de Autentia ;)

Stay tuned!

Un saludo.

Jose

jmsanchez@autentia.com

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-04-30-06:01:44

Autor: sofi82

Hola... estoy trabajando con Eclipse con richfaces... y quisiera exportar un datatable a un archivo excel???.. he estado buscando por muchas partes, y lo unico que encuentro son ejemplos con Primefaces :(

Fecha publicación: 2013-03-05-17:25:04

Autor: michael081530

estoy realizando una aplicación cunado exporto los datos a EXCEL me sale lo siguiente (org.apache.poi.hssf.usermodel.HSSFRow.createCell(I)Lorg/apache/poi/hssf/usermodel/HSSFCell; ) no se que sera si alguien me puede ayudar se lo agradezco.....

Fecha publicación: 2012-02-13-15:04:46

Autor: rsiscoq

autentia.png en que ruta la debo de ubicar???
y
logo.append(File.separator).append(IMAGE_FOLDER);
logo.append(File.separator).append(LOGOS_FOLDER);
no me los reconoce