Como automatizar o Word para efetuar uma série a partir do Visual Basic .NET

Resumo

Este artigo demonstra como utilizar o Microsoft Office Word para criar um documento intercalado por correio através da Automatização a partir do Microsoft Visual Basic .NET.

Mais Informações

A automatização é um processo que permite que as aplicações escritas em idiomas como o Visual Basic .NET controlem outras aplicações através de programação. A automatização para o Word permite-lhe executar ações como criar novos documentos, adicionar texto a documentos e formatar documentos. Com o Word e outras aplicações do Microsoft Office, praticamente todas as ações que pode realizar manualmente através da interface de utilizador também podem ser executadas através de programação através da Automatização.

O Word expõe esta funcionalidade programática através de um modelo de objeto. O modelo de objeto é uma coleção de classes e métodos que servem como homólogos para os componentes lógicos do Word. Por exemplo, existe um objeto Application, um objeto Document e um objeto Paragraph, cada um deles com a funcionalidade desses componentes no Word. Para aceder ao modelo de objeto a partir do Visual Basic .NET, pode definir uma referência de projeto para a biblioteca de tipos.

Este artigo demonstra como definir a referência de projeto adequada para a biblioteca de tipos do Word para Visual Basic .NET e fornece código de exemplo para automatizar o Word.

