Exportar a formato Excel con JSP de forma bien básica (TSV)

19.8.09. Por ooscarr (ooscarr)

En este tutorial voy a mostrar la manera de generar un archivo compatible con Microsoft Excel que consiste en valores separados por espacios tabuladores muy elemental y sin gráficos o estilos.

Primero hay que partir diciendo qué opciones de formatos compatibles con Excel hay:

CSV
Es el más conocido, y consiste en un archivo de texto plano, generalmente con la extención .csv donde los valores de cada celda van separados por una coma (,) en el caso de las columnas, y un salto de línea para las filas.
TSV
TSV es una variación al anterior CSV, donde las columnas van separadas por un espacio tabulador y las filas por un salto de línea. Esto permite que se puedan introducir celdas con valores que incluyan una coma y no sean confundidas por un salto de columna, por ejemplo.
XLS
El formato Microsoft Excel tradicional que es un archivo binario para Windows donde se guardan en hojas, gráficos y macros. Mucho tiempo su especificación fue cerrada, pero desde que se comenzó a documentar el formato con ingeniería inversa y debido a las presiones de las cortes para aceptar su formato como un estándar, Microsoft se vio obligada a publicar su estructura de funcionamiento bien particular.
XLSX
Esta es la última especificación Office Open XML que Microsoft no sé cómo logró estandarizar, y que consiste en una serie de archivos XML y otros, organizados en una carpeta todo comprimido en un archivo ZIP (al igual que el estándar OpenDocument que también es soportado por Microsoft Office 2007 pero que no es de propiedad de Microsoft).

Y otros más menos importantes.

El formato

El formato que voy a exportar desde el JSP en este tutorial es el TSV, pero con extensión .xls. El archivo siguiente:

Uno Due Tre Quattro
Uno Dos Tres Cuatro
One Two
Ichi Ni San Shi
Odin Dva Tri

Se vería así en la planilla de cálculo:

ABCD
1UnoDueTreQuattro
2UnoDosTresCuatro
3OneTwo
4IchiNiSanShi
5OdinDvaTri

La librería

Yo encontré una librería de etiquetas para generar estos archivos y así evitarme el problema de generar el caracter de tabulación y todos los espacios (whitespaces) que se generan.

Descarga

La página para descargar el archivo exceltag.jar es http://www.servletsuite.com/servlets/exceltag.htm

Instalación

Para instalar la librería en Netbeans, es igual que en todas las librerías. Se va a las propiedades del proyecto,

Sección librerías del panel de Propiedades del proyecto en Netbeans

elegimos Agregar JAR/Carpeta (o Add JAR/Folder); buscamos el archivo exceltag.jar recién descargado y seleccionamos Elegir.

Copiando archivo exceltag.jar al proyecto con Netbeans

Aceptar

El modo de uso

Ahora que está la librería instalada, hacemos uso de ella de la siguiente forma:

Hola, mundo

Para el primer ejemplo, voy a crear un nuevo archivo llamado Numberwang.jspx como de costumbre:

Creando nuevo archivo JSP llamado Numberwang con sintaxis XML en Netbeans

Y el código con sintaxis XML sería...

Numberwang.jspx
<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    Document   : Numberwang
    Created on : 15-ago-2009, 9:58:09
    Author     : ooscarr
-->
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
  xmlns:ms="http://www.servletsuite.com/servlets/exceltag"
  version="2.0">

 <jsp:directive.page contentType="application/vnd.ms-excel;charset=UTF-8"
          pageEncoding="UTF-8"/>

 <ms:Excel>
  <ms:cell>Uno</ms:cell>
  <ms:cell>Due</ms:cell>
  <ms:cell>Tre</ms:cell>
  <ms:cell>Quattro</ms:cell>
  <ms:row/>
  <ms:cell>Uno</ms:cell>
  <ms:cell>Dos</ms:cell>
  <ms:cell>Tres</ms:cell>
  <ms:cell>Cuatro</ms:cell>
  <ms:row/>
  <ms:cell>One</ms:cell>
  <ms:cell>Two</ms:cell>
  <ms:row/>
  <ms:cell>Ichi</ms:cell>
  <ms:cell>Ni</ms:cell>
  <ms:cell>San</ms:cell>
  <ms:cell>Shi</ms:cell>
  <ms:row/>
  <ms:cell>Odin</ms:cell>
  <ms:cell>Dva</ms:cell>
  <ms:cell>Tri</ms:cell>
 </ms:Excel>

</jsp:root>
Resultado

Browser dando la opción de Guardar o Abrir el archivo Numberwang.xls con OpenOffice.org

Cuando visite la página Numberwang.jspx, el navegador reconocerá el contentType="application/vnd.ms-excel;charset=UTF-8" y dará la opción de descargarlo o, en ciertos casos, en Windows, desplegará la planilla de cálculo dentro de la ventana del browser.

Nombre de archivo personalizado

Para elegir otro nombre para el archivo Excel, basta agregar la siguiente línea en el principio del documento:

<jsp:directive.page contentType="application/vnd.ms-excel;charset=UTF-8"
          pageEncoding="UTF-8"/>
<jsp:scriptlet>
 response.setHeader("Content-Disposition","attachment;filename=nombre_de_archivo.xls");
</jsp:scriptlet>

Otro ejemplo con base de datos

Un último ejemplo que lee los datos de la base de datos, sería:

Productos.jspx
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
     xmlns:c="http://java.sun.com/jsp/jstl/core"
     xmlns:sql="http://java.sun.com/jsp/jstl/sql"
     xmlns:ms="http://www.servletsuite.com/servlets/exceltag"
     version="2.0">

<jsp:directive.page contentType="application/vnd.ms-excel;charset=UTF-8"
          pageEncoding="UTF-8"/>

<jsp:directive.include file="/WEB-INF/jspf/conexion.jspf"/>
<c:catch var="excepcion">
 <sql:transaction dataSource="${bdatos}">
  <sql:query var="productos">
   SELECT nombre_prod AS nombre,precio AS precio FROM inventario_productos;
  </sql:query>
 </sql:transaction>
</c:catch>
<c:if test="${empty excepcion}">

 <!-- Si encontró productos -->
 <c:if test="${productos.rowCount>0}">
  <!-- Forma la tabla -->
  <ms:Excel>
   <ms:cell>Producto</ms:cell>
   <ms:cell>Precio</ms:cell>

   <!-- Llena la tabla -->
   <c:forEach items="${productos.rows}" var="producto" varStatus ="status">
    <ms:row/>
    <ms:cell>${producto.nombre}</ms:cell>
    <ms:cell>${producto.precio}</ms:cell>

    <!-- En la última fila -->
    <c:if test="${status.last}">
     <ms:row/>
     <ms:cell><c:out value=" "/></ms:cell>
     <!-- Se pueden ingresar fórmulas -->
     <ms:cell>=SUM(B2:B${status.index+2})</ms:cell>
    </c:if>
   </c:forEach>
  </ms:Excel>
 </c:if>

</c:if>
 
</jsp:root>
Resultado leído de la base de datos
A B
1ProductoPrecio
2Lápiz200
3Cuaderno1000
4 1200

¿Qué opinan las aplicaciones de planillas de cálculo?

Cuando se abre el archivo excel generado con una apliación de planillas de cálculo, estos son algunos de los resultados:

SoftwareResultado
Microsoft OfficeNo dice nada y abre el archivo correctamente.
OpenOffice.orgAparece un asistente de importación con una vista previa y si no se modifica ninguna opción, abre la planilla correctamente.
iWork NumbersAparece un pequeño aviso de que no es un formato Excel válido, pero lo muestra correctamente.
Google DocsProduce un error. A la fecha, no está preparado para el formato.

Referencias

Etiquetas: , , , , ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad