Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

6 septembre 2007 4 06 /09 /septembre /2007 23:51
SDK Open XML – présentation rapide

Pour télécharger le SDK c’est ici

       -          Ajouter une référence au SDK Open XML de Microsoft
-          Ajouter une référence à windowbase (dll du framework .NET 3.0)
I Bien comprendre la structure du SDK
 
SDKOpenXml-copie-1.JPG
-          OpenXmlPackage et OpenXmlPart héritent de la classe abstraite OpenXmlContainer et disposent donc de ses méthodes
-          WordProcessingDocument (pour Word),SpreadsheetDocument(pour excel),PresentationDocument(pour Powerpoint) sont les classes de bases pour le management des packages,celles-ci héritent de la classe abstraite OpenXmlPackage,
 
Inconvénient on ne peut pas faire
  OpenXmlPackage wordprocessingDocument = new WordprocessingDocument();
 
>Il faut passer par les méthodes static Open et Create de WordProcessingDocument,SpreadsheetDocument,PresentationDocument … je trouve cela dommage cela empêche une certaine abstraction
>Toutes les parts héritent de la classe abstraite  OpenXmlPart  (chaque classe dispose donc de ses méthodes ainsi que celles de OpenXmlPart)
>Les différentes classes de parts (héritant donc de openXmlPart) ne disposent ni de constructeur , on n’a pas non plus de méthode static permettant de les créer, il faut obligatoirement passer par les méthodes offertes, c’est un second point noir je trouve
II – Lecture
Note : les exemples se basent sur word mais pour excel et powerpoint c’est exactement la même démarche
1 – Ouvrir un package
            // ouvrir un package
            WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(@"C:/Documents and Settings/romagny/Mes documents/test.docx",true);// document word
            SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(@"C:/Documents and Settings/romagny/Mes documents/test.xlsx", true);// classeur excel
            PresentationDocument presentationDocument = PresentationDocument.Open(@"C:/Documents and Settings/romagny/Mes documents/test.pptx", true);// presentation powerpoint
 
 
2 –  obtenir et lister les parts d’un package
// lister les parts (attention : ne liste pas les fichiers de relations .rels)
            IEnumerator<IdPartPair> enumerator = wordprocessingDocument.Parts.GetEnumerator();
            while (enumerator.MoveNext())
            {
                TreeNode t = new TreeNode(enumerator.Current.OpenXmlPart.Uri.ToString());
                treeView1.Nodes.Add(t);
                IEnumerator<IdPartPair> enumerator2 = enumerator.Current.OpenXmlPart.Parts.GetEnumerator();
                while (enumerator2.MoveNext())
                {
                    t.Nodes.Add(enumerator2.Current.OpenXmlPart.Uri.ToString());
                }
 
            }
 
Grâce à windowbase
            // obtenir toutes les parts du package
            PackagePartCollection parts = wordprocessingDocument.Package.GetParts();
 
            // lister toutes les parts du package(avec windowbase liste egalement les fichiers de relations .rels)
            IEnumerator<PackagePart> enumerator = wordprocessingDocument.Package.GetParts().GetEnumerator();// package.Parts.GetEnumerator();
            while (enumerator.MoveNext())
            {
                treeView1.Nodes.Add(enumerator.Current.Uri.ToString());
            }
 
3 – Accèder à une part
            MainDocumentPart mainDocumentPart = wordprocessingDocument.MainDocumentPart;// obtient /word/document.xml
            // accéder à une part
            OpenXmlPart part = wordprocessingDocument.GetPartById("rId1"); //par id
 
 
Par windowbase on peut accéder par l’uri
            PackagePart part = wordprocessingDocument.Package.GetPart(new Uri("/word/document.xml", UriKind.Relative));
 
4 – Récupérer les properties du package
    // récupérer les properiétés du package (Creator,Keywords,LastModified,etc.)
            PackageProperties properties = wordprocessingDocument.PackageProperties;
 
5 – Validation package ,d’une part
         private void button1_Click(object sender, EventArgs e)
        {         
            // validation du package
            OpenXmlPackageValidationSettings validationSettings = new OpenXmlPackageValidationSettings();
            validationSettings.EventHandler += new EventHandler<OpenXmlPackageValidationEventArgs>(validationSettings_EventHandler);
            wordprocessingDocument.Validate(validationSettings);
 
            // validation d'une part
            mainDocumentPart.ValidateXml(@"C:/Program Files/romagny13/Cs3OpenXmlManager v 1.0/schemas/wml.xsd", new System.Xml.Schema.ValidationEventHandler(validationPart_EventHandler));
      
        }
 
        void validationSettings_EventHandler(object sender, OpenXmlPackageValidationEventArgs e)
        {
            MessageBox.Show(e.Message);
        }
        void validationPart_EventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
        {
            MessageBox.Show(e.Message);
        }
 
 
 
III – Ecriture
Note : ici je ne crées pas toutes les parts d’un package word, ce n’est qu’un exemple montrant
1 comment créer un nouveau package
2 ajouter une part « prédéfinie »
3 créer et ajouter une part quelconque
using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Create(@"C:/new.docx", WordprocessingDocumentType.Document))
            {
                // à ce niveau aucune part n'est présente dans le package (seul [Content_Types].xml est présent)
                wordprocessingDocument.AddCoreFilePropertiesPart(); // création /docProps/Core.xml
               
                wordprocessingDocument.AddMainDocumentPart(); // création de /word/document.xml
                using (Stream stream = wordprocessingDocument.MainDocumentPart.GetStream())
                {
                    byte[] buffer = (new UTF8Encoding()).GetBytes(@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
                                                        <w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
                                                            <w:body><w:p><w:r><w:t>Hello world!</w:t></w:r></w:p></w:body>
                                                        </w:document>");
                    stream.Write(buffer, 0, buffer.Length);
                }
 
                // ajout d'une part(ici par exemple une ImagePart) ,il faut passer par MainDocumentPart ici
                ImagePart imagePart = wordprocessingDocument.MainDocumentPart.AddImagePart(ImagePartType.Jpeg); // ou content type
                using (FileStream stream = new FileStream(@"C:/Documents and Settings/romagny/Mes documents/Mes images/monimage.jpg", FileMode.Open))
                {
                    imagePart.FeedData(stream);
                }
            }          
 
 
J’ai développé un outil pour openXML , il se peut que je mette à jour avec le SDK Open XML de Microsoft , vous pouvez le trouver sur Codeplex
 
 

Partager cet article

Repost 0
Published by Romagny13 - dans Office
commenter cet article

commentaires