Criar um cliente de Automatização para o Word

  1. Inicie o Microsoft Visual Studio .NET.

  2. No menu Ficheiro, clique em Novo e, em seguida, clique em Projeto. Selecione Aplicação do Windows a partir dos tipos de Projeto do Visual Basic. O formulário1 é criado por predefinição.

  3. Adicione uma referência à Biblioteca de Objetos do Microsoft Word. Para tal, siga estes passos:

    1. No menu Projeto, clique em Adicionar Referência.
    2. No separador COM, localize Biblioteca de Objetos do Microsoft Word e, em seguida, clique em Selecionar.

    Nota O Microsoft Office 2003 inclui Conjuntos de Interojuntas Principais (PIAs). O Microsoft Office XP não inclui PIAs, mas estes podem ser transferidos.

    1. Clique em OK na caixa de diálogo Adicionar Referências para aceitar as suas seleções.
  4. No menu Ver, selecione Caixa de Ferramentas para apresentar a caixa de ferramentas e, em seguida, adicione um botão ao Formulário1.

  5. Faça duplo clique em Botão1. A janela de código do formulário é exibida.

  6. Na janela do código, substitua o seguinte código.

        Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
    
    

    Utilize o seguinte código.

        Dim wrdApp As Word.Application
        Dim wrdDoc As Word._Document
    
    Private Sub InsertLines(ByVal LineNum As Integer)
            Dim iCount As Integer
    
    ' Insert "LineNum" blank lines.
            For iCount = 1 To LineNum
                wrdApp.Selection.TypeParagraph()
            Next iCount
        End Sub
    
    Private Sub FillRow(ByVal Doc As Word.Document, ByVal Row As Integer, _
        ByVal Text1 As String, ByVal Text2 As String, _
        ByVal Text3 As String, ByVal Text4 As String)
    
    With Doc.Tables.Item(1)
                ' Insert the data in the specific cell.
                .Cell(Row, 1).Range.InsertAfter(Text1)
                .Cell(Row, 2).Range.InsertAfter(Text2)
                .Cell(Row, 3).Range.InsertAfter(Text3)
                .Cell(Row, 4).Range.InsertAfter(Text4)
            End With
        End Sub
    
    Private Sub CreateMailMergeDataFile()
            Dim wrdDataDoc As Word._Document
            Dim iCount As Integer
    
    ' Create a data source at C:\DataDoc.doc containing the field data.
            wrdDoc.MailMerge.CreateDataSource(Name:="C:\DataDoc.doc", _
                  HeaderRecord:="FirstName, LastName, Address, CityStateZip")
            ' Open the file to insert data.
            wrdDataDoc = wrdApp.Documents.Open("C:\DataDoc.doc")
            For iCount = 1 To 2
                wrdDataDoc.Tables.Item(1).Rows.Add()
            Next iCount
            ' Fill in the data.
            FillRow(wrdDataDoc, 2, "Steve", "DeBroux", _
                  "4567 Main Street", "Buffalo, NY  98052")
            FillRow(wrdDataDoc, 3, "Jan", "Miksovsky", _
                  "1234 5th Street", "Charlotte, NC  98765")
            FillRow(wrdDataDoc, 4, "Brian", "Valentine", _
                  "12348 78th Street  Apt. 214", "Lubbock, TX  25874")
            ' Save and close the file.
            wrdDataDoc.Save()
            wrdDataDoc.Close(False)
        End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
            Dim wrdSelection As Word.Selection
            Dim wrdMailMerge As Word.MailMerge
            Dim wrdMergeFields As Word.MailMergeFields
    
    Dim StrToAdd As String
    
    ' Create an instance of Word  and make it visible.
            wrdApp = CreateObject("Word.Application")
            wrdApp.Visible = True
    
    ' Add a new document.
    
    wrdDoc = wrdApp.Documents.Add()
            wrdDoc.Select()
    
    wrdSelection = wrdApp.Selection()
            wrdMailMerge = wrdDoc.MailMerge()
    
    ' Create MailMerge Data file.
            CreateMailMergeDataFile()
    
    ' Create a string and insert it in the document.
            StrToAdd = "State University" & vbCr & _
                        "Electrical Engineering Department"
            wrdSelection.ParagraphFormat.Alignment = _
                        Word.WdParagraphAlignment.wdAlignParagraphCenter
            wrdSelection.TypeText(StrToAdd)
    
    InsertLines(4)
    
    ' Insert merge data.
            wrdSelection.ParagraphFormat.Alignment = _
                        Word.WdParagraphAlignment.wdAlignParagraphLeft
            wrdMergeFields = wrdMailMerge.Fields()
            wrdMergeFields.Add(wrdSelection.Range, "FirstName")
            wrdSelection.TypeText(" ")
            wrdMergeFields.Add(wrdSelection.Range, "LastName")
            wrdSelection.TypeParagraph()
    
    wrdMergeFields.Add(wrdSelection.Range, "Address")
            wrdSelection.TypeParagraph()
            wrdMergeFields.Add(wrdSelection.Range, "CityStateZip")
    
    InsertLines(2)
    
    ' Right justify the line and insert a date field
            ' with the current date.
            wrdSelection.ParagraphFormat.Alignment = _
                   Word.WdParagraphAlignment.wdAlignParagraphRight
            wrdSelection.InsertDateTime( _
                  DateTimeFormat:="dddd, MMMM dd, yyyy", _
                  InsertAsField:=False)
    
    InsertLines(2)
    
    ' Justify the rest of the document.
            wrdSelection.ParagraphFormat.Alignment = _
                   Word.WdParagraphAlignment.wdAlignParagraphJustify
    
    wrdSelection.TypeText("Dear ")
            wrdMergeFields.Add(wrdSelection.Range, "FirstName")
            wrdSelection.TypeText(",")
            InsertLines(2)
    
    ' Create a string and insert it into the document.
            StrToAdd = "Thank you for your recent request for next " & _
                "semester's class schedule for the Electrical " & _
                "Engineering Department. Enclosed with this " & _
                "letter is a booklet containing all the classes " & _
                "offered next semester at State University.  " & _
                "Several new classes will be offered in the " & _
                "Electrical Engineering Department next semester.  " & _
                "These classes are listed below."
            wrdSelection.TypeText(StrToAdd)
    
    InsertLines(2)
    
    ' Insert a new table with 9 rows and 4 columns.
            wrdDoc.Tables.Add(wrdSelection.Range, NumRows:=9, _
                 NumColumns:=4)
    
    With wrdDoc.Tables.Item(1)
                ' Set the column widths.
                .Columns.Item(1).SetWidth(51, Word.WdRulerStyle.wdAdjustNone)
                .Columns.Item(2).SetWidth(170, Word.WdRulerStyle.wdAdjustNone)
                .Columns.Item(3).SetWidth(100, Word.WdRulerStyle.wdAdjustNone)
                .Columns.Item(4).SetWidth(111, Word.WdRulerStyle.wdAdjustNone)
                ' Set the shading on the first row to light gray.
                .Rows.Item(1).Cells.Shading.BackgroundPatternColorIndex = _
                 Word.WdColorIndex.wdGray25
                ' Bold the first row.
                .Rows.Item(1).Range.Bold = True
                ' Center the text in Cell (1,1).
                .Cell(1, 1).Range.Paragraphs.Alignment = _
                          Word.WdParagraphAlignment.wdAlignParagraphCenter
    
    ' Fill each row of the table with data.
                FillRow(wrdDoc, 1, "Class Number", "Class Name", "Class Time", _
                   "Instructor")
                FillRow(wrdDoc, 2, "EE220", "Introduction to Electronics II", _
                          "1:00-2:00 M,W,F", "Dr. Jensen")
                FillRow(wrdDoc, 3, "EE230", "Electromagnetic Field Theory I", _
                          "10:00-11:30 T,T", "Dr. Crump")
                FillRow(wrdDoc, 4, "EE300", "Feedback Control Systems", _
                          "9:00-10:00 M,W,F", "Dr. Murdy")
                FillRow(wrdDoc, 5, "EE325", "Advanced Digital Design", _
                          "9:00-10:30 T,T", "Dr. Alley")
                FillRow(wrdDoc, 6, "EE350", "Advanced Communication Systems", _
                          "9:00-10:30 T,T", "Dr. Taylor")
                FillRow(wrdDoc, 7, "EE400", "Advanced Microwave Theory", _
                          "1:00-2:30 T,T", "Dr. Lee")
                FillRow(wrdDoc, 8, "EE450", "Plasma Theory", _
                          "1:00-2:00 M,W,F", "Dr. Davis")
                FillRow(wrdDoc, 9, "EE500", "Principles of VLSI Design", _
                          "3:00-4:00 M,W,F", "Dr. Ellison")
            End With
    
    ' Go to the end of the document.
            wrdApp.Selection.GoTo(Word.WdGoToItem.wdGoToLine, _
                       Word.WdGoToDirection.wdGoToLast)
    
    InsertLines(2)
    
    ' Create a string and insert it into the document.
            StrToAdd = "For additional information regarding the " & _
                       "Department of Electrical Engineering, " & _
                       "you can visit our Web site at "
            wrdSelection.TypeText(StrToAdd)
            ' Insert a hyperlink to the Web page.
            wrdSelection.Hyperlinks.Add(Anchor:=wrdSelection.Range, _
               Address:="http://www.ee.stateu.tld")
            ' Create a string and insert it in the document.
            StrToAdd = ".  Thank you for your interest in the classes " & _
                       "offered in the Department of Electrical " & _
                       "Engineering.  If you have any other questions, " & _
                       "please feel free to give us a call at " & _
                       "555-1212." & vbCr & vbCr & _
                       "Sincerely," & vbCr & vbCr & _
                       "Kathryn M. Hinsch" & vbCr & _
                       "Department of Electrical Engineering" & vbCr
            wrdSelection.TypeText(StrToAdd)
    
    ' Perform mail merge.
            wrdMailMerge.Destination = _
                       Word.WdMailMergeDestination.wdSendToNewDocument
            wrdMailMerge.Execute(False)
    
    ' Close the original form document.
            wrdDoc.Saved = True
            wrdDoc.Close(False)
    
    ' Release References.
            wrdSelection = Nothing
            wrdMailMerge = Nothing
            wrdMergeFields = Nothing
            wrdDoc = Nothing
            wrdApp = Nothing
    
    ' Clean up temp file.
            System.IO.File.Delete("C:\DataDoc.doc")
        End Sub
    
    
  7. Adicione o seguinte à parte superior de Formulário1.vb.

    Imports Microsoft.Office.Interop
    
    
  8. Prima F5 para criar e executar o programa.

  9. Clique no Botão1 para iniciar a Automatização do Word e efetuar a mesma.

Referências

Para obter mais informações, visite o seguinte Site do Microsoft Developer Network (MSDN):

Desenvolvimento do Microsoft Office com Visual Studio

Para obter mais informações sobre automatizar o Word com o Microsoft Visual Basic 5.0 ou 6.0, clique nos seguintes números de artigo para ver os artigos na Base de Dados de Conhecimento Microsoft:

285332 Como automatizar o Word com o Visual Basic para criar uma Mensagem de Correio em Primeiro Lugar