IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Ecriture dans un fichier texte (csv)


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut Ecriture dans un fichier texte (csv)
    Bonjour !
    J'ai une application java (web) qui permet de télécharger un fichier csv conrrespondant au tableau affiché.
    Pour ce faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintWriter out = new PrintWriter(baos);
    out.println("........");
    ...
    ...
    out.flush();
    out.close();
    et dans l'action web (je sais pas si c'est utile que je détail ça, mais on sait jamais ... ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    		ExternalContext external = FacesContext.getCurrentInstance()
    				.getExternalContext();
    		HttpServletResponse response = (HttpServletResponse) external
    				.getResponse();
    		// formatage de la réponse
    		response.setContentType("application/octet-stream");
    		response.setHeader("Content-Disposition",
    				"attachment;filename=\"list.csv\"");
     
    // Ecriture dans l'output
    		ServletOutputStream out;
    		try {
    			out = response.getOutputStream();
    			baos.writeTo(out);
    			baos.flush();
    			FacesContext.getCurrentInstance().responseComplete();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}

    Par ailleurs, le fichier est bien formé, lorsque je l'ouvre avec un éditeur de texte, genre notepad.

    Lorsque je l'ouvre avec Excel, tous les accents sont remplacés par un code bizarre (ex : Quantité est nul)

    Faut-il faire quelque chose dans le code java pour rétablir ces accents ?
    Toutes les réponses sont les bienvenues

    Merci beaucoup d'avance, je vous souhaite une bonne journée.

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour.
    Ton problème ressemble surtout à un problème de charset.
    Essaies de modifier l'encodage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    response.setContentType("application/octet-stream; charset=utf-8");
    T'es sur que application/octet-stream est le type qu'il te faut ? ça resemble plus à du texte pour moi le fichier CVS ...

    Bonne chance.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    MErci infiniement de ta réponse !!
    Ah ouai, comme ça ça marche.

    Pour répondre à ta question, en fait je ne sais pas trop .... je ne pensais pas que le problème venait de là en fête ..
    Sinon oui, le csv est bien un fichier texte quelconque. Sauf qu'il peut être interprété par excel.

  4. #4
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Oui, ça je le sais, mais je crois que text/plain est plus adapté à un ficher CSV.

    @+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    Ok, merci du tuyau.
    Bonne journée

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    Salut !

    En fait, mon problème n'est toujours pas résolu.

    Sur mon poste en local, sous WindowsXP / Tomcat, il n'y a pas de problème.

    Sur le serveur de Test, c'est à dire UNIX / Tomcat, le problème persiste, même avec la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setContentType("text/plain");
    Comme tu me l'as indiqué.

    Merci

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    Est ce l'utilisation de ByteArrayOutputStream qui pose problème ?

  8. #8
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Le fait de mettre le content type a "texte/plain" ne compense nullement le fait de préciser le charset donc je pense que c'est encore mieu ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.setContentType("text/plain; charset=utf-8");

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    Salut !
    Bon, je viens de trouver une solution que je poste :

    Dans la DAO, je fais (bien préciser le charset de l'objet OutputStreamWriter) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public void getCsv(List anomalieObjects,ServletOutputStream servletOs) {
     
       OutputStreamWriter writer = null;
     
       try {
    	writer = new OutputStreamWriter(servletOs, "ISO-8859-1");
       } catch (UnsupportedEncodingException e) {
    	System.out.println("Encodage non supporté !!!!!");
       }
     
       PrintWriter out = new PrintWriter(writer);
       StringBuffer enTete = new StringBuffer();
       enTete.append("Type d'anomalie;");
       ...
       ...
       ...
    out.println(enTete);
    out.flush();
    out.close();
    }

    et dans l'action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletResponse response = (HttpServletResponse) external.getResponse();
    // formatage de la réponse
    response.setContentType("plain/text; charset=ISO-8859-1");
    response.setHeader("Content-Disposition","attachment;filename=\"anomaliesImportCre.csv\"");
     
    // Ecriture dans l'output
    try {
         DAOFactory.getDetailAnomaliesDAO(null).getCsv(detailAnomaliesBean.getAnomalieObjects(),
        response.getOutputStream());
        FacesContext.getCurrentInstance().responseComplete();
        } catch (IOException e) {
              e.printStackTrace();
        }

    Comme celà, le client peut télécharger le fichier, encodé au format iso-8859-1 ce qui n'affecte pas les accents à l'affichage avec Excel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] ecriture dans un fichier texte
    Par TiNoUcHe dans le forum Langage
    Réponses: 4
    Dernier message: 27/09/2006, 16h12
  2. probleme d'ecriture dans un fichier texte
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 21/06/2006, 17h51
  3. Ecriture dans un fichier texte
    Par Bmagic dans le forum MFC
    Réponses: 9
    Dernier message: 07/06/2006, 14h40
  4. ecriture dans un fichier text
    Par lerouzes dans le forum Langage
    Réponses: 19
    Dernier message: 30/04/2006, 16h29
  5. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo