VB.NET - Preenchendo documentos Word com dados de um DataSet
Neste artigo eu vou mostrar como você pode preencher um documento do Word, no caso um contrato, com dados de uma tabela via automação OLE usando o VB.NET.
A automação OLE é um processo onde um componente de um programa se comunica e/ou controla outro componente usando o modelo COM - Component Object Model. Na verdade esta técnica é básica para muitos componentes de comunicação usadas em linguagens como Visual Basic ou VBA e torna-se assim parte constante de muitos programas.
Primeiro vamos criar um arquivo no Microsoft Word com o nome de aviso.doc.
Abaixo eu estou exibindo o meu arquivo. Você pode criar o seu próprio arquivo com variáveis e texto diferentes.
![]() |
Neste arquivo .doc eu estou usando palavras precedidas do símbolo @. Ex: @escola , @data ,etc.
Estas palavras são as variáveis que eu vou substituir por dados que estão em um DataSet. Eu vou abrir o datset e segundo um critério , para não ter que emitir todos os avisos de uma vez, vou pegar o dado do dataset e substituir no documento.
O objeto DataSet é o foco principal da programação ADO.NET, e a principal característica do DataSet é ser totalmente desconectado; Assim você pode usar um DataSet para armazenar dados de um banco de dados e pode também mover os dados de um DataSet para um banco de dados , mas o próprio DataSet não faz conexão alguma com o banco de dados , ele nem mesmo tem um objeto para realizar tal conexão .
A ligação entre o banco de dados e DataSet é feita pelo objeto DataAdapter (Adaptador de dados). Abaixo uma ilustração que procura mostrar a interação entre os objetos ADO.NET e o modelo desconectado com o DataSet.
![]() |
Para o
exemplo eu criei um banco de dados chamado Escola.mdb e uma tabela - Alunos -
com os dados que eu vou usar para preencher o documento. Abaixo temos a tabela ,
sua estrutura e seus dados:
![]() |
Tabela Alunos
Vamos
criar o projeto que irá fazer todo este serviço para nós...
Inicie um novo projeto no Visual Studio .NET do tipo Windows Application usando a linguagem VB.NET. O nome que eu usei no projeto foi : datasetWord
No formulário padrão insira os componentes: DataGrid , ListBox , 2 Button e 1 Label. Conforme o layout abaixo:
![]() |
Para este projeto você deve fazer os seguintes
imports:
Imports System.Data.oledb
Imports
Microsoft.VisualBasic
Vai precisar também definir as seguinte variáveis:
Dim dsAlunos As
New DataSet
Dim objWord
As Object
Dim i As Integer
Agora no evento Load do formulário temos o código que abre a tabela Alunos e preenche o DataGrid com os dados e o ListBox com os nomes dos alunos.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
btnFechaWord.Enabled = False
Dim strConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=d:\teste\Escola.mdb" Dim cn As OleDbConnection = New OleDbConnection(strConnection)
Dim strSql As String = "SELECT Codigo, Nome, Curso, Periodo, Mensalidade FROM Alunos" Dim da As OleDbDataAdapter = New OleDbDataAdapter(strSql, cn)
da.Fill(dsAlunos, "Alunos") Catch ex As Exception MsgBox(ex.Message)
End
Try carregaLista() ' fecha a conexao cn.Close() ' Vincula o dastaset ao datagrid dgEscola.DataSource = dsAlunos.Tables(0)
|
O
código da rotina carregaLista() , que preenche o listbox , é dado a
seguir:
Private Sub carregaLista() 'carrega o listbox com o nome dos alunos para seleção Try For i = 0 To dsAlunos.Tables(0).Rows.Count - 1 Me.lstEscola.Items.Add(dsAlunos.Tables(0).Rows(i).Item(1)) Next Catch ex As Exception MsgBox(ex.Message) End Try End Sub |
Agora o
código do botão - Gera Aviso - :
Private Sub btnGeraAviso_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGeraAviso.Click
data = Today
'Instancia a Aplicação Word. objWord = CreateObject("Word.Application") 'Abre o documento aviso.doc do Microsoft Word. objWord.Documents.Open("d:\teste\aviso.doc")
'Percorre o DataSet For i = 0 To dsAlunos.Tables(0).Rows.Count - 1 'Se o nome que está no DataSet for igual ao Nome selecionado no listbox. If lstEscola.SelectedItem = dsAlunos.Tables(0).Rows(i).Item(1) Then 'Procura pela palavra "@escola" e substitui pelo conteúdo indicado SubstituiVariavel("@escola", "Faculdades Caminho Feliz.") SubstituiVariavel("@data", data) SubstituiVariavel("@nome", dsAlunos.Tables(0).Rows(i).Item(1)) SubstituiVariavel("@curso", dsAlunos.Tables(0).Rows(i).Item(2)) SubstituiVariavel("@Periodo", dsAlunos.Tables(0).Rows(i).Item(3)) SubstituiVariavel("@mensalidade", Format(dsAlunos.Tables(0).Rows(i).Item(4), "R$#,##0.00;(R$#,##0.00)")) SubstituiVariavel("@diretor", "Dr. Jose C. Macoratti") End If Next If MsgBox("Confirma abertura do documento?", MsgBoxStyle.YesNo, "Microsoft Word - Aviso.doc") = MsgBoxResult.Yes Then 'torna o Word visivel objWord.visible = True 'habilita o botão para fechar o word sem salvar btnFechaWord.Enabled = True Else fechaword() End If Catch ex As Exception objWord.ActiveDocument.Close(False) objWord.Quit() objWord = Nothing MsgBox(ex.Message) End Try End Sub |
- Neste código estou instanciando um objeto do tipo Microsoft Word,(note que eu não fiz referência a biblioteca nenhuma).
- A seguir percorro a tabela Alunos que preencheu o dataset;
- Se o nome que foi selecionado pelo usuário no ListBox é igual a nome da tabela então eu invoco a rotina substituiVariavel passando como parâmetro o nome da variável e o seu valor;
- Note que existem valores que eu obtenho da tabela usando um índice que representa o campo na tabela.
- Assim : dsAlunos.Tables(0).Rows(i).Item(1) - representa o segundo campo da tabela Alunos ( o nome). Lembre-se que para o primeiro campo o índice é zero.
A rotina que faz a substituição no documento do Word é a seguinte:
Private Sub fechaWord()
objWord.ActiveDocument.Close(False) 'Fecha o Word objWord.Quit() objWord = Nothing
Private Sub btnFechaWord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFechaWord.Click fechaword() End Sub
|
Após rodar o projeto e selecionar o primeiro aluno temos o resultado para o documento:
![]() |
E dessa forma temos a automação OLE trabalhando a nosso favor.
Pegue o projeto aqui : datasetWord.zip (30 k)
Você pode melhorar o exemplo exibido acima de muitas maneiras.
Vou terminar o artigo com as mesmas palavras do artigo anterior : O resto agora é com você...
"Se dissermos que temos comunhão com ele(Deus), e andarmos em trevas, mentimos e não praticamos a verdade." 1 João 1:6
Referências: