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

Documents Java Discussion :

[POI] HWPF créer un fichier .doc


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut [POI] HWPF créer un fichier .doc
    Bonjour,

    Je souhaiterai générer un fichier word grâce à l'api POI.
    J'ai une erreur que je ne comprends pas:
    ici je créé le fichier mais c'est pour faire des tests, plus tard, je mettrai ce document dans l'"outputStream" de ma "HttpServletResponse" afin de pouvoir télécharger le fichier en cliquant sur un lien.

    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
    29
    30
    31
    32
    33
    34
    35
     
            byte[] buf = new byte[1024];
            InputStream is = new ByteArrayInputStream(buf);
            HWPFDocument doc = new HWPFDocument(is);
     
            // centered paragraph with large font size
            Range range = (Range) doc.getRange();
            Paragraph par1 = range.insertAfter(new ParagraphProperties(), 0);
            par1.setSpacingAfter(200);
            par1.setJustification((byte) 1);
            // justification: 0=left, 1=center, 2=right, 3=left and right
     
            CharacterRun run1 = par1.insertAfter("one");
            run1.setFontSize(2 * 18);
            // font size: twice the point size
     
            // paragraph with bold typeface
            Paragraph par2 = run1.insertAfter(new ParagraphProperties(), 0);
            par2.setSpacingAfter(200);
            CharacterRun run2 = par2.insertAfter("two two two two two two two two two two two two two");
            run2.setBold(true);
     
            // add a custom document property (needs POI 3.5; POI 3.2 doesn't save custom properties)
            DocumentSummaryInformation dsi = doc.getDocumentSummaryInformation();
            CustomProperties cp = dsi.getCustomProperties();
            if (cp == null) {
                cp = new CustomProperties();
            }
            dsi.setCustomProperties(cp);
     
            OutputStream out = new FileOutputStream(new File("D:/essai.doc"));
            doc.write(out);
     
            out.flush();
            out.close();
    Et voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    run:
    Exception in thread "main" java.io.IOException: Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0
    	at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:125)
    	at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:153)
    	at org.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:96)
    	at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:119)
    	at daoTest.poi.main(poi.java:34)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 0 seconds)
    Merci ce votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Normal tu créés un document à partir d'un flux d'octets nulls (0x00) ... Qui ne représente en rien un document !

    Essayes avec un flux vide new ByteArrayInputStream(new byte[0])
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    je te remercie de ta réponse mais avec "new ByteArrayInputStream(new byte[0])" ça me dit qu'il attendait un tableau de 32.

    Mais apparemment on ne peut pas créer un document Word à cause du header. Mais en fin de compte ceci m'arrange, je vais partir sur un fichier word type que je vais modifier. Mais voila j'ai un petit soucis, voila le 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
     
            HWPFDocument doc = new HWPFDocument(new FileInputStream("D:/empty.doc"));
            Range r = doc.getRange();
            r.replaceText("<Nom>", "MonNom");
            r.replaceText("<Prenom>", "MonPrenom");
            System.out.println("range: " + r.text());
     
            OutputStream out = new FileOutputStream("D:/doc.doc");
            doc.write(out);
            out.flush();
            out.close();
            doc = new HWPFDocument(new FileInputStream("D:/doc.doc"));
            r = doc.getRange();
            System.out.println("range: " + r.text());
    Donc j'ai un fichier .doc avec dans le texte des balises <NOM> et <PRENOM> que je vais remplacer par mon nom et mon prénom puis je le sauvegarde dans un autre fichier. A l’exécution, les balises ont bien été remplacés (vérifié grâce au "println()") mais quand je veux ovrir le fichier avec word j'ai:
    "Word n'a pas pu lire ce document, il est peut être corrompu."
    Donc j'essaie après de récupérer ce fichier et d'afficher le texte qui est dedans et j'ai la même chose à par les petits carrés à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    run:
    range: Nom de la société Convocation de MonNom MonPrenom pour la session  de formation du <Date>*:<Logiciel>*/ <Module>Mr MonNom MonPrenom est convoqué(e) à la formation du <Date>
    range: Nom de la société Convocation de MonNom MonPrenom pour la session  de formation du <Date>*:<Logiciel>*/ <Module>Mr MonNom MonPrenom est convoqué(e) à la formation du <Date>
    BUILD SUCCESSFUL (total time: 1 second)
    Je ne vois pas ce que j'aurai pu cassé dans mon fichier Word. Mais peut-être que la fonction "replaceText()" casse la structure du ficher Word.

    J'utilise Word 2007 avec le fichier source (empty.doc) créer et sauvegarder par ce Word.

    merci de voter aide

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Je suis pas spécialiste d'Apache POI et je n'ai jamais travaillé avec des documents Word.
    Je ne vois rien de spécialement erroné dans le code, je pencherais donc sur un bug POI, peut-être devrais-tu te tourner vers leur forum pour en savoir plus ?

    Sinon tu devrais :
    • Fermer tes FileInputStream
    • Utiliser un bloc try-finally pour toujours fermer tes flux (lien FAQ)
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    J'ai trouver quelques truc sur les bug de apache: bug report

    Mais il est marqué résolu et je sais pas comment faire pour utiliser le patch ou s'il est déjà inclus dans les nouvelles versions de Poi.

    J'ai aussi un autre problème, les font et structures du texte word ne sont pas garder, j'ai utilisé ce 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
     
                File iFile = new File("D:/empty.doc");
                File oFile = new File("D:/doc.doc");
                InputStream fis = new FileInputStream(iFile);
                POIFSFileSystem fs = null;
                HWPFDocument doc = null;
                try {
                    fs = new POIFSFileSystem(fis);
                } finally {
                    fis.close();
                }
                doc = new HWPFDocument(fs);
     
                OutputStream out = new FileOutputStream(oFile);
                try {
                    doc.write(out);
                    out.flush();
                } finally {
                    out.close();
                }
    Après avoir sauvegarder mon "HWPFDocument" que j'ai récupérer d'un fichier .doc, dans un autre fichier .doc, le style de mes paragraphes n'est plus correct (j'ai le même de partout, celui du premier paragraphe).

    Ensuite en faisant quelques test, je me suis aperçu que le nombre de paragraphe de mon fichier de destination était de 1 au lieu de 2 mais avec le même texte de dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Source:
       Section : 1
       paragraphe : 2
       longueur : 6
    Destination:
       Section : 1
       paragraphe : 1
       longueur : 6

    Merci d'avance.

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Vu la date 2008, je pense que le patch a été intégré depuis.

    Je dirais donc de voir sur leur forum, mailing list.

    Sinon est-ce que tu as déjà essayé avec un document Word plus simple pour voir si tu reproduis le problème ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

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

Discussions similaires

  1. Comment créer un document .doc en python à partir de fichier .txt
    Par Schum25 dans le forum Général Python
    Réponses: 9
    Dernier message: 13/07/2012, 17h41
  2. Réponses: 1
    Dernier message: 24/03/2010, 11h49
  3. Créer un fichier .doc coté serveur
    Par Wasrack dans le forum ASP.NET
    Réponses: 3
    Dernier message: 20/03/2009, 13h11
  4. [POI] Créer un fichier
    Par nicotine002 dans le forum Documents
    Réponses: 15
    Dernier message: 23/01/2006, 21h33
  5. [POI] créer un fichier word
    Par systemf dans le forum Documents
    Réponses: 5
    Dernier message: 01/09/2005, 10h13

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