Desenvolvimento - Visual Basic .NET

Integração de MS Office com .NET - Parte I: Word

Quem nunca precisou exportar uma carta dinâmica para o Word com valores retirados de um banco de dados? Vou dar um pequeno exemplo, prático e simples de como fazer este processo.

por David Pomarico



Quem nunca precisou exportar uma carta dinâmica para o Word com valores retirados de um banco de dados? Vou dar um pequeno exemplo, prático e simples de como fazer este processo.

Em primeiro lugar aqui vai o ambiente em que foi feito este exemplo:

· Windows XP SP3
· MS Office XP SP3 (é recomendável atualizar o Office)
· MS Visual Studio .NET 2003 (WinForms)
· XML
· Tipo de Carta: Informação sobre o boletim dos alunos de uma Faculdade

Preparando o ambiente:

Montamos um arquivo XML, alunos.xml, para captar os dados para gerar as cartas (mala direta)

<?xml version="1.0" encoding="iso-8859-1" ?> 
<tblAluno>
	<aluno>
		<matricula>00001</matricula>
		<nome>João Paulo da Silva</nome>
		<nota1>5,4</nota1>
		<nota2>8,2</nota2>
		<nota3>7,0</nota3>
		<nota4>6,8</nota4>
		<faculdade>Universidade TRALALA</faculdade>
	</aluno>
	<aluno>
		<matricula>00002</matricula>
		<nome>Gustavo Barbosa</nome>
		<nota1>9,5</nota1>
		<nota2>8,7</nota2>
		<nota3>8,5</nota3>
		<nota4>8,0</nota4>
		<faculdade>Universidade TRALALA</faculdade>
	</aluno>
	<aluno>
		<matricula>00003</matricula>
		<nome>Vanderlei da Cunha</nome>
		<nota1>3,6</nota1>
		<nota2>4,5</nota2>
		<nota3>6,8</nota3>
		<nota4>7,5</nota4>
		<faculdade>Universidade TRALALA</faculdade>
	</aluno>
</tblAluno>

Para montar o Documento Word fiz o seguinte texto:

CARTA TESTE

Prezado Sr.(a) @Aluno

Segue abaixo as informações sobre vosso boletim deste ano

1º Bim: @Nota1
2º Bim: @Nota2
3º Bim: @Nota3
4º Bim: @Nota4

Informamos também que sua média geral deste ano foi de @Media_Geral e que você foi @Status no curso.

Atenciosamente,
@Faculdade

Onde as palavras que contém @ serão as "variáveis" que eu irei varrer e substituir pelos valores que eu quiser.

Agora crie um projeto WinForms utilizando a linguagem VB.

Adicione os seguintes controles no formulário (frmPrincipal, não deixe de colocar o nome do form):

  • ListBox:
    Name: lstAluno

  • 3 Buttons:
    Name: btnCarregaListBox
    Name: btnGeraCarta
    Name: btnSair

O formulário deverá ficar com esta aparência:

CODIFICAÇÃO DOS EVENTOS:

Você deve estar se perguntando: Onde eu adiciono a referência?

Bem, nesse projeto não utilizaremos referência alguma, pois da forma que iremos fazê-lo o software irá instanciar um objeto Word da máquina onde ele estará rodando, independente da versão do MS Office.

Esta é a Sub principal que localiza e substitui as palavras do documento Word pela palavra que você informar. Cole-a dentro de sua classe frmPrincipal.

Private Sub LocalizaAltera(ByVal Procurar As String, ByVal Substituir As String)
        With objWord.Selection.Find
            .Text = Procurar.ToString
            .Replacement.Text = Substituir.ToString
            .Forward = True
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            While .Execute = True
               objWord.Selection.Select()
               System.Windows.Forms.Clipboard.SetDataObject(Substituir)
               objWord.Selection.Paste()
            End While
        End With
End Sub

Importe a classe Microsoft.VisualBasic, e declare as seguintes variáveis:

Imports Microsoft.VisualBasic
Public Class frmPrincipal
    Inherits System.Windows.Forms.Form
    Dim dsAluno As DataSet
    Dim objWord As Object
    Dim x As Integer

Estas variáveis devem estar visíveis para todas as Subs da Classe frmPrincipal.

