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] Manipuler fichier .docx


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 116
    Par défaut [POI] Manipuler fichier .docx
    Bonjour à tous,

    je souhaite ajouter un fichier XML de données (fichier personnalisé) à mon fichier .docx
    Je suis presque arrivé à faire ce que je voulais, mais je rencontre un dernier (enfin j'espère ).

    En parcourant plusieurs sites, j'ai fini par comprendre qu'il fallait ajouter (notamment) le fichier /customXml/item1.xml et le /customXml/itemProps1.xml
    Pour ajouter le fichier /customXml/item1.xml qui contient mes données, j'ai procédé comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private static void addCustomXmlPart(OPCPackage opcPackage, String xml) 
    throws IOException, InvalidFormatException, org.apache.poi.openxml4j.exceptions.InvalidFormatException {
            PackagePartName partName = PackagingURIHelper.createPartName("/customXml/item1.xml");
            opcPackage.getParts();
            PackagePart part = opcPackage.createPart(partName, ContentTypes.CUSTOM_XML_PART);
            OutputStream outputStream = part.getOutputStream();
            outputStream.write(xml.getBytes());
            outputStream.close();
            part.addRelationship(partName, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML);
    }
    Le fichier /customXml/itemProps1.xml doit être de la forme suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8" standalone="true"?>
    <ns1:datastoreItem ns1:itemID="{43c3fce5-a408-416d-b13f-3a332456c532}" xmlns:ns1="http://schemas.openxmlformats.org/officeDocument/2006/customXml"/>
    Le problème, c'est que je ne trouve pas de méthode dans POI pour générer la clé unique (datastoreItem)

    J'ai trouvé des sites qui expliquent comment faire avec doc4j

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CustomXmlDataStoragePropertiesPart part = new CustomXmlDataStoragePropertiesPart();
    org.docx4j.customXmlProperties.ObjectFactory of = new org.docx4j.customXmlProperties.ObjectFactory();
    DatastoreItem dsi = of.createDatastoreItem();
    Mais avec POI, comment doit-on faire ?

    D'avance merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 116
    Par défaut
    Bonjour à tous.
    J'ai trouvé une solution à mon problème.
    Pour rappel, dans une application Java, je souhaite ajouter un fichier XML de données à un document .docx de manière à pouvoir manipuler ces données dans une application externe. L'idée est de pouvoir embarquer les données directement dans la "structure" du document .docx
    Ce que je ne savais pas faire, c'était de générer une clé unique
    Le problème, c'est que je ne trouve pas de méthode dans POI pour générer la clé unique (datastoreItem)
    Bon à priori, dans mon cas, il n'est pas nécessaire de la générer.
    Le nouveau document .docx est parfaitement lisible et lorsque je boucle (en VB/VSTO) sur les CustomXMLPart, je retrouve bien mon fichier XML de données, donc c'est OK pour moi !!

    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
     
    //================================================================================
    /**
    * Ajoute un fichier XML de données au document .docx
    * @param <b>opcPackage</b>  E : instance OPCPackage sur le document .docx
    * @param <b>filexml</b>  E : Nom du fichier XML de données
    * @exception Exception
    */
    //================================================================================
    public static void addCustomXmlPart2(OPCPackage opcPackage, String filexmldata)
    throws InvalidFormatException, IOException
    {
        try
        {
            //+ Création du CustomXMLPart
        	PackagePartName partNameItemProps = PackagingURIHelper.createPartName("/customXml/itemProps1.xml");
    	PackagePart wpartItemProps = opcPackage.createPart(partNameItemProps, ContentTypes.CUSTOM_XML_PART);
    	OutputStream outputStream = wpartItemProps.getOutputStream();
     
    	//+ Ecritre des données du fichier XML de données dans le CustomXMLPart 
    	outputStream.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n".getBytes());
    	outputStream.write("<xmlns:ds=\"http://schemas.openxmlformats.org/officeDocument/2006/customXml\"/>\n".getBytes());
    	//+ Fermeture des différents buffer
    	outputStream.close();
     
    	//+ Création du CustomXMLPart
        	PackagePartName partNameItem = PackagingURIHelper.createPartName("/customXml/item1.xml");
    	PackagePart partItem = opcPackage.createPart(partNameItem, ContentTypes.PLAIN_OLD_XML);
    	outputStream = partItem.getOutputStream();
    	//+ Ecritre des données du fichier XML de données dans le CustomXMLPart 
    	FileInputStream in = new FileInputStream(filexmldata);
    	BufferedInputStream inBuffer = new BufferedInputStream(in);
    	int theByte = 0;
    	while ((theByte = inBuffer.read()) > -1)
    	{
    	    outputStream.write(theByte);
    	}
    	//+ Fermeture des différents buffer
    	outputStream.close();
    	inBuffer.close();
    	in.close();
     
    	//+ Ajoute la relation du CustomXMLPart (Obligatoire pour respecter la structure du document .docx) => /customXml/_rels/item1.xml.rels
    	partItem.addRelationship(partNameItemProps, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML);
     
    	//+ Ajoute la relation du CustomXMLPart avec le document principal (Obligatoire pour respecter la 
    	//+ structure du document .docx) ==> /word/_rels/document.xml.rels
    	PackagePartName mainDocumentPartName = PackagingURIHelper.createPartName("/word/document.xml");
    	PackagePart mainDocumentPart = opcPackage.getPart(mainDocumentPartName);
    	mainDocumentPart.addRelationship(partNameItem, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML);
        }
        catch (Exception e)
        {
     
        }
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 116
    Par défaut
    Comme souvent, on publie des solutions qui ne sont pas toujours complètes, car les tests effectués plus tard nous obligent à revenir en arrière sur certaines lignes ou à faire évoluer le code car on était passé à côté d'un problème...

    Voici donc ma méthode qui permet d'ajouter les données contenues dans un fichier de données (format xml) dans la partie customXml d'un document .docx

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    //================================================================================
    /**
    * Ajoute un fichier XML de données au document .docx
    * @param <b>opcPackage</b>  E : instance OPCPackage sur le document .docx
    * @param <b>filexmldata</b>  E : Fichier XML contenant les données à rajouter au .docx
    * @exception Exception
    */
    //================================================================================
        public void addCustomXmlPart(OPCPackage opcPackage, String filexmldata)
        throws Exception
        {
        	try
        	{
        	    boolean bCustomXML = false;
        	    Iterator<PackagePart> it = opcPackage.getParts().iterator();
        	    PackagePart partCustom = null;
                //+ Vérification qu'il n'existe pas déjà une partie customXml dans le document .docx
                while (it.hasNext())
                {
        		partCustom = (PackagePart)it.next();
        		if (partCustom.getContentType().equals(ContentTypes.CUSTOM_XML_PART))
        		{
    	            bCustomXML = true;
    	            break;
        		}
                }
     
        	    OutputStream outputStream = null;
        	    PackagePartName partNameItemProps = null;
        	    PackagePart wpartItemProps = null;
        	    if (!bCustomXML)
        	    {
        		//+ Création du CustomXMLPart dans le cas où il n'existe pas
    		partNameItemProps = PackagingURIHelper.createPartName("/customXml/itemProps1.xml");
        	        wpartItemProps = opcPackage.createPart(partNameItemProps, ContentTypes.CUSTOM_XML_PART);
        		outputStream = wpartItemProps.getOutputStream();
        		//+ Ecriture du fichier itemProps1.xml dans le CustomXMLPart 
        	        outputStream.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n".getBytes());
        	        outputStream.write("<xmlns:ds=\"http://schemas.openxmlformats.org/officeDocument/2006/customXml\"/>\n".getBytes());
        	        //+ Fermeture des différents buffer
        	        outputStream.close();
        	    }
     
        	    PackagePartName partNameItem = PackagingURIHelper.createPartName("/customXml/myCustomXml.xml");
    	    PackagePart partItem = opcPackage.createPart(partNameItem, ContentTypes.PLAIN_OLD_XML);
    	    outputStream = partItem.getOutputStream();
    	    //+ Ecriture des données du fichier XML de données dans le CustomXMLPart
    	    FileInputStream in = new FileInputStream(filexmldata);
    	    BufferedInputStream inBuffer = new BufferedInputStream(in);
    	    BufferedReader r = new BufferedReader(new InputStreamReader(inBuffer, StandardCharsets.ISO_8859_1));
    	    String line = new String("");
    	    while ((line = r.readLine())!= null)
    	    {
    	       	line = Utilities.rTrim(line);
    	       	line = Utilities.lTrim(line);
    	       	outputStream.write(line.getBytes());
    	    }
    	    //+ Fermeture des différents buffer
    	    outputStream.close();
    	    inBuffer.close();
    	    in.close();
     
    	    if (!bCustomXML)
    	    {
    	       	//+ Lorsque le partie customXml n'existe pas dans le document .docx d'origine, on doit ajouter la relation du CustomXMLPart 
                    //+ (Obligatoire pour respecter la structure du document .docx)   =>customXml/_rels/item1.xml.rels
    	        partItem.addRelationship(partNameItemProps, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML);
    	    }
    	    //+ Ajoute la relation du CustomXMLPart avec le document principal (Obligatoire pour respecter la 
    	    //+ structure du document .docx) ==> /word/_rels/document.xml.rels
    	    PackagePartName mainDocumentPartName = PackagingURIHelper.createPartName("/word/document.xml");
    	    PackagePart mainDocumentPart = opcPackage.getPart(mainDocumentPartName);
    	    mainDocumentPart.addRelationship(partNameItem, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML);
        	}
        	catch (Exception ex)
    	{
        		throw ex;
        	}
        }

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

Discussions similaires

  1. Ajouter une image au fichier.docx utilisant POI
    Par InfOCynO dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 28/01/2013, 14h20
  2. [POI] Copie de fichiers .docx
    Par magicsmacks dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 25/11/2012, 17h31
  3. Manipulation fichier excel : quel langage ?
    Par HaTnuX dans le forum Windows
    Réponses: 7
    Dernier message: 14/04/2006, 19h34
  4. manipulation fichier avec Mysql
    Par poulacou dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/03/2006, 09h50
  5. Manipulation Fichiers Audio
    Par black is beautiful dans le forum Audio
    Réponses: 5
    Dernier message: 11/12/2005, 22h21

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