Fabien Reinle
Comment manipuler simplement le contenu d'un fichier WordML ?
Manipulations autour du format WordML
Par Fabien Reinle publié le 14/05/2008 à 23:55, lu 4812 fois, 6 pages
 5 | Lecture d'un fichier
Je vous propose dans cette partie de lire le contenu du fichier qui a été créée précédemment et d'afficher sur la console le texte ainsi que le style utilisé.
 
/content/35e43e13-225f-4111-8b10-91b579dc1744/read.png
 
Il faut avant tout récupérer le contenu de la partie principale du fichier (word/document.xml) sous forme textuelle.
 
/content/35e43e13-225f-4111-8b10-91b579dc1744/content_xml.png
 
Le SDK OpenXML nous permet de réaliser cette opération très simplement. Nous ouvrons le package (le fichier *.docx) et récupérons le Stream sous-jacent.

//  Ouverture du fichier 'sample.docx'

using (WordprocessingDocument package = WordprocessingDocument.Open(fileName, false))

{

    //  Partie principale du document (word/document.xml)

    MainDocumentPart mainPart = package.MainDocumentPart;

 

    //  Flux associé à la partie principale du document

    using (Stream stream = mainPart.GetStream())

    {

        using (StreamReader reader = new StreamReader(stream))

        {

            string innerXml = reader.ReadToEnd();

        }

    }

}

Une fois que l'on à récupéré le contenu de la partie principale sous forme textuelle, nous pouvons récupérer le modèle objet du document.Le code généré par l'outil propose 3 méthodes pour instancier le modèle:
  • LoadFromBinary
  • LoadFromFile
  • LoadFromString
Nous utiliserons pour cela la méthode suivante:

wml2 inner = wml2.LoadFromString(innerXml);

La première étape consiste à accéder au corps du document (élément body):

//  Lecture de l'élément racine du document: 'document'

CT_Document ct_document = inner.document.First;

 

//  Lecture du corps du document: 'body'

CT_Body ct_body = ct_document.body.First;

A partir du corps, on peut accéder à tous les élements définis dans la spécification du format WordML (paragraph, run, text, ...)

//  Lecture des paragraphes

foreach (CT_P ct_paragraph in ct_body.p)

{

    //  Affichage du texte de chaque paragraphe

    StringBuilder sb = new StringBuilder();

 

    //  Lecture des run

    foreach (CT_R ct_run in ct_paragraph.r2)

    {

        //  Lecture des text

        foreach (CT_Text ct_text in ct_run.t)

            sb.Append(ct_text.Value);

    }

 

    Console.WriteLine("Text: " + sb.ToString());

}

 
» Démarrer une discussion