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

  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

  7. #7
    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
    Ok, merci pour tout thelvin

    Donc en fait pour lire le fichier xls, je suis obligé de passer par un buffer qui va me permettre de récupérer les données par lots afin de les retranscrire dans mon fichier créé à cet effet, c'est bien ça ?
    Le buffer est une sorte de siège du télésiège si je comprends bien et là on peut mettre 1024 personnes sur ce siège (en schématisant hein ) ?

    Du coup le nbread correspond au nombre des sièges qu'il va falloir pour emmener ces personnes là de l'autre côté et lorsqu'on en lit un, ce nombre est décrémenté ?

  8. #8
    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
    Donc en fait pour lire le fichier xls, je suis obligé de passer par un buffer qui va me permettre de récupérer les données par lots afin de les retranscrire dans mon fichier créé à cet effet, c'est bien ça ?
    Pas du tout. Tu peux le lire un octet à la fois comme indiqué dans mon premier programme. Par contre, ce sera bien plus lent que de le lire par buffers, et ça ne sert à rien...

    Citation Envoyé par Baboulinet_ Voir le message
    Le buffer est une sorte de siège du télésiège si je comprends bien et là on peut mettre 1024 personnes sur ce siège (en schématisant hein ) ?
    ... Je suppose qu'on peut le voir comme ça. De fait, la file avance bien plus vite avec des télésièges larges que des télésièges monoplaces.

    Citation Envoyé par Baboulinet_ Voir le message
    Du coup le nbread correspond au nombre des sièges qu'il va falloir pour emmener ces personnes là de l'autre côté et lorsqu'on en lit un, ce nombre est décrémenté ?
    Pas du tout. Ça correspond au nombre de personnes qui se sont avancées pour monter sur le siège. Il n'y en a pas forcément eu 1024, et le siège n'attend pas que tout le monde soit là. Et puis peut-être que la file est finie, qu'il n'y a plus personne et que le siège n'est donc pas complet.

    Supposons que seulement 823 personnes soient montées sur le siège. À l'autre bout, il ne faut pas chercher à déposer 1024 personnes, mais seulement 823. Parce que le reste, c'est des sièges vides et ça va poser problème...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    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
    Ok merci de tes éclaircissements

    A bientôt et merci de toute l'aide que tu apportes au sein de ce forum (je t'ai vu sur de nombreux sujet )

+ 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