Usuário com melhor resposta
Cadastro de modelo de documentos

Pergunta
-
Boa tarde, pessoal.
Estou trabalhando em um sistema VB.NET de gerenciamento de RH e nele eu tenho a opção de imprimir declaração para funcionários com base num modelo *.docx retirando as informações do formulário de cadastro dos funcionários. Todo o processo de preenchimento do modelo está sendo executado através da biblioteca docx.dll.
O problema é que eu preciso programar um código novo e recompilar o sistema sempre que há a necessidade de gerar uma nova declaração.
O que eu gostaria era de criar um formulário onde o usuário irá cadastrar no banco de dados quantos modelos de declaração ele quiser, sem a necessidade de recompilar o sistema. Para isso o usuário precisaria selecionar o arquivo *.docx e informar os campos que o sistema usará para preencher a declaração.
Alguém pode me dar uma luz?
Respostas
-
Já resolvi. Eu gero uma string com os campos da tabela separados por vírgula e salvo em um único campo da tabela de cadastro dos modelos. Dentro do modelo eu inseri os nomes dos campos (os mesmo da tabela do banco de dados) antecedidos por "@". Pra recuperar as informações e as substituir no modelo *.docx eu quebro a string em um array e dentro de um for ... next eu faço o replace substituindo as informações.
Abaixo o código para recuperar os campos e substituir no modelo. (Estou usando a biblioteca Novacode):
If SalvarArquivo.ShowDialog = DialogResult.OK Then Dim LeituraBD As OleDb.OleDbDataReader Dim ComandoSQL As String ComandoSQL = "select * from TB_Servidores where IDServidor like '" & FormCadServidores.IDServidor.Text & "'" 'Atribui a variável objeto de BD a execução dos comandos SQL cm = New OleDb.OleDbCommand(ComandoSQL, cn) LeituraBD = cm.ExecuteReader LeituraBD.Read() 'Abre o modelo Documento = DocX.Load(CaminhoModelo.Text) Dim arrCampos As Array = Split(Campos.Text, ",") For i = 0 To arrCampos.Length - 1 Documento.ReplaceText("@" & arrCampos(i), LeituraBD(arrCampos(i))) Next Documento.ReplaceText("@Dia", DatePart(DateInterval.Day, Date.Today)) Documento.ReplaceText("@Mês", MonthName(Month(Date.Today))) Documento.ReplaceText("@Ano", DatePart(DateInterval.Year, Date.Today)) Documento.ReplaceText("@Diretor_RH", NomeDiretor.Text) Documento.SaveAs(SalvarArquivo.FileName) End If
- Marcado como Resposta EricJhon92 sexta-feira, 16 de dezembro de 2016 23:31
Todas as Respostas
-
Bom dia,
Você pode inserir no conteúdo do arquivo docx alguns marcadores tipo <NOME> e tentar fazer a substituição desta marcação pelo conteúdo do formulário. Você só precisaria cadastrar para cada docx quais os marcadores possíveis para poder fazer o mapeamento.
Usando Word interop para substituição de texto: How to: Programmatically Search for and Replace Text in Documents
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
- Sugerido como Resposta Juliano Nunes Silva Oliveira sexta-feira, 16 de dezembro de 2016 11:12
- Marcado como Resposta Robson William SilvaModerator sexta-feira, 16 de dezembro de 2016 11:22
- Não Marcado como Resposta EricJhon92 sexta-feira, 16 de dezembro de 2016 23:31
-
Essa substituição eu já faço. No modelo *.docx já tem os marcadores. Mas para que seja feito essa substituição é necessário o usuário também informar os campos do banco de dados que serão utilizados. Alguma diga de como cadastrar, além do marcadores do modelo, os campos do banco de dados de modo que o sistema possa fazer as substituições?
-
Crie uma tabela de mapeamento entre os marcados e os campos.
Chave Primária
IdentificadorMarcador
IdentificadorColuna
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
-
Já resolvi. Eu gero uma string com os campos da tabela separados por vírgula e salvo em um único campo da tabela de cadastro dos modelos. Dentro do modelo eu inseri os nomes dos campos (os mesmo da tabela do banco de dados) antecedidos por "@". Pra recuperar as informações e as substituir no modelo *.docx eu quebro a string em um array e dentro de um for ... next eu faço o replace substituindo as informações.
Abaixo o código para recuperar os campos e substituir no modelo. (Estou usando a biblioteca Novacode):
If SalvarArquivo.ShowDialog = DialogResult.OK Then Dim LeituraBD As OleDb.OleDbDataReader Dim ComandoSQL As String ComandoSQL = "select * from TB_Servidores where IDServidor like '" & FormCadServidores.IDServidor.Text & "'" 'Atribui a variável objeto de BD a execução dos comandos SQL cm = New OleDb.OleDbCommand(ComandoSQL, cn) LeituraBD = cm.ExecuteReader LeituraBD.Read() 'Abre o modelo Documento = DocX.Load(CaminhoModelo.Text) Dim arrCampos As Array = Split(Campos.Text, ",") For i = 0 To arrCampos.Length - 1 Documento.ReplaceText("@" & arrCampos(i), LeituraBD(arrCampos(i))) Next Documento.ReplaceText("@Dia", DatePart(DateInterval.Day, Date.Today)) Documento.ReplaceText("@Mês", MonthName(Month(Date.Today))) Documento.ReplaceText("@Ano", DatePart(DateInterval.Year, Date.Today)) Documento.ReplaceText("@Diretor_RH", NomeDiretor.Text) Documento.SaveAs(SalvarArquivo.FileName) End If
- Marcado como Resposta EricJhon92 sexta-feira, 16 de dezembro de 2016 23:31