Como automatizar o Word para executar uma Mala Direta do lado do cliente usando XML do SQL Server

Resumo

Este artigo demonstra como automatizar o Microsoft Word do script do lado do cliente para executar uma mala direta para rótulos. O Word não tem um método direto para usar dados XML como fonte de dados para uma mala direta. O exemplo ilustra o código ASP (Active Server Pages) que transmite um conjunto de registros XML de um servidor Web para um cliente. O script do lado do cliente converte esses dados XML em um arquivo de texto delimitado que é local para o cliente e, em seguida, automatiza o Word para executar uma mala direta usando o arquivo de texto local como fonte de dados de mala direta.

Informações adicionais

O ActiveX Data Objects (ADO) 2.5 e posterior permite que os dados do conjunto de registros sejam persistidos no formato XML. Usando o ASP em um servidor Web, você pode criar um conjunto de registros do ADO de um banco de dados e retornar os dados como XML para seus clientes. Por sua vez, os clientes podem usar o ADO para ler o conjunto de registros XML e manipular os dados conforme necessário. Consulte a seção "Referências" deste artigo para obter links para recursos adicionais sobre como usar o ADO com XML.

Para fins de ilustração, o exemplo a seguir usa o banco de dados pubs de exemplo no Microsoft SQL Server. No entanto, um código semelhante pode ser usado para executar uma mala direta com qualquer banco de dados ao qual você possa fazer uma conexão do ADO.

Amostra

  1. No servidor Web, crie um diretório virtual chamado WordMailMerge.

  2. Use o Bloco de Notas para criar um arquivo chamado Default.asp que contém o código fornecido abaixo. Salve o arquivo no diretório virtual 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. Use o Bloco de Notas para criar um arquivo chamado Getdata.asp que contém o código fornecido abaixo. Salve o arquivo no diretório virtual 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. Altere a variável sServer em Default.asp para apontar para o servidor Web e altere a variável sSQLServer em Getdata.asp para apontar para seu SQL Server.

  5. Inicie o Internet Explorer e navegue até https://servername/WordMailMerge/Default.asp (onde servername é o nome do servidor Web).

  6. Clique no botão na página da Web para automatizar o Word e executar a mala direta. Quando a Automação for concluída, o Word aparecerá com um novo documento que contém as etiquetas de endereçamento resultantes da mala direta.

Referências

Para obter mais informações, clique nos seguintes números de artigo para exibir os artigos na Base de Dados de Conhecimento Microsoft:

258512 como automatizar o Word do Visual Basic para criar uma mala direta para etiquetas de endereçamento