none
Cadastro de modelo de documentos RRS feed

  • 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?

    quarta-feira, 14 de dezembro de 2016 19:20

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
    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".

    quinta-feira, 15 de dezembro de 2016 11:33
  • 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?
    sexta-feira, 16 de dezembro de 2016 14:19
  • 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".

    sexta-feira, 16 de dezembro de 2016 14:27
  • 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
    sexta-feira, 16 de dezembro de 2016 23:31