2012-12-05 2 views
3

J'ai eu un problème avec la reconnaissance de la sortie CSV & ouvert dans Excel. Dans mon application web, j'ai une servlet Java qui renvoie les résultats de la recherche à l'utilisateur. Les résultats de la recherche sont fournis par un serveur Apache Solr. Il y a une option sur l'interface graphique qui permet à l'utilisateur de demander les résultats de la recherche au format "CSV". Si cette option est sélectionnée, la requête est réexécutée sur Solr en ajoutant un paramètre "wt = csv". Ensuite, un filtre java ajoute des en-têtes pour renvoyer les résultats au format CSV. Mais ça ne fonctionne pas correctement.Type MIME/type de contenu pour l'ouverture de fichiers CSV en utilisant Excel dans IE & Firefox

  • Dans IE (ver 8.0), je suis invité à "Ouvrir" ou "Enregistrer" le fichier. Si je sélectionne "Ouvrir"; il ne fait que copier le texte au format CSV sur l'écran au lieu de l'ouvrir dans Excel. Et si je sélectionne "Enregistrer"; Je reçois un message d'erreur - "Impossible d'ouvrir ce site internet. Le site demandé est indisponible ou introuvable. "
  • Dans Firefox (ver 10.0.9) également; Je suis invité à ouvrir ou enregistrer le fichier. Mais pour ouvrir le fichier CSV; l'option par défaut est Notepad & Excel n'est même pas répertorié. Si je clique sur "Enregistrer" alors il télécharge le fichier CSV & Je peux l'ouvrir dans Excel et il est correctement reconnu par Excel.

J'ai essayé une variété d'en-têtes & combinaisons -

//((HttpServletResponse)response).setHeader("Content-Type", "application/octet; charset=utf-8"); 
    ((HttpServletResponse)response).setHeader("Content-Type", "text/csv"); 
    //((HttpServletResponse)response).setHeader("Content-Type", "application/vnd.ms-excel"); 
    //((HttpServletResponse)response).setHeader("Cache-Control", "private, private,max-age=0,must-revalidate"); 
    //((HttpServletResponse)response).setHeader("Content-Encoding", "gzip"); 
    //((HttpServletResponse)response).setHeader("Content-Encoding", "binary"); 
    ((HttpServletResponse)response).setHeader("Content-Disposition", "attachment; filename=Download.CSV"); 
    //((HttpServletResponse)response).setHeader("Content-Disposition", "inline; filename=Download.CSV;"); 

Mais aucun d'entre eux semblent fonctionner. J'ai utilisé Firefox pour inspecter les en-têtes qui sont renvoyés & Je vois ce qui suit -

Content-Disposition: attachment; filename = Download.CSV

Content-Type: text/plain; charset = UTF-8

serveur: Jetty (7.xy-snapshot)

Transfer-Encoding: chunked

Vary : Accept-Encoding

Même si le type de contenu est spécifié en tant que csv ou excel; quand il atteint le navigateur, il est interprété comme du texte/plaine & Je pense que c'est le problème. Vous n'êtes pas sûr de l'en-tête ou de l'encodage que je devrais définir? Aucune suggestion? Merci.

+0

L'extension .csv est-elle associée à Excel sur votre ordinateur? Sinon, IE et Firefox ne sauront probablement pas qu'il doit être ouvert avec Excel. – GreenGiant

Répondre

1

Je suis en train de faire quelque chose de similaire et cela fait partie du code que je utilise:

Date dt = new Date(); 
    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd_HHmmss"); 
    String filename = fmt.format(dt) + ".csv"; 
    //Setup the output 
    String contentType = "application/vnd.ms-excel"; 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse)fc.getExternalContext().getResponse(); 
    response.setHeader("Content-disposition","attachment; filename=" + filename); 
    response.setContentType(contentType); 

Notez que j'utilise pour dire au servlet quel type de fichier sera généré la variable « contentType ».

Espérons que cela fonctionne pour vous.

Questions connexes