Rotina substituir strings no Word - Alguém me ajuda?
Caros Companheiros....
Vejam se podem me ajudar....
Tenho uma rotina que faz o seguinte... Substitui determinadas palavras em um documento Word, pelo conteudo de campos de uma tabela.
A Rotina funciona perfeitamente quando preciso fazer as substituições no documento Word, para apenas um registro da tabela.
Como tenho um modelo de notificação de cobrança padrão, feito no word, eu preciso ir alterando o nome e os meses dos debitos dentro do documento word.
O loop na tabela fica assim: (está funcionando perfeitamente)
While not dtmDados.tblDebitoAtivoPeriodo.Eof Do
Begin
Cursor := crHourGlass;
Word := CreateOleObject(´Word.Application´);
Word.Visible := False;
Contrato := Word.Documents;
Doc := Contrato.Open(C:\Prl\Imagens\Notifica.Doc´); //
Doc.Content.Find.Execute(FindText := ´<<Nome_Empresa>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoNome.AsString);
Doc.Content.Find.Execute(FindText := ´<<Meses_Debito>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoMesesDebitantes.AsString);
Doc.SaveAs(´C:\Prl\Imagens\Impressao.doc´); // Salva com outro nome para não solicitar salvação e não sobrepor o modelo
Doc.PrintOut(False);
Word.Quit;
Cursor := crDefault;
DeleteFile(´C:\Prl\Imagens\Impressao.doc´);
dtmDados.tblDebitoAtivoPeriodo.Next;
End;
dtmDados.tblDebitoAtivoPeriodo.IndexFieldNames := ´Codigo´;
Showmessage(´Notificações Impressas com sucesso!´);
Companheiros... A rotina está funcionando perfeitamente mas gostaria de programar a mesma de forma que eu não precise ficar dando todos os comandos de criação, abertura e estruturacao para que o word susbstitua as strings desejadas.
Da forma como está a rotina está muito lenta. Por exemplo se eu tiver 300 registros na tabela o word será aaberto e fechado 300 vezes.
Gostaria de trabalhar melhor este loop.
Se alguém puder me ajudar ficarei muito grato.
Um grande abraço a todos.
Pablo - Marília/SP
Vejam se podem me ajudar....
Tenho uma rotina que faz o seguinte... Substitui determinadas palavras em um documento Word, pelo conteudo de campos de uma tabela.
A Rotina funciona perfeitamente quando preciso fazer as substituições no documento Word, para apenas um registro da tabela.
Como tenho um modelo de notificação de cobrança padrão, feito no word, eu preciso ir alterando o nome e os meses dos debitos dentro do documento word.
O loop na tabela fica assim: (está funcionando perfeitamente)
While not dtmDados.tblDebitoAtivoPeriodo.Eof Do
Begin
Cursor := crHourGlass;
Word := CreateOleObject(´Word.Application´);
Word.Visible := False;
Contrato := Word.Documents;
Doc := Contrato.Open(C:\Prl\Imagens\Notifica.Doc´); //
Doc.Content.Find.Execute(FindText := ´<<Nome_Empresa>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoNome.AsString);
Doc.Content.Find.Execute(FindText := ´<<Meses_Debito>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoMesesDebitantes.AsString);
Doc.SaveAs(´C:\Prl\Imagens\Impressao.doc´); // Salva com outro nome para não solicitar salvação e não sobrepor o modelo
Doc.PrintOut(False);
Word.Quit;
Cursor := crDefault;
DeleteFile(´C:\Prl\Imagens\Impressao.doc´);
dtmDados.tblDebitoAtivoPeriodo.Next;
End;
dtmDados.tblDebitoAtivoPeriodo.IndexFieldNames := ´Codigo´;
Showmessage(´Notificações Impressas com sucesso!´);
Companheiros... A rotina está funcionando perfeitamente mas gostaria de programar a mesma de forma que eu não precise ficar dando todos os comandos de criação, abertura e estruturacao para que o word susbstitua as strings desejadas.
Da forma como está a rotina está muito lenta. Por exemplo se eu tiver 300 registros na tabela o word será aaberto e fechado 300 vezes.
Gostaria de trabalhar melhor este loop.
Se alguém puder me ajudar ficarei muito grato.
Um grande abraço a todos.
Pablo - Marília/SP
Pablo_lima
Curtidas 0
Respostas
Phibis
15/10/2003
colega andei trabalhando em algo parecido e acho que para melhorar a velocidade, experimente tirar as três primeiras linhas de dentro da estrutura de repetição.
Cursor := crHourGlass;
Word := CreateOleObject(´Word.Application´);
Word.Visible := False;
pois desta forma acredito que você estará criando uma aplicação Word apenas e inserindo varios documentos word, mas aplicação será aberta apenas uma vez.
ficando assim:
O loop na tabela fica assim: (está funcionando perfeitamente)
Cursor := crHourGlass;
Word := CreateOleObject(´Word.Application´);
Word.Visible := False;
While not dtmDados.tblDebitoAtivoPeriodo.Eof Do
Begin
Contrato := Word.Documents;
Doc := Contrato.Open(C:\Prl\Imagens\Notifica.Doc´); //
Doc.Content.Find.Execute(FindText := ´<<Nome_Empresa>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoNome.AsString);
Doc.Content.Find.Execute(FindText := ´<<Meses_Debito>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoMesesDebitantes.AsString);
Doc.SaveAs(´C:\Prl\Imagens\Impressao.doc´); // Salva com outro nome para não solicitar salvação e não sobrepor o modelo
Doc.PrintOut(False);
Word.Quit;
Cursor := crDefault;
DeleteFile(´C:\Prl\Imagens\Impressao.doc´);
dtmDados.tblDebitoAtivoPeriodo.Next;
End;
dtmDados.tblDebitoAtivoPeriodo.IndexFieldNames := ´Codigo´;
Showmessage(´Notificações Impressas com sucesso!´);
Cursor := crHourGlass;
Word := CreateOleObject(´Word.Application´);
Word.Visible := False;
pois desta forma acredito que você estará criando uma aplicação Word apenas e inserindo varios documentos word, mas aplicação será aberta apenas uma vez.
ficando assim:
O loop na tabela fica assim: (está funcionando perfeitamente)
Cursor := crHourGlass;
Word := CreateOleObject(´Word.Application´);
Word.Visible := False;
While not dtmDados.tblDebitoAtivoPeriodo.Eof Do
Begin
Contrato := Word.Documents;
Doc := Contrato.Open(C:\Prl\Imagens\Notifica.Doc´); //
Doc.Content.Find.Execute(FindText := ´<<Nome_Empresa>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoNome.AsString);
Doc.Content.Find.Execute(FindText := ´<<Meses_Debito>>´, ReplaceWith := dtmDados.tblDebitoAtivoPeriodoMesesDebitantes.AsString);
Doc.SaveAs(´C:\Prl\Imagens\Impressao.doc´); // Salva com outro nome para não solicitar salvação e não sobrepor o modelo
Doc.PrintOut(False);
Word.Quit;
Cursor := crDefault;
DeleteFile(´C:\Prl\Imagens\Impressao.doc´);
dtmDados.tblDebitoAtivoPeriodo.Next;
End;
dtmDados.tblDebitoAtivoPeriodo.IndexFieldNames := ´Codigo´;
Showmessage(´Notificações Impressas com sucesso!´);
GOSTEI 0
Beppe
15/10/2003
Eu penso que Word.Quit deveria estar após o loop e em seu lugar Doc.Close.
Ataliba
Ataliba
GOSTEI 0