Export vers excel avec une Servlet
L’export vers Excel est une fonctionnalité importante pour tout application Web particulièrement si elle stocke/manipule des donnée. En effet, Excel est un outils très apprécié des utilisateurs finaux pour faire de l’intégration basic avec une très forte flexibilité. Dans cette article je ne décrierai pas comment mettre en place une servlet.
Sous certaines conditions, on peut se reposer entièrement sur la fonction d’export d’IE:
- Si votre application Web ne requière pas d’authentification,
- Vous n’avez pas a supporter d’autres browser autres que IE,
- Vous n’avez besoin d’exporter que les données présentes dans la page.
Si vous ne remplissez pas tous les critères ci-dessus, vous pouvez alors développer une servlet qui se chargera de retourner une réponse de type excel. Pour cela il faut faire une reset sur la réponse, positionner le type, quelques paramètres et enfin les données.
Le reset ce fait par:
| public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { … response.reset(); |
Attention, si vous faite seulement response.resetBuffer(), dans ce cas cela ne reset pas l’expiration.
Ensuite, il faut donner le type de donner qui va etre retourner. Il peut s’agire de:
- csv (Comma Separated Value): les valeurs sont séparées par des virgules
- application/vnd.ms-excel: les données peuvent être d’au moins 3 types
- les valeurs sont séparées par de tabulations,
- du xml contenant les valeurs mais aussi des infos de formatage.
- un binaire contenant le contenu exacte du fichier excel (a noter que dans ce cas on peut utiliser “application/octet-stream”, en n’oubliant pas de donner l’extention “xls” au nom de fichier)
Dans l’exemple que je donne, j’utiliserais le format tabulé. Pour fournir le type il faut:
| response.setContentType(”application/vnd.ms-excel”); |
Il faut ensuite spécifier le nom de fichier et optionnelement d’autres paramètres. Il est important d’utilise l’extention “xsl” pour Excel car IE est un peu sensible à ce niveau.
| response.addHeader(”Content-Disposition”, “inline;filename=myReport.xls”); |
Si vous voulez que l’utilisateur ai le choix entre sauver ou ouvrir le fichier, il faut changer l’attachement en:
| response.addHeader(”Content-Disposition”, “attachement;filename=myReport.xls”); |
Là où IE/Excel sortent un peu des standards, c’est que vous risquez d’avoir des problèmes de CodePage. On peut en théorie spécifier la CodePage mais il se trouve que Excel n’en tient pas compte, cela dépend de la code page de l’OS et de la langue d’Excel…et encore vous risquez d’avoir des problèmes avec le symbole € par exemple. Dans ce cas, il n’y a pas d’autre solution que de générer un flux/fichier au format Excel (je ne ferais un autre article à ce sujet).
Ensuite il faut compléter la réponse avec les données. Pour ce faire, utiliser le response.getWriter() ou response.getOutputStream(), et ajouter les titres des colonnes (optionnel) et les données :
| writer.println(”col1\tcol2\tcol3\t”); writer.println(”val11\t val12\tval1\t”); writer.println(”val21\t val22\t val23\t”); writer.println(”val31\t val32\t val33\t”); |
Cela donne au final :
| import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException |