Les différences entre les navigateurs, mais aussi entre les numéros de version des navigateurs, sont la source de nombreux problèmes quand il s’agit de développer une fonction a priori simple. Produire un vulgaire fichier CSV à la volée via une JSP en est le parfait exemple : si l’on se contente d’écrire le contenu directement dans le flux de sortie out (e.g. « <%= maVariable %>
» ), aucune version d’Internet Explorer antérieure à la 9 n’est en mesure de télécharger correctement le fichier produit. Pour ce faire, et ce n’est pas moi qui ai trouvé la solution mais mon chef *, il est nécessaire de passer par un StringBuffer et d’écrire l’ensemble du flux via le Writer de l’instance response.
<%@ page contentType="application/octet-stream" import="java.util.*, java.io.*" %><% response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=\"donnees.csv\""); final String sep = ";"; // separateur de colonnes a la Excel final String crlf = "\r\n"; // fin de ligne a la ouin-ouin StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("Chaine" + sep + "Nombre" + crlf); stringBuffer.append("\"Hello world\"" + sep + "123,45" + crlf); PrintWriter pw = response.getWriter(); pw.println( stringBuffer.toString() ); %>
* Les chefs, c’est aussi fait pour ça !