Article Details                  
 
Integração de MS Office com .NET

Aprenda como gerar relatórios ou cartas através do MS Word utilizando dados de um banco de dados.

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.


 


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


 


 


 


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”


 


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


 


 


 


 


 


 


Written By: labreu
Date Posted: 4/14/2006
Number of Views: 408

Return