SharePoint 2013 : OpenXML au Service de SharePoint 2/5

Posted on

Le SDK OpenXML 2.5 est sorti en version Finale, il y a quelques jours !

Les liens des binaires :

Open XML SDK 2.5 for Microsoft Office : http://www.microsoft.com/en-us/download/details.aspx?id=30425

Open XML MSDN : http://msdn.microsoft.com/en-us/library/office/bb448854(v=office.15).aspx

Deuxième article de notre série, celui-ci va porter sur l’utilisation des Slides PowerPoint. En effet nous allons voir comment créer des Slides dynamiquement

et remplir un tableau avec des données provenant de SharePoint. Nous aborderons en même temps une autre problématique, la possibilité de continuer un tableau sur une autre slide.

NB: Le code sera disponible dans un fichier .ZIP car tout expliquer prendrait vraiment du temps !

PowerPointProcessing

Pour notre exemple je crée une liste contenant plusieurs données en l’occurrence 10 de façon à les splitter dans mes traitements ultérieur:

image

Une fois cela fait je créé un premier PowerPoint ( PPT_DEMOTABLE.pptx ) qui sera utilisé pour mettre un tableau à deux entrées. Cette fichier me servira simplement à “Réflecter” le code depuis les outils

disponible.( Efficace quand on pas trop le temps de connaitre l’ensemble de L’API) Attention le code généré peut faire peur !

image

Mon template PowerPoint ( PPT_TEMPLATE.pptx).

image

Reflect !

Lancez l’outil “Productivity Tool”, chargez notre premier document(PPT_DEMO.pptx ) et cliquez sur “Reflect Code”.

Ce que nous allons faire c’est faire une copie intégrale de la génération d’une Slide qui nous servira de Classe réutilisable. Cette Slide contient la création de notre table.

Alors certes nous pouvons descendre plus bas dans la génération de l’élément mais il restera toujours des dépendances d’un niveau supérieur.

image

Créer la classe “GeneratedClass” et régler les problème d’assembly. Une fois cela fait passons à la génération de notre slide.

Nous créons une méthode – InsertNewSlide – qui nous permettra d’injecter notre nouvelle slide après une position spécifique. Vu que notre classe “ GeneratedClass” retourne un objet “Slide”,

il nous reste plus qu’a l’attacher dans notre méthode.

image

 

Testons notre méthode en lui passant comme paramètre, notre “PresentationDocument”,suivi de la position par exemple “2” et un titre.

Une fois notre programme lancé ( un peu long sous SP2013), une nouvelle slide sera ajoutée juste après la numéro 2 et comportera la même structure de notre template

image

image

Provisionnement

Maintenant que nous pouvons générer nos documents, nous allons faire en sorte de remplir notre tableau dans notre slide, et gérer le fait que si des données dépassent le nombre de ligne désirée dans notre tableau, alors

nous créerons une nouvelle slide ( identique) avec la continuité du tableau initial. Cela permet d’avoir une meilleur lisibilité de nos données.

Voici le bout de code permettant la génération dynamique avec du commentaire pour vous aider à comprendre :

using (PresentationDocument outDoc = PresentationDocument.Open(docstream, true))
  {
     //Point de départ de notre injection
     int slideinjectionid = 2;

     PresentationPart part = outDoc.PresentationPart;
     //récupération des ID de toutes les slides
     OpenXmlElementList slideIds = part.Presentation.SlideIdList.ChildElements;

     SPList spList = web.Lists.TryGetList("demo");
     if (spList != null)
     {
       SPQuery qry = new SPQuery();
       qry.ViewFields = @"<FieldRef Name='Title' /><FieldRef Name='Description' />";

      //Liste pour notre batch de code 
       List<SPListItem> listItemsBatch = spList.GetItems(qry).Cast<SPListItem>().ToList();
      //A chaque saut contenant notre batch de données, on créé une nouvelle slide
       for (int j = 0; j < listItemsBatch.Count; j++)
       {
        var fiveitems = listItemsBatch.Skip(j * 5).Take(5); //Saut de 5 en 5
        int v = fiveitems.Count();
         if (v != 0 && v <= 5)
          {
            int idslide;
            InsertNewSlide(outDoc, slideinjectionid, "MA SLIDE INJECTEE");//Insertion d'une slide
            //récupération de la nouvelle slide pour la passer en courante
            idslide = slideinjectionid;
            string currentrelID = (slideIds[idslide++] as SlideId).RelationshipId;
            SlidePart currentSlide = (SlidePart)part.GetPartById(currentrelID);

             //remplissage du tableau
             foreach (SPListItem item in fiveitems)
             {
               Drawing.Table tbl = currentSlide.Slide.Descendants<Drawing.Table>().First();
               Drawing.TableRow tr = new Drawing.TableRow();
              tr.Height = 60;//Important sinon erreur de génération PowerPoint !
               tr.Append(CreateTextCell(item["Title"] as string));
               tr.Append(CreateTextCell(item["Description"] as string));
                tbl.Append(tr);
               }
            slideinjectionid++;//Incrément pour la slide suivante
          }  }  }
 }

 

Et voilà:

image

Projet sur CodePlex

Le projet étant assez long, je vous upload ce petit projet sur mon codeplex,ainsi vous pourrez mieux comprendre comment la génération de slideet le remplissage de tableau fonctionnent.

http://openxmlppt.codeplex.com/

Enjoy!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s