SharePoint 2010 : OpenXML au Service de SharePoint 1/5

Posted on

Commençons par notre première série d’article à travers l’utilisation de “Open XML” pour la génération de documents sous SharePoint.

Le but de cette série est de partager sur les différentes problématiques rencontrées lors de l’utilisation de l’API Open XML sous SharePoint.

Rappel sur le format Open XML

Plutôt que de vous faire une è-nième présentation d’Open XML je vous envoie vers quelques ressources qui vous seront forte utiles pour la compréhension des différentes codes abordés.

Je me baserai sur des exemples du SDK 2.0 plutôt que sur la version CTP 2.5.

Bien que certaines classes ont été dépréciées bon nombre des codes utilisés sont maintenable et ne présentent pas une grande difficulté a porter.

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

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

Open XML Developer : http://openxmldeveloper.org/

WordProcessing

Rentrons dans le vif du détail par un petit exemple ou j’ai besoin d’alimenter un tableau dont mes données sont stockées dans SharePoint.

Je créé un tableau de 4 colonnes puis dans mon onglet Développeur, je rajoute un Content Control de type “ Rich Text” au dessus de mon tableau de façon à l’entourer et je lui donne comme nom “tabA”

image_thumb3

Ce document fera office de Template une fois que cela est j’ai une liste SharePoint qui contient 3 items que je vais répéter en ajoutant de façon dynamique à mon tableau.

image_thumb5

Code Inside

using System;
using Microsoft.SharePoint;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
using W = DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Linq;
using System.Collections.Generic;


namespace OpenXMLDemo
{
    public class Program
    {
        private const string url = "http://spvm/sites/demo";

        public static void Main(string[] args)
        {
            Console.WriteLine("/*Génération Document Word Sample*/n");
            GenerateDocument();
            Console.WriteLine("/*Fin*/n");
            Console.ReadKey();
        }


    private static void GenerateDocument()
    {
      Stream docstream = null;
      using (SPSite site = new SPSite(url))
       {
        SPWeb web = site.OpenWeb();
        SPFile spf = web.GetFile("Shared Documents/word-demo.docx");
         if (!spf.Exists)
           { Console.WriteLine("Le Document n'éxiste pasn");}
         else
          { docstream = spf.OpenBinaryStream(); }
         if (docstream != null)
           {Console.WriteLine("Début de la phase de WordProcessingn");
             using (WordprocessingDocument outDoc = WordprocessingDocument.Open(docstream, true))
            {
               MainDocumentPart mainPart = outDoc.MainDocumentPart;
               List<SdtElement> sdtListB = mainPart.Document.Descendants<SdtElement>().ToList();
               SdtElement sB = mainPart.Document.Body.Descendants<SdtElement>().
               Where(r => r.SdtProperties.GetFirstChild<W.Tag>().Val == "tabA").Single();
               W.Table theTable = sB.Descendants<W.Table>().Single();
               W.TableRow theRow = theTable.Elements<W.TableRow>().Last();


                SPList spList = web.Lists.TryGetList("demo");

                 if (spList != null)
                  {
                   SPQuery qry = new SPQuery();
                   qry.ViewFields = @"<FieldRef Name='_x0063_ol1' />" +
                   "<FieldRef Name='_x0063_ol2' /><FieldRef Name='_x0063_ol3' />" +
                    "<FieldRef Name='_x0063_ol4' />";

                    SPListItemCollection listItems = spList.GetItems(qry);
                    foreach (SPListItem item in listItems)
                    {
                        W.TableRow rowCopy = (W.TableRow)theRow.CloneNode(true);

                        rowCopy.Descendants<W.TableCell>().ElementAt(0).Append(new Paragraph
                           (new Run(new W.Text(item["_x0063_ol1"] as string))));
                        rowCopy.Descendants<W.TableCell>().ElementAt(1).Append(new Paragraph
                            (new Run(new W.Text(item["_x0063_ol2"] as string))));
                        rowCopy.Descendants<W.TableCell>().ElementAt(2).Append(new Paragraph
                           (new Run(new W.Text(item["_x0063_ol3"] as string))));
                        rowCopy.Descendants<W.TableCell>().ElementAt(3).Append(new Paragraph
                          (new Run(new W.Text(item["_x0063_ol4"] as string))));
                        theTable.AppendChild(rowCopy);

                    }



                }


               outDoc.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);

             }

           CREATE_OUTPUT_DOC(web, docstream, "word_output", ".docx");

                }
            }

    }


        private static void CREATE_OUTPUT_DOC(SPWeb web, Stream outputStream, string filename, string ext)
        {
            try
            {
                SPList outputLibrary = web.Lists.TryGetList("Shared Documents");


                if (outputLibrary != null)
                {

                    string outputFileUrl = string.Format("{0}/{1}",
                        outputLibrary.RootFolder.ServerRelativeUrl, filename + ext);

                    web.AllowUnsafeUpdates = true;
                    outputLibrary.RootFolder.Files.Add(outputFileUrl, outputStream);
                    web.Update();

                    if (outputStream != null)
                    {
                        outputStream.Dispose();
                    }
                    Console.WriteLine("Le Document a bien été générén");

                }

            }
            catch (Exception ex)
            {
                Console.WriteLine("Erreur de création de Documentn :" + ex.ToString());

            }
        }
    }
}

Lançons notre Application

Vous lancez le code Snippet fournit et normalement si tout ce passe bien vous devriez avoir un nouveau document office avec vos données à l’intérieur

image_thumb7

Résultat

image_thumb10

A bientôt pour le prochain article !

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