Insertion de texte dans un document word via une application C#
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 :
Code:
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
| 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.
Les directives using suivantes sont insérées dans mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.IO.Packaging; |
Et je n'ai aucune erreur générée venant d'un éventuel problème d'assembly.
Je suis complètement paumé (excusez le terme) et j'aurais besoin d'un peu d'aide...
Merci d'avance,
Martin