SharePoint 2013 : OpenXML au Service de SharePoint 3/5

Posted on

Troisième article de notre série consacré à l’utilisation d’OpenXML avec SharePoint 2013 ou 2010, celui-ci sera dédié

à l’utilisation des AltChunk dans nos générations de document WORD.

La problématique est la suivante, comment intégrer du contenu HTML provenant de SharePoint et l’injecter dans notre document.

 

AltChunk Késako ?

 

Dans l’univers OpenXML et normalisé ISO/IEC-29500 Standard Compliance, AltChunk  est défini comme une possibilité d’intégrer des Contenus Externe.

En l’occurrence tout type de format, puisque AltChunk va simplement dans le cadre de document externe établir un lien de relation propre

à l’unicité du Altchunk.  Si l’on schématise cela donne :

image

WordAltChunkProcessing

Dans notre démo nous allons créer un document Word Template en y ajoutant un Content Control en mode Bounding Box :

image

Côté SharePoint, une liste avec une colonne de type HTML où j’ai ajouté un tableau.

image

Dans un premier temps je déclare une classe HTMLBUILDER qui me permettra de mettre mon code SharePoint entre mes balises HTML, dans cette classe j’y déclare une méthode StringBuilder.

public StringBuilder BuilderHtml(string paramhtml)
        {
            StringBuilder xhtmlBuilder = new StringBuilder();
            xhtmlBuilder.Append("<html>");
            xhtmlBuilder.Append("<body>");
            xhtmlBuilder.Append(paramhtml);
            xhtmlBuilder.Append("</body>");
            xhtmlBuilder.Append("</html>");

            return xhtmlBuilder;
        }

 

Une fois ma classe mise en place, j’entame la création d’une méthode qui s’intitule AltChunkMethod

qui aura la capacité de lire mon document word, de récupérer le ContentControl avec

l’alias défini et ensuite de renseigner un nom (ID, de préférence unique) pour créer un altchunk.

    protected static void AltChunkMethod(WordprocessingDocument outDoc, string htmlbuilder, string alias,
string chunkid)
        {
            string altChunkId = chunkid;//se doit d'être unique
            AlternativeFormatImportPart chunk = outDoc.MainDocumentPart.AddAlternativeFormatImportPart
                (AlternativeFormatImportPartType.Xhtml, altChunkId);
            //Utilisation en mémoire d'html
            using (MemoryStream xhtmlStream = new MemoryStream(Encoding.UTF8.GetBytes(htmlbuilder)))
            {
                chunk.FeedData(xhtmlStream);//Injection html

                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;

                //Parcours dans le document à la recherche d'alias
                var resprocess = from bm in outDoc.MainDocumentPart.Document.Body.Descendants<SdtAlias>()
                                 where bm.Val.Value == alias
                                 select bm;
                var process = resprocess.SingleOrDefault();
                var parent = process.Parent;

                parent.InsertAfterSelf(altChunk);//Insertion dans le ContentControl

            }
        }

Il ne me reste plus qu’a injecter mon contenu HTML. de la façon suivante :

foreach (SPListItem item in listitems)
 {
    /*HTML-RTE*/
    HtmlBuilder html_builder = new HtmlBuilder();
    StringBuilder xhtmlBuilder = html_builder.BuilderHtml(item["Description"].ToString());
    AltChunkMethod(outDoc, xhtmlBuilder.ToString(), "altchunk", "chunkid");
}

Résultat

image

Remarques

Si vous avez plusieurs ContentControl pouvant héberger de l’html, vous vous devrez de rendre l’id du Altchunk unique à chaque parcours, ainsi lors du parcours des items de la liste,vous ne vous retrouverez pas avec toutes vos données dans un seul ContentControl

Projet CodePlex

Vous pouvez trouvez les ressources sur codeplex : http://openxmlaltchunk.codeplex.com/

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