Partager via


Comment automatiser Word pour effectuer une fusion et publipostage côté client à l’aide de XML à partir de SQL Server

Résumé

Cet article montre comment automatiser Microsoft Word à partir d’un script côté client pour effectuer un publipostage pour les étiquettes. Word n’a pas de méthode directe pour utiliser des données XML comme source de données pour une fusion et publipostage. L’exemple illustre le code ASP (Active Server Pages) qui diffuse un jeu d’enregistrements XML d’un serveur web vers un client. Le script côté client convertit ces données XML en un fichier texte délimité local au client, puis automatise Word pour effectuer un publipostage à l’aide du fichier texte local comme source de données de fusion et publipostage.

Informations supplémentaires

ActiveX Data Objects (ADO) 2.5 et versions ultérieures permet de conserver les données du jeu d’enregistrements au format XML. À l’aide d’ASP sur un serveur web, vous pouvez créer un jeu d’enregistrements ADO à partir d’une base de données et retourner les données en tant que XML à vos clients. À son tour, les clients peuvent utiliser ADO pour lire le jeu d’enregistrements XML et manipuler les données en fonction des besoins. Consultez la section « Références » de cet article pour obtenir des liens vers des ressources supplémentaires sur l’utilisation d’ADO avec XML.

À des fins d’illustration, l’exemple suivant utilise l’exemple de base de données Pubs dans Microsoft SQL Server. Toutefois, un code similaire peut être utilisé pour effectuer un publipostage avec n’importe quelle base de données à laquelle vous pouvez établir une connexion ADO.

Échantillon

  1. Sur votre serveur web, créez un répertoire virtuel appelé WordMailMerge.

  2. Utilisez le Bloc-notes pour créer un fichier appelé Default.asp qui contient le code ci-dessous. Enregistrez le fichier dans le répertoire virtuel WordMailMerge.

    <%@ Language=VBScript %>
    <HTML>
    <BODY>
    <SCRIPT LANGUAGE=VBScript>
    Sub CreateDataDoc(oApp)
      ' Declare variables.
      Dim sServer,oDoc,oRS,sTemp,sHead,oRange,oField
    
    ' Place your server's name here.
      sServer = "<servername>"
      ' Create a new document.
      Set oDoc = oApp.Documents.Add
      ' Create a new recordset.
      Set oRS = CreateObject("ADODB.Recordset")
      ' Open the XML recordset from the server
      oRS.Open "http://" & sServer & "/WordMailMerge/Getdata.asp"
      ' Convert the recordset to a string.
      sTemp = oRS.GetString(2, -1, vbTab)  ' 2 = adClipString
    
    ' Append the field names to the front of the string.
      For Each oField In oRS.Fields
        sHead = sHead & oField.Name & vbTab
      Next
    
    ' Strip off the last tab.
      sTemp = Mid(sHead, 1, Len(sHead) - 1) & vbCrLf & sTemp
    
    ' Get a range object and insert the text into the document.
      Set oRange = oDoc.Range
      oRange.Text = sTemp
    
    ' Convert the text to a table.
      oRange.ConvertToTable vbTab
      ' Save the document to a temp file.
      oDoc.SaveAs "C:\data.doc"
      ' Close the document (no save).
      oDoc.Close False
    End Sub
    
    Sub ButtonClick()
      Dim oApp
      Dim oDoc
      Dim oMergedDoc
    
    ' Create an instance of Word.     
      Set oApp = CreateObject("Word.Application")
    
    ' Create our data file.
      CreateDataDoc oApp
    
    ' Add a new document.
      Set oDoc = oApp.Documents.Add
      With oDoc.MailMerge
        ' Add our fields.
        .Fields.Add oApp.Selection.Range, "au_fname"
        oApp.Selection.TypeText " "
        .Fields.Add oApp.Selection.Range, "au_lname"
        oApp.Selection.TypeParagraph
        .Fields.Add oApp.Selection.Range, "city"
        oApp.Selection.TypeText ", "
        .Fields.Add oApp.Selection.Range, "state"
        oApp.Selection.TypeParagraph
        .Fields.Add oApp.Selection.Range, "zip"
        oApp.Selection.TypeParagraph
    
    ' Create an autotext entry.
        Dim oAutoText
        Set oAutoText = oApp.NormalTemplate.AutoTextEntries.Add _
        ("MyLabelLayout", oDoc.Content)
        oDoc.Content.Delete
        .MainDocumentType = 1  ' 1 = wdMailingLabels
    
    ' Open the saved data source.
        .OpenDataSource "C:\data.doc"
    
    ' Create a new document.
        oApp.MailingLabel.CreateNewDocument "5160", "", _
             "MyLabelLayout", , 4  ' 4 = wdPrinterManualFeed
    
    .Destination = 0  ' 0 = wdSendToNewDocument
        ' Execute the mail merge.
        .Execute
    
    oAutoText.Delete
      End With
    
    ' Close the mail merge edit document.
      oDoc.Close False
      ' Get the current document.
      Set oMergedDoc = oApp.ActiveDocument
      ' Show Word to the user.
      oApp.Visible = True
    
    ' Uncomment these lines to save the merged document locally.
      'oMergedDoc.SaveAs "C:\test.doc"
      'oMergedDoc.Close False
      'oApp.Quit False
    End Sub
    </SCRIPT>
    <INPUT type=button value="Create Word Document" onclick="VBScript:ButtonClick">
    </BODY>
    </HTML>
    
    
  3. Utilisez le Bloc-notes pour créer un fichier appelé Getdata.asp qui contient le code ci-dessous. Enregistrez le fichier dans le répertoire virtuel WordMailMerge.

    <%@ Language=VBScript %>
    <%
      Dim oConn,oRS,strConn,sSQLServer
    
    ' Build the connection string. Replace <username> and <strong password> with
      ' the username and password of an account that has permissions on the database.
      sSQLServer = "<servername>"
      strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;" & _
                "User ID=<username>;Password=<strong password>;Initial Catalog=pubs;Data Source=" & sSQLServer
      ' Set our return content type.
      Response.ContentType = "text/xml"
    
    ' Create a connection.
      set oConn = Server.CreateObject("ADODB.Connection")
      ' Open the connection.
      oConn.Open strConn
      ' Execute the SQL statement.
      set oRS = oConn.Execute(“SELECT * FROM AUTHORS”)
      ' Save the recordset in the Response object.
      oRS.Save Response,1
    %>
    
    
  4. Modifiez la variable sServer dans Default.asp pour pointer vers votre serveur web et modifiez la variable sSQLServer dans Getdata.asp pour qu’elle pointe vers votre SQL Server.

  5. Démarrez Internet Explorer et accédez à https://servername/WordMailMerge/Default.asp (où servername est le nom de votre serveur web).

  6. Cliquez sur le bouton de la page Web pour automatiser Word et effectuer le publipostage. Une fois l’automatisation terminée, Word apparaît avec un nouveau document qui contient les étiquettes de publipostage résultant du publipostage.

References

Pour plus d’informations, cliquez sur les numéros d’article suivants pour afficher les articles de la Base de connaissances Microsoft :

258512 Comment automatiser Word à partir de Visual Basic pour créer un publipostage pour les étiquettes de publipostage