Partager via


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 :

  1. Créez un document de modèle Word.

  2. 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 :

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

  1. Ouvrez Word et créez un document vierge.

  2. 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
    
  3. 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.

  4. 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

  1. Créez un fichier texte et enregistrez-le sous CustomerData.xml.

  2. 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> 
    
  3. 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")

  4. 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

  1. Ouvrez Visual Studio ou Visual Web Developer.

  2. 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.

  3. 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>
    
  4. 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.

  5. 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.

  6. Télécharger et installer Microsoft .NET Framework 4.0

  7. 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>
    
  8. 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.

  9. Dans le Explorateur de solutions, cliquez avec le bouton droit sur Propriétés, puis cliquez sur Ouvrir.

  10. 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.

  11. 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>
    
    
  12. 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.