Desenvolvimento - Visual Basic .NET
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.
por José Carlos MacorattiNeste 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.
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.
Para o exemplo eu criei um banco de dados chamado escola 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 VS.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.oledbImports Microsoft.VisualBasic
Vai precisar também definir as seguinte variáveis:
Dim dsAlunos As New DataSetDim 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 "abre uma conexao Dim strConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=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 SubstituiVariavel(ByVal Achar As String, ByVal Substituir As String)"procura a variável e substitui o valor With objWord.Selection.Find.Text = Achar.ToString .Replacement.Text = Substituir.ToString .Forward = True .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False objWord.Selection.Select() System.Windows.Forms.Clipboard.SetDataObject(Substituir) objWord.Selection.Paste() End While End With End Sub |
Para encerrar o código da rotina fechaWord e do evento click do botão - Fechar Word sem salvar:
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:
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ê...
- 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