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


'desabilita o botão para fechar o word

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)


cn.Open()


' define um objeto dataAdapater

Dim strSql As String = "SELECT Codigo, Nome, Curso, Periodo, Mensalidade FROM Alunos"

Dim da As OleDbDataAdapter = New OleDbDataAdapter(strSql, cn)


Try

     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)


End
Sub


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


Dim
data As
Date

data = Today


Try

   '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()


'Fecha o documento Word sem salvar

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:


José Carlos Macoratti