Generación dinámica de libros Excel

Muchas veces debemos ser capaces de exportaciones a Excel que contengan datos de nuestra aplicación.

El problema es que los libros de Excel con extensión .xls son archivos binarios. Si tenemos suerte y la máquina es Windows, y tiene instalado Microsoft Excel, podremos usar los controles ActiveX de éste para generar los archivos.

Si no, tendremos que implementar, o utilizar algunas de la librería que permiten acceder a archivos binarios de Excel. Lo que nos dará bastantes quebraderos de cabeza; o bien conformarnos con una exportación a CSV.

El caso es que de casualidad, viendo la exportación a Excel de phpMyAdmin, he visto que se pueden generar hojas de Excel, utilizando XML con una DTD concreta. Lo que facilita muchísimo la programación.

La cosas sería más o menos así:

<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<style id="Classeur1_16681_Styles"></style>
</head>
<body>
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 style='border-collapse: collapse'>
<tr>
<td>Celda A1</td>
<td>Celda B1</td>
<td>Celda C1</td>
</tr>
<tr>
<td>Celda A2</td>
<td>Celda B2</td>
<td>Celda C2</td>
</tr>
<tr>
<td>Celda A3</td>
<td>Celda B3</td>
<td>Celda C3</td>
</tr>
</table>
</div>
</body>
</html>

Los archivos así generados, funcionan sin problemas con Excel 2000 y superiores.

Puedes descargar el ejemplo (2 Kb. en formato XLS), y visualizarlo con cualquier editor de textos, para hacerte una idea de como funciona este enfoque.

El principal problema de esta solución, es que los libros así creados, no funcionan con normalidad en OpenOffice. Al menos no con la versión 2.0.

6 comentarios en “Generación dinámica de libros Excel”

  1. El div seguro que no hace falta, yo hacia asi las exportaciones a Excel, le ponia un <html><head><title>algo</title></head><body>la tabla <table>…</table></body></html> y funcionaba.
    También tenía un doc donde se ponia el estilo y formateaba numeros y caracteres normales.

  2. Hola Javier,

    He probado tu ejemplo y a mi no me funciona, no consigo que aparezca un arxivo XLS, sino que me aprece una tabla HTML normal.

    Yo utilizo para crerar arxivos EXCEL dinamicamente, PHP, que puede usar una cabecera header('Content-type: application/vnd.ms-excel');

    Aqui teneis un ejemplo obtenido de [url]http://www.el-programador.com/index.php/topic,9.0.html[/url]



    <?php
    $fecha = date('m-d-Y');

    header('Content-type: application/vnd.ms-excel');
    header("Content-Disposition: attachment;filename=arx_$fecha.xls");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo "<table border=1>\n";
    echo "<tr>\n";
    echo "<th>Titulo</th>\n";
    echo "<th>URL</th>\n";
    echo "</tr>\n";
    echo "<tr>\n";
    echo "<td><font color=red>Nolimites</font></td>\n";
    echo "<td>www.nolimites.com</td>\n";
    echo "</tr>\n";
    echo "<tr>\n";
    echo "<td><font color=red>Google</font></td>\n";
    echo "<td>www.google.com</td>\n";
    echo "</tr>\n";

    echo "</table>\n";
    ?>

    Un saludo a todos,
    Narref (Recursteca)
    [url]http://phobos.xtec.net/fmas/blog/[/url]

  3. Javier Gutiérrez Chamorro (Guti)

    narref, a pesar de que tu documento HTML no está bien definido, le faltan el body y el html, a mi me ha funcionado correctamente con PHP 5, abriéndolo con Excel 2003.

    ¿Qué versiones usas?

Deja un comentario