none
Insertion de texte dans un document word via une application C# RRS feed

  • Question

  • Bonjour,

    Je poste ce message car je suis bloqué depuis (trop) longtemps sur mon projet.

    Je dois créer une application C# qui permette d'insérer du texte dans un document word .docx. J'ai cherché un peu partout, j'ai fait des tests en utilisant XML, LinqToXml. Je connais un peu la structure des fichiers xml présents dans un docx, les noeuds et leur contenu, mais je ne sais pas comment y accéder. J'ai actuellement ce code :

    private void button1_Click(object sender, EventArgs e)
            {
                docWord = @"monFichier.docx";
    
                //overture du package en lecture/écriture
                Package officePackage = Package.Open(docWord, FileMode.Open, FileAccess.ReadWrite);
                MessageBox.Show("Fichier chargé avec succès", "Réussi", MessageBoxButtons.OK);
                //mettre ici le code des traitements
    
                //type de contenu pour la partie principale
                const String officeDocRelType = @"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
    
                PackagePart corePart = null;
                Uri documentUri = null;
                //on récupère la partie contenant les propriétés
                foreach (PackageRelationship relationship in officePackage.GetRelationshipsByType(officeDocRelType))
                {
                    // Il n'y a qu'une seule partie de type partType dans le package
                    documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
                    corePart = officePackage.GetPart(documentUri);
                    break;
                }
    
                if (corePart != null)
                {
                     string cpPropertiesSchema = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
                     string dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";
                     string dcTermsPropertiesSchema = "http://purl.org/dc/terms/";
    
                    //construction d'un XmlNamespaceManager contenant les namespaces utilisés
                    NameTable nt = new NameTable();
                    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
                    nsmgr.AddNamespace("dc", dcPropertiesSchema);
                    nsmgr.AddNamespace("cp", cpPropertiesSchema);
                    nsmgr.AddNamespace("dcterms", dcTermsPropertiesSchema);
    
                    //chargement de la partie dans un XmlDocument
                    XmlDocument doc = new XmlDocument(nt);
                    doc.Load(corePart.GetStream());
    
                    XmlNode nodeAuteur = doc.DocumentElement.SelectSingleNode("//dc:creator", nsmgr);
                    if (nodeAuteur != null)
                        labelAuteur.Text = nodeAuteur.InnerText;
    
                    XmlNode nodeTitre = doc.DocumentElement.SelectSingleNode("//dc:title", nsmgr);
                    if (nodeTitre != null)
                        labelTitre.Text = nodeTitre.InnerText;
    
                    XmlNode nodeMotsClefs = doc.DocumentElement.SelectSingleNode("//cp:keywords", nsmgr);
                    if (nodeMotsClefs != null)
                        labelMotsClefs.Text = nodeMotsClefs.InnerText;
    
                    XmlNode nodeDate = doc.DocumentElement.SelectSingleNode("//dcterms:created", nsmgr);
                    if (nodeDate != null)
                        labelDate.Text = DateTime.Parse(nodeDate.InnerText).ToShortDateString();
                }
    
    
    
                //On ferme le package pour éviter un rechargement par erreur
                officePackage.Close();
    }

    Mais mes labels ne changent pas, rien ne se produit visuellement lors du clic sur le bouton.

    Je ne comprends pas comment identifier un noeud et afficher/modifier son contenu.

    Je suis complètement paumé (excusez le terme) et j'aurais besoin d'un peu d'aide...

    Merci d'avance,

    Martin

    mercredi 17 juin 2015 10:45

Réponses

Toutes les réponses

  • Bonjour Martin,

    Je ne connaissais pas cette façon de procéder pour accéder à un document Office, d'habitude je procédais en utilisant les interop d'office. C'est très intéressant...

    Cependant, je vois que vous utilisez un objet de type XmlDocument (ça je connais bien), et je ne vois pas comment cela pourrait être sauvegardé sans faire appel à l'une des méthodes "Save" de XmlDocument...


    Philippe


    • Modifié PhGr_ jeudi 18 juin 2015 07:47
    mercredi 17 juin 2015 15:42
  • Bonjour,

    Peut-être que cet article va vous aider http://www.codeproject.com/Articles/660478/Csharp-Create-and-Manipulate-Word-Documents-Progra. Il explique l'utilisation de la lib DocX qui a l'air de faciliter la manipulation des fichiers DOCX.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    jeudi 18 juin 2015 05:59