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

  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

  7. #7
    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
    oki merci je vais voir,

    Mon fichier n'a que 2 lignes et 4 mots^^:

    Mr <NOM>
    Mr <NOM>

    Chaque ligne avec une taille différente et une est en gras et souligné.

  8. #8
    Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    Je galère depuis hier sur POI.

    je dois générer un document Word pour tester les possibilités graphiques de l'API, pour voir si POI peut répondre a nos besoins.

    Comme toi Skill, j'ai utilisé le même code trouvé sur internet.
    à partir d'un fichier vide en entrée rajouter du texte avec formatage en dur.

    A terme c'est pour générer des rapport de tests a partir d'une extraction XML d'une campagne de tests comme plug in de SALOME TM, outil Java de gestion des campagnes de tests sur un projet informatique.

    Mais je n'en suis hélas pas encore là !!

    Je te livre ce que j'ai compris de POI HWPF.

    Pour moi le fichier vide en entrée a par défaut la structure suivante ( j'ai exactement le même résultat que toi, ce qui me fait dire par défaut).

    RANGE
    SECTION
    PARAGRAPH
    RUNCHARACTER
    PARAGRAPH
    RUNCHARACTER

    Quand tu fais un range.insertAfter en sortie tu fusionne en quelque sorte tes deux paragraphes dans le range.
    pour garder le formatage des deux paragraphes, il te faut récupérer le texte de chaque paragraphe avec l'aide de getter :
    Paragraph p0 = range.getParagraph(0);
    CharacterRun run0 = p0.getCharacterRun(0);
    puis la même chose pour le paragraphe p1.

    et a partir de chaque run faire les manips que tu veux.

    J'en suis la.
    Par contre impossible pour moi de créer un nouveau paragraphe.

    j'ai droit a un beau IndexOutBoundException.

    conclusion je tourne en rond.

  9. #9
    Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    ps: j'ai essayer d'applique le patch cité plus haut, dans mon projet Eclipse; et ca n'a rien donné !

  10. #10
    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
    Bonjour, et merci de ta réponse,

    Le problème c'est que les paragraphes se fusionnent alors que je ne modifie rien:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    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);
                Range r = doc.getRange();
     
                for (int i = 0; i < r.numSections(); i++) {
                    Section s = r.getSection(i);
                    for (int j = 0; j < s.numParagraphs(); j++){
                        Paragraph p = s.getParagraph(j);
                        for (int k = 0; k < p.numCharacterRuns(); k++){
                            CharacterRun c = p.getCharacterRun(k);
                            System.out.println("Charc : " + c.text());
                        }
                    }
                }
     
                OutputStream out = new FileOutputStream(oFile);
                try {
                    doc.write(out);
                    out.flush();
                } finally {
                    out.close();
                }
     
                File iFileNew = new File("D:/empty.doc");
                InputStream fisNew = new FileInputStream(iFileNew);
                POIFSFileSystem fsNew = null;
                HWPFDocument docNew = null;
                try {
                    fsNew = new POIFSFileSystem(fisNew);
                } finally {
                    fisNew.close();
                }
                docNew = new HWPFDocument(fsNew);
                Range rNew = docNew.getRange();
                System.out.println("Source:");
                System.out.println("longueur : " + rNew.text().length());
                System.out.println("section : " + rNew.numSections());
                System.out.println("paragraphe : " + rNew.numParagraphs());
                System.out.println("charactere : " + rNew.numCharacterRuns());
                System.out.println("range : " + rNew.text());
     
                File iFileNew1 = new File("D:/doc.doc");
                InputStream fisNew1 = new FileInputStream(iFileNew1);
                POIFSFileSystem fsNew1 = null;
                HWPFDocument docNew1 = null;
                try {
                    fsNew1 = new POIFSFileSystem(fisNew1);
                } finally {
                    fisNew1.close();
                }
                docNew1 = new HWPFDocument(fsNew1);
                Range rNew1 = docNew1.getRange();
                System.out.println("Destination:");
                System.out.println("longueur : " + rNew1.text().length());
                System.out.println("section : " + rNew1.numSections());
                System.out.println("paragraphe : " + rNew1.numParagraphs());
                System.out.println("charactere : " + rNew1.numCharacterRuns());
                System.out.println("range1 : " + rNew1.text());
    Après je récupère le fichier source et le destination et compare les différents paramètres et j'obtiens ceci:
    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
    run:
    Charc : Mr <NOM>
    Charc : 
    Charc : Mr <NOM>
    Charc : 
    Source:
    longueur : 18
    section : 1
    paragraphe : 2
    charactere : 4
    range : Mr <NOM>Mr <NOM>
    Destination:
    longueur : 18
    section : 1
    paragraphe : 1
    charactere : 0
    range1 : Mr <NOM>Mr <NOM>
    BUILD SUCCESSFUL (total time: 0 seconds)
    j'ai joint deux images: des screens de mon fichier source et destination.

    As-tu le même problème?
    Images attachées Images attachées   

  11. #11
    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
    Et en faisant un "insertAfter()" sur mes run, j'ai même 0 paragraphe en sortie:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    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);
                Range r = doc.getRange();
    
                for (int i = 0; i < r.numSections(); i++) {
                    Section s = r.getSection(i);
                    for (int j = 0; j < s.numParagraphs(); j++){
                        Paragraph p = s.getParagraph(j);
                        for (int k = 0; k < p.numCharacterRuns(); k++){
                            CharacterRun c = p.getCharacterRun(k);
                            c.insertAfter("essai");
                            System.out.println("Charc : " + c.text());
                        }
                    }
                }
    
                OutputStream out = new FileOutputStream(oFile);
                try {
                    doc.write(out);
                    out.flush();
                } finally {
                    out.close();
                }
    
                File iFileNew = new File("D:/empty.doc");
                InputStream fisNew = new FileInputStream(iFileNew);
                POIFSFileSystem fsNew = null;
                HWPFDocument docNew = null;
                try {
                    fsNew = new POIFSFileSystem(fisNew);
                } finally {
                    fisNew.close();
                }
                docNew = new HWPFDocument(fsNew);
                Range rNew = docNew.getRange();
                System.out.println("Source:");
                System.out.println("longueur : " + rNew.text().length());
                System.out.println("section : " + rNew.numSections());
                System.out.println("paragraphe : " + rNew.numParagraphs());
                System.out.println("charactere : " + rNew.numCharacterRuns());
                System.out.println("range : " + rNew.text());
    
                File iFileNew1 = new File("D:/doc.doc");
                InputStream fisNew1 = new FileInputStream(iFileNew1);
                POIFSFileSystem fsNew1 = null;
                HWPFDocument docNew1 = null;
                try {
                    fsNew1 = new POIFSFileSystem(fisNew1);
                } finally {
                    fisNew1.close();
                }
                docNew1 = new HWPFDocument(fsNew1);
                Range rNew1 = docNew1.getRange();
                System.out.println("Destination:");
                System.out.println("longueur : " + rNew1.text().length());
                System.out.println("section : " + rNew1.numSections());
                System.out.println("paragraphe : " + rNew1.numParagraphs());
                System.out.println("charactere : " + rNew1.numCharacterRuns());
                System.out.println("range1 : " + rNew1.text());
    J'obtiens dans la console:
    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
    run:
    Charc : Mr <NOM>essai
    Charc : essai
    Charc : Mr <NOM>essai
    Charc : essai
    Source:
    longueur : 18
    section : 1
    paragraphe : 2
    charactere : 4
    range : Mr <NOM>Mr <NOM>
    Destination:
    longueur : 18
    section : 1
    paragraphe : 0
    charactere : 0
    range1 : Mr <NOM>essaiessai
    BUILD SUCCESSFUL (total time: 0 seconds)
    Voila donc je suis un peu perdu, je sais plus quoi tester^^

    Merci.

  12. #12
    Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    ben....je suis dans la même incompréhension que toi.

    moi je n'arrive pas à modifier la structure du document. et toi sans la modifier, tu la perds.

    ce que je comprends intuitivement c'est qu'il analyse ton document en entrée et crée une structure de document pour le lire et en extraire le contenu.
    mais que par contre il ne recopie pas la structure d'entrée. il faudrait trouver un getter qui te donne ta structure et un setter ou un clone pour le nouveau doc.

    va falloir ce replonger dans la javadoc.

    ca m'énerve qu'aussi peu d'exemples soit trouvable sur des fichier doc. toute les exemples du site d'apache ne parle que de fichier excel.

    en parallèle je recherche une autre api qui soit plus documenté. jasper et itext c'est pas pour moi car cela ne concerne que les docx et word à partir de Word 2003. or je dois travailler avec word 2002 !

    c'est a croire que notre problème n'interesse pas grand monde , c'est fou !

    je ne sais pas si je dois pas abandonner poi pour foi. sauf que foi ne génère que du format .rtf, moueff.

  13. #13
    Candidat au Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    a voui, pourrait tu me mettre en lien attaché ton fichier word empty, et non une image de ton fichier.

    je pense que l'on ne travaille pas avec la même version de word, et que ta version du fichier empty est plus acceptable pour poi puisque tu n'as pas le même problème de IndexOutBoundException.

    enfin je dis ca, mais je dis rien....

    sinon tu as regardé si tu pouvais pas travailler avec javadocx, une Api qui génère du .docx et non du .doc mais si tu as une version récente de word, ca pourrais t'aller

  14. #14
    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
    Apache POI a été créé pour traiter des fichiers Excel.
    Pour Word, les API de reporting ou de génération documentaire sont plus adaptés et spécialisés.

    Concernant le format RTF, tu peux nommer le fichier en .doc, Word saura le gérer. Bon après si tu as des macros, des références, etc ; ce n'est pas possible.

    Il me semble qu'il est possible d'utiliser Open Office via une API. Cela pourrait peut-être répondre à vos besoins ?

    Le problème c'est que le format des fichiers Word est assez "obscurs". A partir de 2003, Microsoft a fait des efforts sur la spécification et avec le format Open XML, c'est encore plus le cas.
    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

  15. #15
    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
    *DeLaMure* Voila mon fichier empty.doc créer avec word 2007 et enregistrer en tant que fichier word 2003-2007.

    Avec itext on peut générer des documents word? ou rtf?
    J'ai cru voir qu'il fallait utiliser la classe "RTFDocument" mais moi je n'ai que "PDFDocument".

    *Nemek* Quels sont ces apis de reporting et de génération documentaire, je gère seulement des fichiers doc avec du texte (pas de macros ni références et autres).




    Le format RTF irai pour ce genre d'application: au final j'aimerai avoir un ficher word( ou rtf) qui sera une convocation type, puis modifier ou rajouter des éléments pour la personnaliser avec le nom et le prénom de la personne ainsi que les informations relatives au sujet de la convocation.

    Merci.
    Fichiers attachés Fichiers attachés

  16. #16
    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
    Il y a Jasper Reports / iReport :
    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

  17. #17
    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
    Merci beaucoup Nemek, Jasper est exactement ce qu'il me faut.


    J'ai 2 petits problèmes avec:

    1)
    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
    // - Chargement et compilation du rapport
                JasperDesign jasperDesign = JRXmlLoader.load("D:/Documents and Settings/moi/Mes documents/ConvocationType.jrxml");
                JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
     
    // - Paramètres à envoyer au rapport
                Map parameters = new HashMap();
                parameters.put("NOM", "Moi");
                parameters.put("PRENOM", "Moi");
                parameters.put("LOGICIEL", "log");
                parameters.put("MODULE", "Tableau");
                parameters.put("DATE", "30 aout 2011");
                parameters.put("ADRESSE", "Chez Moi");
     
    // - Execution du rapport
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters);
    // - Création du rapport au format PDF
                JasperExportManager.exportReportToPdfFile(jasperPrint, "D:/classic.pdf");
    Pour générer un pdf ou un html c'est simple(grâce à "JasperExportManager") mais je suis pas arrivé a trouver pour un rtf.
    J'ai vu qu'il fallait utiliser "JRRtfExporter" mais je n'arrive pas a trouver comment.


    2) avec le code si dessus j'ai un rapport avec rien dedans, je pense qu'il y a un problème avec les paramètres dans le jrxml.
    Comment on peut concaténer la valeur du paramètre avec un texte fixe?

    Merci

  18. #18
    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 connais Jasper uniquement de nom, jamais utilisé.

    Je t'invite à marquer ce sujet comme résolu et à en ouvrir un autre dans cette section : http://www.developpez.net/forums/f35...igence/jasper/
    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

  19. #19
    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
    D'accord, merci beaucoup de ton aide.

    Et DeLaMure, j'espère que tu trouveras ce que tu veux.

    A bientôt

+ 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, 18h41
  2. Réponses: 1
    Dernier message: 24/03/2010, 12h49
  3. Créer un fichier .doc coté serveur
    Par Wasrack dans le forum ASP.NET
    Réponses: 3
    Dernier message: 20/03/2009, 14h11
  4. [POI] Créer un fichier
    Par nicotine002 dans le forum Documents
    Réponses: 15
    Dernier message: 23/01/2006, 22h33
  5. [POI] créer un fichier word
    Par systemf dans le forum Documents
    Réponses: 5
    Dernier message: 01/09/2005, 11h13

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