Jump to content

Word em massa


bioshock
 Share

Recommended Posts

Boas pessoal¬† ūüĎć

Estou a fazer uma aplica√ß√£o em que, a determinado momento, √© poss√≠vel passar para o word as informa√ß√Ķes. O que eu pretendo √© passar em massa as informa√ß√Ķes. Quero com isto dizer que, para cada registo que haja na base de dados, as vari√°veis que declarei no word, ter√£o de ser substitu√≠das pelas informa√ß√Ķes da base de dados.

O problema √© que ele s√≥ substitui pelo primeiro registo, eu n√£o estou a ver como hei de fazer para que,¬† sempre que haja mais do que um registo ele adicione vari√°veis e substitua pelas informa√ß√Ķes da BD.

Para uma melhor percepção, deixo o código abaixo:

Dim WordObject As Object
Try
            ' Selecciona a base de dados e cria a connection..;
            Dim Connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\DB.mdb")
            ' Cria a query para seleccionar os dados que pretendemos;
            Dim DataAdapter As New OleDbDataAdapter("SELECT * FROM TClientes", Connection)
            ' Cria um DataSet, ou seja, uma representação em memória da informação; 
            Dim DataSet As New DataSet
            ' Coloca a informação da tabela definida no DataSet; 
            DataAdapter.Fill(DataSet, "TClientes")
            ' Instancia a Aplicação Word;
            WordObject = CreateObject("Word.Application")
            ' Abre o documento Teste.docx do Microsoft Word;
            WordObject.Documents.Open(Application.StartupPath & "\Teste.docx")
            ' Apresentamos uma mensagem;
            If MessageBox.Show("Confirma a abertura do documento?", "Documento Word", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
                ' Abrimos o Word;
                WordObject.visible = True
                ' Percorre o DataSet enquanto há registos;
                For i As Integer = 0 To DataSet.Tables("TClientes").Rows.Count
                    ' Substitui as variáveis pelos registos da tabela;
                    SubstituiVariavel("@IDCliente", "IDUtilizador: " & DataSet.Tables("TCliente").Rows(0).Item(0))
                    SubstituiVariavel("@Cliente", "Cliente: " & DataSet.Tables("TCliente").Rows(0).Item(1))
                    SubstituiVariavel("@Morada", "Morada: " & DataSet.Tables("TCliente").Rows(0).Item(2))
                    SubstituiVariavel("@CodigoPostal", "Código Postal: " & DataSet.Tables("TCliente").Rows(0).Item(3))
                    SubstituiVariavel("@Telefone", "Telefone: " & DataSet.Tables("TCliente").Rows(0).Item(4))
                Next
            End If
            ' Caso haja erro..;
        Catch ex As Exception
            WordObject.ActiveDocument.Close(False)
            WordObject.Quit()
            WordObject = Nothing
            MsgBox(ex.Message)
        End Try
    End Sub
    Private Sub SubstituiVariavel(ByVal ProcuraPalavra As String, ByVal SubstituiPalavra As String)
        ' Procura as variáveis e substitui os valores;
        With WordObject.Selection.Find
            .Text = ProcuraPalavra.ToString
            .Replacement.Text = SubstituiPalavra.ToString
            .Forward = True
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            ' Enquanto o ciclo estiver a ser executado;
            While .Execute = True
                ' Seleccionamos a informação;
                WordObject.Selection.Select()
¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ' Colamos no documento as informa√ß√Ķes da base de dados;
                System.Windows.Forms.Clipboard.SetDataObject(SubstituiPalavra)
                WordObject.Selection.Paste()
            End While
        End With
    End Sub

Tenho andado a "matutar" nisto à algum tempo, mas sem sucesso  ?

Obrigado!¬† ūüĎć

Link to comment
Share on other sites

Não podes substituir no documento original, senão usas o template e depois não podes fazer mais registos, que é o que te está a acontecer.

Usa esse documento apenas como template.

Copia o texto para uma área temporária, por exemplo memória, e fazes a substituição ai. Uma vez feita a substituição, acrescentas o texto substituído no documento final.

Quando terminares, no documento final terás todos os textos substituídos.

Já agora, se não estou em erro, usar essa técnica não é muito bom dado que tens de ter o word instalado na máquina e o mesmo não pode ser usado durante a execução da tua aplicação.

Uma solução mais leve e sem dependências é usares um template em RTF, que é texto simples e que podes construir no próprio Word, e fazeres um documento final também em RTF (até podes dar a extensão .doc porque o Word vai papá-lo sem problemas).

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Então é normal, tens um ciclo for, mas estás sempre a chamar o primeiro registo...

DataSet.Tables("TCliente").Rows(0).Item(0)

dever√° ser

DataSet.Tables("TCliente").Rows(i).Item(0)

r00t, oh, pe√ßo desculpa. Eu enganei-me, n√£o coloquei a "vers√£o mais recente" do c√≥digo¬† ūüĎć

Na versão mais recente utilizo, claro, o código:

DataSet.Tables("TCliente").Rows(i).Item(0)

Mas continua s√≥ a aparecer o 1¬ļ registo.

Não podes substituir no documento original, senão usas o template e depois não podes fazer mais registos, que é o que te está a acontecer.

Usa esse documento apenas como template.

Copia o texto para uma área temporária, por exemplo memória, e fazes a substituição ai. Uma vez feita a substituição, acrescentas o texto substituído no documento final.

Quando terminares, no documento final terás todos os textos substituídos.

Já agora, se não estou em erro, usar essa técnica não é muito bom dado que tens de ter o word instalado na máquina e o mesmo não pode ser usado durante a execução da tua aplicação.

Uma solução mais leve e sem dependências é usares um template em RTF, que é texto simples e que podes construir no próprio Word, e fazeres um documento final também em RTF (até podes dar a extensão .doc porque o Word vai papá-lo sem problemas).

Vou analisar atentamente o que disseste e tentar colocar em pr√°tica. Se souberes de algum exemplo pr√°tico, agradecia-te que me dissesses.

Obrigado a ambos¬† ūüĎć

Link to comment
Share on other sites

Uma maneira simples de fazeres isso, dependendo do que deseja obter no final se 1 documento com m√ļltiplas p√°ginas ou m√ļltiplos documentos s√≥ com 1 p√°gina cada.

No ciclo for só tens que seleccionar o ficheiro original (copiar para memória ou reabrir), alterares as variáveis  e guardar com um novo nome num local qualquer, isto se quiseres documentos diferentes.

Ou por outro lado abres o documento original, guardas uma cópia em qualquer sítio, e vais adicionando folhas após a alteração das variáveis.

Link to comment
Share on other sites

Uma maneira simples de fazeres isso, dependendo do que deseja obter no final se 1 documento com m√ļltiplas p√°ginas ou m√ļltiplos documentos s√≥ com 1 p√°gina cada.

No ciclo for só tens que seleccionar o ficheiro original (copiar para memória ou reabrir), alterares as variáveis  e guardar com um novo nome num local qualquer, isto se quiseres documentos diferentes.

Ou por outro lado abres o documento original, guardas uma cópia em qualquer sítio, e vais adicionando folhas após a alteração das variáveis.

O objectivo √© obter um documento com m√ļltiplas p√°ginas. Eu preciso √© de saber como adicionar as vari√°veis sempre que, no ciclo, seja encontrado registos.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.