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 PomaricoEm 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
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET