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):
Name: lstAluno
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