J'ai récemment eu besoin de générer despuis un script un "vrai" fichier Excel. J'entends par "vrai", un fichier qui ne s'importe pas, mais qui s'ouvre directement et qui puisse contenir de la mise en forme. En recherchant sur internet, j'ai découvert que OpenOffice et Microsoft Excel (et peut-être d'autres tableurs) savent ouvrir un fichier content une description de table au format HTML. En plus, ils savent gérer des styles (de type CSS). Tout est donc imaginable, sauf que se pose le problème récurent des formats de cellule. N'ayant à travailler que pour Excel (on ne choisit pas toujours ses outils!), j'ai trouvé sur internet une solution pour celui-ci. En effet, il prends en compte la directive mso-number-format permettant de définir le format de la cellule. Ce billet indique différents exemples de valeurs possibles pour définir les formats.

Ainsi j'ai pu, à grand coup de echo et de redirection de flux, générer des fichiers Excel avec de bons formats pour les dates, les chiffres, forcer du texte (notamment pour les chaines ne contenant que des chiffres), et ajouter un peu de mise en forme.

Histoire de servir d'exemple, et pour moi de pense-bête, voici le contenu d'un fichier xls qui peut être généré avec différents exemples de formatage de cellule :

<style>
   .date {mso-number-format:"dd/mm/yy"}
   .txt {mso-number-format:"\@";}
   .gras {font-weight:bold;}
   .centreGras {font-weight:bold; text-align:center}
   .fondRouge {background-color : red}
   .enJaune {color:yellow}
   .titreVoyant {background-color:green;color:cyan;font-weight:bold}
   .3dec {mso-number-format:"\#\, \#\#0\.000"}
</style>

<table border="1">
<tr><td class="txt">00001</td><td class="gras">En gras</td><td class="centreGras">Au centre, en gras</td></tr>
<tr><td>00001</td><td class="fondRouge">fond rouge</td><td class="enJaune">en jaune</td></tr>
<tr><td class="titreVoyant">FLASH !</td><td class="date">25/01/2011</td><td class="3dec">10254,25689744541</td></tr>
<tr class="gras"><td>toute la </td><td>ligne </td><td>en gras</td></tr>
</table>

Voici le rendu dans Excel :

excelhtml.JPG

Notez que les cases A1 et A2 contiennent la même valeur, mais A1 étant formaté en texte, les zéros sont bien affichés. Pour l'instant je n'ai pas réussi à appliquer plusieurs classes à une même cellule, ce qui force à créer des classes spécifiques avec plusieurs mises en forme.

Voilà donc une solution rapide qui permettra, lorsque le langage de programmation ou de script utilisé ne contient pas de module pour gérer le format xls, de générer des fichiers Excel correctement formatés.


Fabien (eponyme)