Ouvrir un document de traitement de texte à partir d’un flux
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin d’ouvrir par programmation un document Word de traitement à partir d’un flux.
Quand ouvrir un document à partir d’un flux
Si vous disposez d’une application, telle qu’une application SharePoint, qui fonctionne avec des documents à l’aide d’une entrée/sortie de flux, et que vous souhaitez utiliser le Kit de développement logiciel (SDK) Open XML pour travailler avec l’un des documents, cela est conçu pour être facile à faire. Cela est particulièrement vrai si le document existe et que vous pouvez l’ouvrir à l’aide du Kit de développement logiciel (SDK) Open XML. Mais supposez que le document est un flux ouvert au point dans votre code où vous devez employer le kit SDK pour travailler dessus ? Il s’agit du scénario discuté dans cette rubrique. L’exemple de méthode dans l’exemple de code accepte un flux ouvert en tant que paramètre, puis ajoute du texte au document derrière le flux à l’aide du Kit de développement logiciel (SDK) Open XML.
Création d'un objet WordprocessingDocument
Dans le kit de développement logiciel (SDK) Open XML, la classe WordprocessingDocument représente un package de document Word. Pour travailler sur un document Word, créez d'abord une instance de la classe WordprocessingDocument à partir du document, puis travaillez sur cette instance. Lorsque vous créez l’instance à partir du document, vous pouvez accéder au composant document principal qui contient le texte du document. Chaque package Open XML contient plusieurs composants. Au minimum, un WordProcessingDocument doit contenir un composant de document principal qui sert de conteneur pour le texte principal du document. Le package peut également contenir des composants supplémentaires. Notez que dans un document Word, le texte du composant de document main est représenté dans le package au format XML à l’aide du balisage WordprocessingML.
Pour créer la classe instance à partir du document, appelez la méthode Open(Stream, Boolean). Plusieurs méthodes Open sont fournies, chacune avec une signature différente. L’exemple de code de cette rubrique utilise la méthode Open avec une signature qui requiert deux paramètres. Le premier paramètre prend un pointeur vers le flux à partir duquel ouvrir le document. Le second paramètre a la valeur true ou false et indique si le flux est ouvert pour modification.
L'exemple de code suivant appelle la méthode Open.
// Open a WordProcessingDocument based on a stream.
WordprocessingDocument wordprocessingDocument =
WordprocessingDocument.Open(stream, true);
Structure d’un document WordProcessingML
La structure de base d’un document WordProcessingML se compose des éléments document et body , suivis d’un ou plusieurs éléments de niveau bloc tels que p, qui représente un paragraphe. Un paragraphe contient un ou plusieurs éléments r. Le r signifie « run » (exécution), qui est une zone de texte avec un ensemble de propriétés courant, comme par exemple la mise en forme. Une exécution contient un ou plusieurs éléments t. L'élément t contient une plage de texte. L’exemple de code suivant montre le balisage WordprocessingML pour un document qui contient le texte « Exemple de texte ».
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
À l’aide du Kit de développement logiciel (SDK) Open XML, vous pouvez créer une structure de document et du contenu à l’aide de classes fortement typées qui correspondent à des éléments WordprocessingML . Vous trouverez ces classes dans l'espace de noms DocumentFormat.OpenXml.Wordprocessing . Le tableau suivant répertorie les noms des classes qui correspondent aux éléments document, body, p, r et t.
Élément WordprocessingML | Classe du Kit de développement logiciel (SDK) Open XML | Description |
---|---|---|
document | Document | Élément racine de la partie principale du document. |
body | Body | Conteneur des structures de niveau bloc, telles que paragraphs, tables, annotations et autres structures décrites dans la spécification ISO/IEC 29500. |
p | Paragraph | Paragraphe. |
r | Run | Exécution. |
t | Text | Plage de texte. |
Pour plus d’informations sur la structure globale des parties et éléments d’un document WordprocessingML, consultez Structure d’un document WordprocessingML.
Fonctionnement de l’exemple de code
Lors de l’ouverture du package de document Word, vous pouvez ajouter du texte au composant document principal. Pour accéder au corps du composant document principal, assignez une référence au corps de document existant, comme illustré dans le segment de code suivant.
// Assign a reference to the existing document body.
Body body = wordprocessingDocument.MainDocumentPart.Document.Body;
Lorsque vous accédez au corps du composant document principal, ajoutez du texte en ajoutant des instances des classes Paragraph, Run et Text. Cela génère le balisage WordprocessingML requis. Les lignes suivantes de l’exemple de code ajoutent le paragraphe, la séquence et le texte.
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
Exemple de code
La méthode OpenAndAddToWordprocessingStream illustrée ici permet d’ouvrir un document Word à partir d’un flux déjà ouvert et d’ajouter du texte à l’aide du Kit de développement logiciel Open XML. Pour appeler cette méthode, passez un pointeur vers un flux ouvert comme premier paramètre et le texte à ajouter comme second paramètre. Par exemple, le code suivant ouvre le fichier Word13.docx dans le dossier Documents publics et y ajoute du texte.
string strDoc = @"C:\Users\Public\Public Documents\Word13.docx";
string txt = "Append text in body - OpenAndAddToWordprocessingStream";
Stream stream = File.Open(strDoc, FileMode.Open);
OpenAndAddToWordprocessingStream(stream, txt);
stream.Close();
Remarque
Notez que la méthode OpenAddAddToWordprocessingStream ne ferme pas le flux qui lui est passé. Cette opération doit être effectuée par le code appelant.
Voici l’exemple de code complet en C# et Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;
static void OpenAndAddToWordprocessingStream(Stream stream, string txt)
{
// Open a WordProcessingDocument based on a stream.
WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(stream, true);
// Assign a reference to the existing document body.
MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart ?? wordprocessingDocument.AddMainDocumentPart();
mainDocumentPart.Document ??= new Document();
Body body = mainDocumentPart.Document.Body ?? mainDocumentPart.Document.AppendChild(new Body());
// Add new text.
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
run.AppendChild(new Text(txt));
// Dispose the document handle.
wordprocessingDocument.Dispose();
// Caller must close the stream.
}