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.