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.oledbVai precisar também definir as seguinte variáveis:
Dim dsAlunos As New DataSetAgora 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 'abre uma conexao Dim strConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=d:\teste\Escola.mdb" Dim cn As OleDbConnection = New OleDbConnection(strConnection)
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 TryFor i = 0 To dsAlunos.Tables(0).Rows.Count - 1 Me.lstEscola.Items.Add(dsAlunos.Tables(0).Rows(i).Item(1)) Next Catch ex As ExceptionMsgBox(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
objWord = CreateObject("Word.Application") 'Abre o documento aviso.doc do Microsoft Word. objWord.Documents.Open("d:\teste\aviso.doc")
'Percorre o DataSet '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 ExceptionobjWord.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 End Sub 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: