Connexion d’un élément du magasin de données à une base de données SQL Server
Word vous permet de générer des documents en créant des solutions pilotées par les données. Vous pouvez créer un modèle de document qui inclut une partie XML personnalisée et utiliser des contrôles de contenu pour établir une liaison à des données XML personnalisées à l’aide du mappage XML. Bien que le terme modèle soit utilisé dans ce contexte, ce document n’est pas un modèle Word, mais partage certaines caractéristiques d’un document de modèle Word. Vous pouvez ensuite créer une application web managée pour générer un nouveau document basé sur le modèle de document. L’application web managée ouvre le document modèle, récupère les données d’une base de données Microsoft SQL Server pour créer un nouveau composant XML personnalisé, remplace le composant XML personnalisé du document de modèle par le nouveau composant et enregistre le document modèle en tant que nouveau document Word.
Cette procédure pas à pas explique comment créer un nouveau modèle de document et comment créer une application côté serveur qui génère des documents qui affichent des données stockées dans une base de données Microsoft SQL Server. Pour générer cette application, vous allez effectuer les deux tâches suivantes :
Créez un document de modèle Word.
Créez une application web côté serveur qui extrait des données d’une base de données Microsoft SQL Server et génère de nouveaux documents basés sur le document de modèle Word.
Les objets programmatiques utilisés dans cet exemple sont les suivants :
CustomXMLPart (dans le modèle objet principal microsoft Office System)
CustomXMLParts (dans le modèle objet principal microsoft Office System)
Pour plus d’informations sur les contrôles de contenu, voir Utilisation des contrôles de contenu.
Scénario métier : Créer un générateur de documents client
Pour créer un générateur de documents Word qui connecte un élément du magasin de données à une base de données Microsoft SQL Server, vous devez d’abord créer un modèle de document générateur de lettres client qui contient des contrôles de contenu mappés à un fichier XML. Ensuite, vous créez une application web de génération de document qui vous permet de sélectionner un nom d’entreprise pour générer un document personnalisé. L’application récupère les données client d’une base de données Microsoft SQL Server et utilise le générateur de lettres client pour créer un nouveau document qui affiche les données client en fonction d’une sélection d’utilisateur. Le document affiche les informations suivantes :
- Nom de la société
- Nom du contact
- Titre du contact
- Numéro de téléphone
Utilisez les étapes générales suivantes pour créer un générateur de documents Word.
Pour créer un générateur de documents personnalisé et définir les mappages XML pour chaque contrôle de contenu
Ouvrez Word et créez un document vierge.
Ajoutez des contrôles de contenu en texte brut au document pour les lier à des nœuds dans le magasin de données.
Les contrôles de contenu sont des éléments de contenu prédéfinis. Word offre plusieurs types de contrôles de contenu. Cela inclut les blocs de texte, les cases à cocher, les menus déroulants, les zones de liste déroulante, les contrôles de calendrier et les images. Vous pouvez mapper ces contrôles de contenu à un élément dans un fichier XML. À l’aide d’expressions XPath , vous pouvez mapper par programmation le contenu d’un fichier XML à un contrôle de contenu. Cela vous permet d’écrire une application simple et courte pour manipuler et modifier des données dans un document.
Pour ajouter un contrôle de contenu, sous l’onglet Développeur , dans le groupe Contrôles , cliquez sur Contrôle de contenu en texte brut.
Ajoutez quatre contrôles de contenu en texte brut au document. Après avoir ajouté chaque contrôle, attribuez à chacun un titre : Cliquez sur le contrôle ; dans le groupe Contrôles , cliquez sur Propriétés ; dans la zone Titre , tapez un titre pour le contrôle, comme indiqué dans la liste suivante ; puis cliquez sur OK.
- Nom de la société
- Nom du contact
- Titre du contact
- Numéro de téléphone
Vous pouvez également utiliser le code Visual Basic pour Applications (VBA) suivant pour ajouter des contrôles de contenu au document. Appuyez sur ALT+F11 pour ouvrir l’éditeur Visual Basic, collez le code dans la fenêtre de code, cliquez n’importe où dans la procédure, puis appuyez sur F5 pour exécuter le code et ajouter quatre contrôles de contenu à votre modèle de document.
Sub AddContentControls() Selection.Range.ContentControls.Add (wdContentControlText) Selection.ParentContentControl.Title = "Company Name" Selection.ParentContentControl.Tag = "Company Name" Selection.MoveDown Unit:=wdLine, Count:=1 Selection.TypeParagraph Selection.Range.ContentControls.Add (wdContentControlText) Selection.ParentContentControl.Title = "Contact Name" Selection.ParentContentControl.Tag = "Contact Name" Selection.MoveDown Unit:=wdLine, Count:=1 Selection.TypeParagraph Selection.Range.ContentControls.Add (wdContentControlText) Selection.ParentContentControl.Title = "Contact Title" Selection.ParentContentControl.Tag = "Contact Title" Selection.MoveDown Unit:=wdLine, Count:=1 Selection.TypeParagraph Selection.Range.ContentControls.Add (wdContentControlText) Selection.ParentContentControl.Title = "Phone Number" Selection.ParentContentControl.Tag = "Phone Number" Selection.MoveDown Unit:=wdLine, Count:=1 Selection.TypeParagraph End Sub
Définissez le mappage XML sur les contrôles de contenu.
Le mappage XML est une fonctionnalité de Word qui vous permet de créer un lien entre un document et un fichier XML. Une véritable séparation données/vue entre la mise en forme du document et les données XML personnalisées est créée.
Pour charger un composant XML personnalisé, vous devez d’abord ajouter un nouveau magasin de données à un objet Document à l’aide de la méthode Add de la collection CustomXMLParts . Cela ajoute un nouveau magasin de données vide au document. Étant donné qu’il est vide, vous ne pouvez pas encore l’utiliser. Ensuite, vous devez charger une partie XML personnalisée à partir d’un fichier XML dans le magasin de données, en appelant la méthode Load de l’objet CustomXMLPart qui utilise un chemin d’accès valide à un fichier XML comme paramètre.
Enregistrez le document en le nommant CustomerLetterGenerator.docm.
Remarque
Étant donné qu’il contient du code VBA, vous devez enregistrer le document en tant que fichier de document prenant en charge les macros (.docm).|
La procédure suivante explique comment mapper un contrôle de contenu à un exemple de fichier XML personnalisé. Vous créez un fichier XML personnalisé valide, enregistrez le fichier, puis vous utilisez du code Visual Basic pour Applications (VBA) pour ajouter au document modèle un magasin de données contenant les informations auxquelles vous souhaitez mapper.
Pour définir un mappage XML sur un contrôle de contenu
Créez un fichier texte et enregistrez-le sous CustomerData.xml.
Copiez le code XML suivant dans le fichier texte et enregistrez le fichier.
<?xml version="1.0"?> <Customer> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> <ContactTitle>Sales Representative</ContactTitle> <Phone>030-0074321</Phone> </Customer>
Appuyez sur ALT+F11 pour ouvrir l’éditeur Visual Basic, collez le code suivant dans la fenêtre de code, cliquez n’importe où dans la procédure, puis appuyez sur F5 pour exécuter le code et joindre un fichier XML à votre document modèle afin qu’il devienne un élément de magasin de données disponible.
Public Sub LoadXML() ' Load CustomerData.xml file ActiveDocument.CustomXMLParts.Add ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).Load ("C:\CustomerData.xml") End Sub
Remarque
Au moins trois parties XML personnalisées par défaut sont toujours créées avec un document : « Pages de garde », « Propriétés de la documentation » et « Propriétés de l’application ». En outre, d’autres composants XML personnalisés peuvent être créés sur un ordinateur donné, en fonction de plusieurs facteurs. Il s’agit notamment des modules complémentaires installés, des connexions avec SharePoint, etc. L’appel de la méthode Add sur la collection CustomXMLParts dans le code précédent ajoute une partie XML supplémentaire, dans laquelle le fichier XML est chargé. C’est sur cette partie que la méthode Load est appelée, dans la ligne de code suivante.
Pour déterminer le numéro d’index de la partie dans laquelle charger le fichier XML, il est nécessaire de passer le nombre de parties XML personnalisées à la méthode Load .
ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).Load ("C:\CustomerData.xml")
Définissez un mappage XML sur un contrôle de contenu qui fait référence à un nœud dans le magasin de données ajouté.
Pour créer un mappage XML, utilisez une expression XPath qui pointe vers le nœud dans la partie de données XML personnalisée à laquelle vous souhaitez mapper un contrôle de contenu. Une fois que vous avez ajouté un magasin de données à votre document (et que le magasin de données pointe vers un fichier XML valide), vous êtes prêt à mapper l’un de ses nœuds à un contrôle de contenu.
Pour ce faire, transmettez une chaîne contenant un XPath valide à un objet ContentControl à l’aide de la méthode SetMapping de l’objet XMLMapping (à l’aide de la propriété XMLMapping de l’objet ContentControl ). Ouvrez l’éditeur Visual Basic et exécutez le code VBA suivant pour lier les contrôles de contenu aux éléments du magasin de données.
Public Sub MapXML() Dim strXPath1 As String strXPath1 = "/Customer/CompanyName" ActiveDocument.ContentControls(1).XMLMapping.SetMapping strXPath1 Dim strXPath2 As String strXPath2 = "/Customer/ContactName" ActiveDocument.ContentControls(2).XMLMapping.SetMapping strXPath2 Dim strXPath3 As String strXPath3 = "/Customer/ContactTitle" ActiveDocument.ContentControls(3).XMLMapping.SetMapping strXPath3 Dim strXPath4 As String strXPath4 = "/Customer/Phone" ActiveDocument.ContentControls(4).XMLMapping.SetMapping strXPath4
Créer une application Server-Side qui extrait des données d’une base de données SQL Server et génère un nouveau document
Vous pouvez créer une application web qui permet aux utilisateurs de sélectionner un nom d’entreprise et de générer une lettre personnalisée. L’application web récupère les données client d’une base de données SQL Server, ouvre le document de modèle de lettre client et crée un document qui affiche les données client en fonction d’une sélection d’utilisateur. Cette application web ne nécessite pas l’utilisation de Word ou VBA. Utilisez votre langage de code managé favori (Visual Basic .NET ou C#) pour générer cette application.
Remarque
L’application web illustrée ici obtient ses données à partir de la base de données Northwind.mdf. Cette base de données a été installée avec les versions précédentes de SQL Server et d’Office. Si vous n’avez pas la base de données Northwind sur votre ordinateur, vous pouvez la télécharger à partir du site suivant : Base de données Northwind
Pour créer une application côté serveur qui extrait des données d’une base de données SQL Server et génère un nouveau document
Ouvrez Visual Studio ou Visual Web Developer.
Créez une application web ASP.NET et nommez-la SqlServerSample.
Dans les étapes suivantes, vous allez connecter l’application web ASP.NET à une base de données SQL Server.
Ajoutez la chaîne de connexion suivante au fichier Web.config dans votre projet Visual Studio.
<connectionStrings> <add name="NorthwindConnectionString" connectionString="data source=(local);database=Northwind; integrated security=SSPI;persist security info=false;" providerName="System.Data.SqlClient" /> </connectionStrings>
Dans votre projet Visual Studio, ajoutez le document CustomerLetterGenerator.docm au dossier App_Data : cliquez avec le bouton droit sur App_Data, pointez sur Ajouter, cliquez sur Élément existant, accédez à l’emplacement où vous avez enregistré le document, sélectionnez-le, puis cliquez sur Ajouter.
Ajoutez une référence à WindowsBase.dll à votre projet : cliquez avec le bouton droit sur Références, cliquez sur Ajouter une référence, cliquez sur l’onglet .NET , sélectionnez WindowsBase, puis cliquez sur OK.
Télécharger et installer Microsoft .NET Framework 4.0
Configurez l’assembly dans le fichier Web.config comme suit.
<compilation debug="false"> <assemblies> <add assembly="WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation>
Ajouter un formulaire web à votre projet : dans le menu Projet , cliquez sur Ajouter un nouvel élément; sous Modèles installés, cliquez sur Web; Sélectionnez Formulaire web, puis cliquez sur Ajouter.
Dans le Explorateur de solutions, cliquez avec le bouton droit sur Propriétés, puis cliquez sur Ouvrir.
Sous l’onglet Web , sous Action de démarrage, sélectionnez Page spécifique, cliquez sur le bouton Parcourir, puis accédez à la page WebForm1.aspx.
Ajoutez le code suivant au fichier WebForm1.aspx , en remplaçant la partie du fichier limitée par les balises d’ouverture et de fermeture
<html>
.<html xmlns="https://www.w3.org/1999/xhtml"> <head runat="server"> <title>Data-Driven Document Generation - SQL Server Sample</title> </head> <body> <form id="form1" runat="server"> <div> <h1>Customer Letter Generator</h1> <table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 12%"> <tr> <td> Choose a customer:</td> <td> <asp:DropDownList ID="ddlCustomer" runat="server" AutoPostBack="True" DataSourceID="CustomerData" DataTextField="CompanyName" DataValueField="CustomerID" Width="301px"> </asp:DropDownList> <asp:SqlDataSource ID="CustomerData" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT [CustomerID], [CompanyName] FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>"> </asp:SqlDataSource> </td> </tr> </table> </div> <br /> <asp:Button ID="Button1" runat="server" OnClick="SubmitBtn_Click" Text="Create Letter" Width="123px" /> </form> </body> </html>
Selon le langage de codage que vous utilisez, ajoutez le code Visual Basic .NET ou C# suivant à la page de code-behind WebForm1.aspx appropriée dans votre projet.
Exemple de code : Visual Basic .NET
L’exemple Visual Basic .NET suivant montre comment établir une liaison à une base de données SQL Server pour récupérer des données en fonction d’une sélection de client et créer un document basé sur le document de modèle CustomerLetterGenerator.docm. Ajoutez le code suivant au fichier WebForm1.aspx.vb , en remplaçant le code existant dans le fichier.
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.IO.Packaging
Imports System.Linq
Imports System.Xml
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Public Class WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
Private Const strRelRoot As String = "https://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
Private Sub CreateDocument()
' Get the template document file and create a stream from it
Const DocumentFile As String = "~/App_Data/CustomerLetterGenerator.docm"
' Read the file into memory
Dim buffer() As Byte = File.ReadAllBytes(Server.MapPath(DocumentFile))
Dim memoryStream As MemoryStream = New MemoryStream(buffer, True)
buffer = Nothing
' Open the document in the stream and replace the custom XML part
Dim pkgFile As Package = Package.Open(memoryStream, FileMode.Open, FileAccess.ReadWrite)
Dim pkgrcOfficeDocument As PackageRelationshipCollection = pkgFile.GetRelationshipsByType(strRelRoot)
For Each pkgr As PackageRelationship In pkgrcOfficeDocument
If (pkgr.SourceUri.OriginalString = "/") Then
' Get the root part
Dim pkgpRoot As PackagePart = pkgFile.GetPart(New Uri(("/" + pkgr.TargetUri.ToString), UriKind.Relative))
' Add a custom XML part to the package
Dim uriData As Uri = New Uri("/customXML/item1.xml", UriKind.Relative)
If pkgFile.PartExists(uriData) Then
' Delete part "/customXML/item1.xml" part
pkgFile.DeletePart(uriData)
End If
' Load the custom XML data
Dim pkgprtData As PackagePart = pkgFile.CreatePart(uriData, "application/xml")
GetDataFromSQLServer(pkgprtData.GetStream, ddlCustomer.SelectedValue)
End If
Next
' Close the file
pkgFile.Close()
' Return the result
Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("content-disposition", "attachment; filename=document.docx")
Response.ContentEncoding = System.Text.Encoding.UTF8
memoryStream.WriteTo(Response.OutputStream)
memoryStream.Close()
Response.End()
End Sub
Private Sub GetDataFromSQLServer(ByVal stream As Stream, ByVal customerID As String)
'Connect to a SQL Server database and get data
Dim source As String = ConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString
Const SqlStatement As String = "SELECT CompanyName, ContactName, ContactTitle, Phone FROM Customers WHERE CustomerID=@customerID"
Dim conn As SqlConnection = New SqlConnection(source)
conn.Open()
Dim cmd As SqlCommand = New SqlCommand(SqlStatement, conn)
cmd.Parameters.AddWithValue("@customerID", customerID)
Dim dr As SqlDataReader = cmd.ExecuteReader
If dr.Read Then
Dim writer As XmlWriter = XmlWriter.Create(stream)
writer.WriteStartElement("Customer")
writer.WriteElementString("CompanyName", CType(dr("CompanyName"), String))
writer.WriteElementString("ContactName", CType(dr("ContactName"), String))
writer.WriteElementString("ContactTitle", CType(dr("ContactTitle"), String))
writer.WriteElementString("Phone", CType(dr("Phone"), String))
writer.WriteEndElement()
writer.Close()
End If
dr.Close()
conn.Close()
End Sub
Protected Sub SubmitBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
CreateDocument()
End Sub
End Class
Exemple de code : C #
L’exemple C# suivant montre comment établir une liaison à une base de données SQL Server pour récupérer des données en fonction d’une sélection de client et créer un document basé sur le document de modèle CustomerLetterGenerator.docm. Ajoutez le code suivant au fichier WebForm1.Aspx.cs , en copiant le code existant.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Xml;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace SQLServerSample
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
private const string strRelRoot = "https://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
private void CreateDocument()
{
// Get the template document file and create a stream from it
const string DocumentFile = @"~/App_Data/CustomerLetterGenerator.docm";
// Read the file into memory
byte[] buffer = File.ReadAllBytes(Server.MapPath(DocumentFile));
MemoryStream memoryStream = new MemoryStream(buffer, true);
buffer = null;
// Open the document in the stream and replace the custom XML part
Package pkgFile = Package.Open(memoryStream, FileMode.Open, FileAccess.ReadWrite);
PackageRelationshipCollection pkgrcOfficeDocument = pkgFile.GetRelationshipsByType(strRelRoot);
foreach (PackageRelationship pkgr in pkgrcOfficeDocument)
{
if (pkgr.SourceUri.OriginalString == "/")
{
// Get the root part
PackagePart pkgpRoot = pkgFile.GetPart(new Uri("/" + pkgr.TargetUri.ToString(), UriKind.Relative));
// Add a custom XML part to the package
Uri uriData = new Uri("/customXML/item1.xml", UriKind.Relative);
if (pkgFile.PartExists(uriData))
{
// Delete document "/customXML/item1.xml" part
pkgFile.DeletePart(uriData);
}
// Load the custom XML data
PackagePart pkgprtData = pkgFile.CreatePart(uriData, "application/xml");
GetDataFromSQLServer(pkgprtData.GetStream(), ddlCustomer.SelectedValue);
}
}
// Close the file
pkgFile.Close();
// Return the result
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("content-disposition", "attachment; filename=CustomLetter.docx");
Response.ContentEncoding = System.Text.Encoding.UTF8;
memoryStream.WriteTo(Response.OutputStream);
memoryStream.Close();
Response.End();
}
private void GetDataFromSQLServer(Stream stream, string customerID)
{
// Connect to a SQL Server database and get data
String source = System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
const string SqlStatement =
"SELECT CompanyName, ContactName, ContactTitle, Phone FROM Customers WHERE CustomerID=@customerID";
using (SqlConnection conn = new SqlConnection(source))
{
conn.Open();
SqlCommand cmd = new SqlCommand(SqlStatement, conn);
cmd.Parameters.AddWithValue("@customerID", customerID);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
XmlWriter writer = XmlWriter.Create(stream);
writer.WriteStartElement("Customer");
writer.WriteElementString("CompanyName", (string)dr["CompanyName"]);
writer.WriteElementString("ContactName", (string)dr["ContactName"]);
writer.WriteElementString("ContactTitle", (string)dr["ContactTitle"]);
writer.WriteElementString("Phone", (string)dr["Phone"]);
writer.WriteEndElement();
writer.Close();
}
dr.Close();
conn.Close();
}
}
protected void SubmitBtn_Click(object sender, EventArgs e)
{
CreateDocument();
}
}
}
Pour plus d’informations sur l’utilisation de ASP.NET 2.0, consultez https://www.asp.net/get-started/.
Cet article explique comment extraire des données d’une base de données SQL Server et les insérer dans votre modèle de document. Vous pouvez également extraire les données d’autres sources de données, notamment Access et Excel. Pour plus d’informations sur la façon de se connecter aux données dans ces applications par programmation, consultez la documentation pour les développeurs Access et Excel.
Assistance et commentaires
Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.