Código do botão Carrega ListBox

dsAluno = New DataSet
    Try
       "Lê o XML no caminho específico
       dsAluno.ReadXml("c:\temp\word\word\alunos.xml")
       For x = 0 To dsAluno.Tables(0).Rows.Count - 1
           Me.lstAluno.Items.Add(dsAluno.Tables(0).Rows(x).Item(1))
       Next
    Catch ex As Exception
       MsgBox(ex.Message)
    End Try

Código do botão Gera Carta

If lstAluno.Items.Count <= 0 Then Exit Sub
If lstAluno.SelectedItem = "" Then Exit Sub

"Variável para calcular a média das notas
Dim Media As Double

Try
   "Instancia a Aplicação Word.
   objWord = CreateObject("Word.Application")
   "Abre o documento Word.
   objWord.Documents.Open("c:\temp\word\word\carta.doc")
   "Varre o DataSet
   For x = 0 To dsAluno.Tables(0).Rows.Count - 1
      "Se o nome que está no DataSet for igual ao Nome selecionado.
      If lstAluno.SelectedItem = dsAluno.Tables(0).Rows(x).Item(1) Then
         "Calcula a média do aluno.
         Media = CDbl(dsAluno.Tables(0).Rows(0).Item(2)) + CDbl(dsAluno.Tables(0).Rows(0).Item(3)) + 
CDbl(dsAluno.Tables(0).Rows(0).Item(4)) + CDbl(dsAluno.Tables(0).Rows(0).Item(5))
         Media = Media / 4
       "Procura a palavra "@Aluno" e substitui pelo conteúdo do DataSet
        LocalizaAltera("@Aluno", dsAluno.Tables(0).Rows(0).Item(1))
        LocalizaAltera("@Nota1", dsAluno.Tables(0).Rows(0).Item(2))
        LocalizaAltera("@Nota2", dsAluno.Tables(0).Rows(0).Item(3))
        LocalizaAltera("@Nota3", dsAluno.Tables(0).Rows(0).Item(4))
        LocalizaAltera("@Nota4", dsAluno.Tables(0).Rows(0).Item(4))
        LocalizaAltera("@Media_Geral", Media)
        LocalizaAltera("@Status", IIf(Media > 7, "Aprovado", "Reprovado"))
        LocalizaAltera("@Faculdade", dsAluno.Tables(0).Rows(0).Item(6))
     End If
   Next
If MsgBox("Deseja abrir o documento?", MsgBoxStyle.YesNo, "Word") = MsgBoxResult.Yes Then
   "Deixa o Word visivel
    objWord.visible = True
Else
   "Fecha o documento sem salvar
   objWord.ActiveDocument.Close(False)
   "Fecha o Word.
   objWord.Quit()
   objWord = Nothing
End If

Catch ex As Exception
      objWord.ActiveDocument.Close(False)
      objWord.Quit()
      objWord = Nothing
      MsgBox(ex.Message)
End Try

Não esqueça de alterar o caminho do XML que o DataSet irá ler e o caminho do Documento Word.

Agora bastar rodar a aplicação e ver o resultado!

Em breve estarei disponibilizando o artigo "Integração de MS Office com .NET -Parte II: Excel"

Para baixar o projeto completo, clique aqui.

Se você tiver alguma dúvida, mande-me um email: dcpomarico@uol.com.br

Abraço!
David Pomarico
http://br.thespoke.net/MyBlog/dpomarico/MyBlog.aspx

David Pomarico

David Pomarico - Analista de Sistemas, MCP (Micrososft Certified Professional) em ASP.NET e WindowsForms, atualmente trabalhando em uma multinacional, graduado em Tecnologia em Desenvolvimento de Softwares na Faculdade Informática e Administração Paulista (FIAP), Co-Líder do Grupo de Usuários Codificando.Net SP (www.codificando.net), experiência de 2 anos em .NET, conhecimentos e práticas em Framework .NET, ASP.NET, WinForms, Pocket PC, VB.NET, C#, Crystal Reports.NET, Active Reports for .NET, MS SQL 2000, Oracle 9i, UML, XML.
Visite o meu The spoke: http://br.thespoke.net/MyBlog/dpomarico/MyBlog.aspx