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

API standards et tierces Java Discussion :

Récupération fichier xls en IMAP


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut Récupération fichier xls en IMAP
    Bonjour tout l'monde,

    C'est par un beau matin ensoleillé en Bretagne qu'il m'arrive un petit souci !
    Je suis en train de développer une application qui va permettre de récupérer des fichiers xls sur une boîte de messagerie pour les balancer dans un répertoire en dur.

    Tout se passe bien, le fichier xls est copié. Mais son contenu est ... bizarre.
    En effet, j'ai l'impression que le contenu du fichier n'est pas vraiment copié, mais que ce sont les lignes qui le composent qui sont copiées, ce qui donne au final quelque chose de moche et incompréhensible dans le fichier alors que je devrai avoir des lignes, des graphiques, et plein de trucs jolis concernant des statistiques.

    Voici mon code :

    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
    22
    23
    24
    25
    26
    27
    28
    public void DownloadFile(int num)
      {
     
        try
        {
          Multipart mp = (Multipart) myMailBox[num].getContent();
          int n=mp.getCount();
          for (int j=0;j<n;j++) {
              Part part = mp.getBodyPart(j);
              String disposition = part.getDisposition();
              if ((disposition != null)&&((disposition.equals(Part.ATTACHMENT)||(disposition.equals(Part.INLINE))))){
                File save=new File("C:\\temp\\"+part.getFileName());
                FileWriter ecriture=new FileWriter(save);
                InputStreamReader lecture=new InputStreamReader(part.getInputStream());
                int flux;
                while ((flux=lecture.read())!=-1) {
                        ecriture.write(flux);
                }
                lecture.close();
                ecriture.close();
     
              }
          }
        }
        catch(Exception ex)
        {
           System.out.println(ex.getMessage());
        }

    Ma variable num correspond au numéro du mail choisi dans la liste.

    Merci de toute aide apportée

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Les fichiers XLS sont du binaire, pas du texte. Il ne faut pas les passer dans des Reader ou des Writer.
    Il faut utiliser directement le InputStream et écrire dans un FileOutputStream.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Les fichiers XLS sont du binaire, pas du texte. Il ne faut pas les passer dans des Reader ou des Writer.
    Il faut utiliser directement le InputStream et écrire dans un FileOutputStream.
    Merci pour m'avoir aiguillé.
    Je vois où tu veux en venir, mais je vois pas trop comment ces méthodes sans lecture/écriture. J'ai trop été habitué pour réfléchir sans utiliser ces moyens faciles d'utilisation. Il est grand temps que j'enlève les roulettes d'appui de mon vélo, mais j'ai besoin d'un coup de main

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Transformation de ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    OutputStream ecriture = new FileOutputStream(save);
    InputStream lecture = part.getInputStream();
    int flux;
    while ((flux=lecture.read())!=-1) {
      ecriture.write(flux);
    }
    Pas de Reader ni de Writer, juste des InputStream et OutputStream.

    Version plus efficace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    OutputStream ecriture = new FileOutputStream(save);
    InputStream lecture = part.getInputStream();
    byte[] buffer = new byte[1024];
    int nbRead = lecture.read(buffer);
    while(nbRead > 0) {
      ecriture.write(buffer, 0, nbRead);
      nbRead = lecture.read(buffer);
    }
    Edit : erreur corrigée dans le code du dessus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre très actif
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2011
    Messages : 137
    Par défaut
    De cette manière ma boucle ne va pas s'arrêter.
    J'ai testé, et c'est bien le cas. J'ai dû arrêter l'application quand j'ai vu que mon fichier xls dépassait les 2 Go

    L'utilisation du buffer m'était peu connue et je suis bien d'accord sur son utilisation.
    En ce qui concerne les byte, pourquoi 1024?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Baboulinet_ Voir le message
    De cette manière ma boucle ne va pas s'arrêter.
    J'ai testé, et c'est bien le cas. J'ai dû arrêter l'application quand j'ai vu que mon fichier xls dépassait les 2 Go
    Oui, j'avais oublié de lire un nouveau buffer dans la boucle. J'avais oublié cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbRead = lecture.read(buffer);
    J'ai édité mon post pour que le code soit correct.

    Citation Envoyé par Baboulinet_ Voir le message
    L'utilisation du buffer m'était peu connue et je suis bien d'accord sur son utilisation.
    En ce qui concerne les byte, pourquoi 1024?
    Pourquoi pas ?
    L'idée est de lire les octets par lots au lieu d'un par un, pour éviter de faire trop d'appels IO.
    Après, la taille du buffer, le nombre maximum d'octets qui seront lus à chaque fois, n'est pas très important. Ce pourrait être 512 ou 2048 ou 4096.
    Attention quand même, se rappeler que ce buffer occupe de la mémoire, ce n'est donc pas une bonne idée d'en créer trop qui soient trop gros.
    De plus, un buffer n'est pas forcément rempli par un appel à read(), et en fait au-delà d'une certaine taille ça ne sert à rien de faire plus grand.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2014, 10h31
  2. Réponses: 0
    Dernier message: 22/01/2008, 10h33
  3. Lien vers un fichier .xls
    Par Laurent Nève dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 02/12/2004, 08h57
  4. Afficher le contenu d'un fichier xls dans un DBgrid
    Par bianconeri dans le forum C++Builder
    Réponses: 5
    Dernier message: 03/09/2004, 16h35
  5. [VBA-E] ouvrir un fichier .xls sans executer les macro
    Par lae_t2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2003, 17h07

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