Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Julien Chable

He blogs, you blog, I blog ...

Archives

[Open XML] Le Custom XML & les Content Controls par la pratique

La puissance et la flexibilité du format Open XML ne sont pas seulement dû à sa structure Open Packaging et aux fonctionnalités riches de ses formats héritées de la suite Office. Open XML apporte également un certains nombres de nouvelles capacités, celle que l'on appelle le Custom XML ou 'schéma métier' est parmi les plus importantes. Cette fonctionnalité permet d'associer les données d'une structure XML métier (associé ou non à un schéma) à un document, et ainsi de pouvoir afficher/modifier - cela marche de façon bidirectionnelle - ces données directement depuis le document.

En réalité Custom XML permet d'approcher les schémas métiers de différentes manières, en utilisant du custom markup language, le databinding avec les Content Control, etc ... Dans ce post, je vais uniquement traiter de la façon d'utiliser d'un côté le databinding des Content Control pour pouvoir embarquer des données métiers dans le document Open XML, et de l'autre utiliser la sérialisation XML pour créer et manipuler le XML.

Vous trouverez les sources en pièce jointe de ce post.

Le scénario (simple !)

Admettons que vous vouliez avoir une représentation dans Word d'un document XML issu de votre système d'informations (CRM, LOB, base de données, etc).

Par exemple, la fiche d'un partenaire :

image  

possédant le schéma XML (le schéma "métier") suivant :

image

Vous voudriez une représentation de votre XML dans un document Word (Excel également), volontairement très simplifiée ici, similaire à cela :

image

L'idée ici est d'associer des zones de textes identifiées dans votre document avec des données de la structure XML embarquée dans le document. Le format Open XML possède justement ce genre de conteneur, c'est ce que l'on appelle les Content Control.

Ces Content Control servent principalement à deux choses :

  • Identifier un emplacement spécifique dans un document,
  • Aider à la saisir de l'utilisateur (un control de tye date proposera par exemple un calendrier pour faciliter sa saisie)

Voici un exemple d'un Content Control de type texte (il en existe de type texte riche, date, image, etc à peu près pour tout type de données et représentation) :

image

Pour résumer voici ce que nous voulons et pouvons faire grâce aux Content Controls :

image

Mise en place de votre document

Afin de mettre en place des Content Controls dans un document, vous devez utiliser l'onglet 'Développeur' (activer le dans les options générales de Word) :

image

Ensuite composez votre document et affectez un nom dans les propriétés du Content Control :

image

Une fois la structure et la mise en page de votre document et de vos Content Control, passez à l'étape de binding entre ceux-ci et la structure XML que vous voulez embarquer.

Dans la version initiale de Word 2007 (MS : entendez par là que l'on aimerait bien cette fonctionnalité pour la prochaine version ou SP !), il n'y a pas de fonctionnalité d'association XML/Content Control (en revanche Excel 2007 en est dôté). Pour palier à ce manque, Microsoft à mis à disposition sur Codeplex un projet Open Source permettant d'effectuer ce databinding. Cet outil est nommé Word Content Control Toolkit.

Vous pouvez télécharger ce logiciel à l'adresse suivante : http://www.codeplex.com/dbe

Pour effectuer la liaison entre les Content Control et la structure XML, créer tout d'abord une structure XML fictive respectant le schéma XML dans la vue édition :

image

En vous remettant dans la vue d'association ('bind view') vous pourrez "drag n dropper" un noeud de la structure XML vers un des Content Control dans le document. De cette façon, vous associerez un chemin XPath à votre content control :

image

Si vous rouvrez votre document, vous devriez maintenant observer des valeurs dans vos Content Controls issus des valeurs de la structure XML.

La partie code

Afin de pouvoir intégrer, extraire ou manipuler le contenu du XML embarqué dans votre document, nous allons utiliser la sérialisation XML pour charger la structure XML sous la forme d'un modèle objet (vous pourrez ainsi récupérer et spécifier les valeurs de vos objets en utilisant des propriétés d'un objet) :

image

Pour nous faciliter la tâche, nous allons générer les classes - C# dans notre cas - directement à partir du schéma XML en utilisant l'utilitaire XSD.exe livré avec le SDK .NET.

Entrez la commande : xsd /c <le nom de votre fichier XSD>

La classe générée, ici à partir de notre schéma Entreprise.xsd, ressemblera à quelque chose de similaire à cela :

image

Maintenant récupérons la partie Custom XML dans le package :

// Retrouver la partie principale du document
PackageRelationship relDocument =
                package.GetRelationshipsByType(TypeRelationPartiePrincipale).
                First<PackageRelationship>();
PackagePart partiePrincipale = package.GetPart(
                PackUriHelper.ResolvePartUri(relDocument.SourceUri, relDocument.TargetUri));

            // Retrouver la première partie CustomXML
            PackageRelationship relCustomXML =
                partiePrincipale.GetRelationshipsByType(TypeRelationCustomXML).
                First<PackageRelationship>();
            return package.GetPart(PackUriHelper.ResolvePartUri(
                relCustomXML.SourceUri, relCustomXML.TargetUri));

Et désérialisons le XML pour en extraire les données existantes :

// Lecture de la partie de CustomXML
XmlSerializer xmlSer = new XmlSerializer(typeof(Entreprise));
Entreprise entreprise =
                    (Entreprise)xmlSer.Deserialize(partieCustomXML.GetStream());
Console.WriteLine("Nom : " + entreprise.Nom);
Console.WriteLine("Adresse : " + entreprise.Adresse);
Console.WriteLine("Site Internet : " + entreprise.SiteInternet);

image

Maintenant modifions les données toujours aussi simplement et sauvegardons les dans la partie :

// Modification/Ecriture dans la partie
entreprise.Nom = "Microsoft";
entreprise.SiteInternet = "
http://www.microsoft.com";
xmlSer.Serialize(partieCustomXML.GetStream(), entreprise);

Maintenant lorsque vous réouvrirez votre fichier, les modifications seront répercutées dans la représentation :

image

Conclusion

Voici une façon rapide de pouvoir embarquer et manipuler des données XML associées à un schéma dans votre document Open XML. Ce mécanisme ouvre de nouvelles opportunités en termes de scénarios pour les utilisateurs et les entreprises qui souhaitent se servir des documents Word ou Excel comme une répresentation de leurs données (exemple, une facture, un devis, etc) ou comme source de données.

image

image

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: lundi 25 février 2008 07:22 par neodante
Classé sous :

Attachment(s): CustomXMLSerDemo.zip

Commentaires

Thomas LEBRUN a dit :

Pas mal cet article Julien ;)

# février 25, 2008 08:34

Utopic_men a dit :

Bonjour,

Terrible l'article!

Je voulais savoir s'il était possible de remplir un tableau de taille variable (au niveau du nombre de lignes) placé dans un Content Control à partir d'une liste de "feuilles XML" ou d'une feuille contenant un code spécial...

Je recherche du côté des controles de contenu de texte enrichi (dans lesquels on peut sauter à la ligne et meme insérer des tableaux.).... mais je bloque.....

Au pire, je cherche à revenir à la ligne et dessiner à la main le tableau...

J'espère avoir été clair,

Cordialement,

Utopic_men

# mai 20, 2008 14:27

neodante a dit :

Malheureusement il n'y a pas encore de prise en charge de contenu à taille variable dans Word. Le binding se fait sur un noeud précis et non sur un ensemble.

Le remplissage d'élément autre que par la fonctionnalité de binding 'Custom XML part' / 'Content Control' se fera par programmation et génération XML classique ...

Bien à toi

# mai 20, 2008 14:39

Utopic_men a dit :

Merci pour ta réponse neodante.

Effectivement, je viens à l'instant de tomber sur un pdf "Sample Content from Advanced Microsoft Office Documents 2007 Edition Inside Out" qui dit : "Note, however, that only data suitable for controls with plain text properties (such as

Plain Text controls, Date Pickers, and Drop-Down Lists) can be bound to Content Con-

trols. Rich text content (such as tables or graphics) is not supported for data binding in

the 2007 release."

Peut-être dans une autre release....?.... dommage en tout cas.... (je vais aller voir ce que dit la norme ISO là-dessus)

# mai 20, 2008 15:20

Xavier a dit :

Bonjour,

Merci pour cette solution simple et puissante. Je l'ai strictement appliqué mais le document ne s'ouvre plus.

En dézippant le document, je comprends pourquoi car dans le dossier CustomXml

il existe deux fichier.xml (dont l'un contient les mises à jour) et deux itemProp ayant le meme

itemID et dans le fichier relation deux xml.res avec le meme Id

Pourriez vous m'aider à résoudre ce problème ?

Xavier

# juillet 28, 2013 17:03
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01