copiar trecho do word

15/10/2008

10

pessoal, estou com o seguinte problema, procurei no forum e não achei.

preciso abrir um documento do word, procurar por um trecho, selecionar e copiar.


agora vem o mais dificil: preciso pegar isso que eu joguei na clipboard e passar para uma variavel ou objeto.


depois eu varro, num loop for, 1000 documentos do word DIFERENTES. porem todos eles tem uma palavra <#substituaaqui> que vai ser localizada, substituida por aquela nossa variavel, salvar e fechar.


porque eu preciso da variavel e não posso usar a clipboard? porque durante esse loop, se o usuario apertar ctrl+c em algum lugar, o programa vai passar a colar o que o usuario copiou a partir dese ponto, e não a seleção original.


Responder

Posts

16/10/2008

Marcosrocha

Amigo procure na Internet por Ole Automation (Automação com Ole Objects) ou WordApplication.
Caso não tenha êxito, volte a postar que eu arrumo um tempo pra fazer um exemplo e te mandar.


Responder

16/10/2008

Vitor Rubio

Amigo, se você puder e não for incomodar, por favor me ajude:

pesquisei bastante no google e achei varios lugares ensinando a abrir documentos de word.

eu posso abrir, selecionar texto, copiar para o clipboard etc e talz, mas não achei nenhuma forma de copiar o conteudo selecionado para uma variavel em vez de copiar para a clipboard.

tambem não achei uma forma de copiar o conteudo da clipboard para uma variavel.


Responder

16/10/2008

Marcosrocha

Pra quê copiar o conteúdo do texto para o Clipboard e depois passar para uma variável?

Ps.: Depois eu posto um exemplo dependendo da sua resposta (ou seja, quando eu entender pra que é o código).


Responder

16/10/2008

Vitor Rubio

então, como eu disse, eu não consigo copiar um conteudo de um documento de word para outro. Não consigo pegar por exemplo um paragrafo de um documento, copiar para uma variavel e depois jogar esse conteudo para um outro documento.


eu consigo coipar o texto selecionado para a clipboard usando o metodo copy, e depois colar no outro word usando o metodo paste.

O problema em se usar a clipboard está aqui: num loop de 1000 documentos juridicos, onde eu copio um mesmo paragrafo para 1000 documentos que são diferentes, se o usuario minimizar meu programa e copiar alguma outra coisa com clrl-c o loop vai passar a colar nos documentos de word de destino restantes o que o usuario acabou de copiar, que está no clipboard, e não aquilo que eu queria.


Responder

16/10/2008

Marcosrocha

Como serão sempre dois documentos abertos ao mesmo tempo você pode utilizar duas variáveis pra gardar o documento original e outra para os 1000 documentos.
Vou elaborar um exemplo e posto aqui mais tarde


Responder

16/10/2008

Vitor Rubio

o word, a partir do xp, consegue manter multiplos objetos na clipboard.

como ele faz isso? Como eu poderia fazer um gerenciador de clipboard proprio, parecido com isso? Assim eu guardaria um objeto da clipboard numa determinada posição e colaria o conteudo no word a partir deste.


Responder

17/10/2008

Emarcolongo

Vc quer só copiar ou substituir uma string no arquivo DOC ?

se quiser só abrir, substituir dê uma olhada neste topico;

[url] http://forum.devmedia.com.br/viewtopic.php?t=97988 [/url]

Ele faz isto abre um doc e altera o conteudo.


Responder

17/10/2008

Marcosrocha

emarcolongo, é abrir um documento tipo modelo, selecionar um texto nele. Aí fazer uma iteração numa pasta percorrendo x outros documentos procurando por <#substituaaqui> e substituindo pelo texto copiado no documento modelo.
Seu exemplo pode ser usado como base para ele. Só precisa implementar o loop e o texto a ser substituido. No caso ele está usando Clipboard mas pode-se usar WordApplication1.Selection.Text para jogar o texto selecionado para uma variável do tipo String, por exemplo.


Responder

17/10/2008

Vitor Rubio

Isso não serve, eu não quero substituir um texto do word por uma string de um edit ou do banco de dados, eu quero substituir por um trecho copiado de outro word. Esse texto pode conter figuras e tabelas

São documentos jurídicos, e as assinaturas dos juízes sempre são figuras.

Eu uso isso para um juiz replicar seus pareceres, anotações e assinaturas em todos os documentos do(s) seu(s) processos ou sob sua custodia.


Responder

17/10/2008

Vitor Rubio

marcosrocha,

o método que você falou funcionou parcialmente. Consegui copiar de um word para o outro um trecho de texto selecionado, sem passar pelo clipboard. o problema é que não consegui copiar a formatação.


Responder

17/10/2008

Vitor Rubio

consegui fazer isso aqui:

      docWord := CreateOleObject(´Word.Application´);
      docWord.Visible := True;
      Contrato := docWord.Documents;
      Doc := Contrato.Open(´D:\vitor\word2\origem.doc´);
      doc.Range.Select;

      docWord2 := CreateOleObject(´Word.Application´);
      docWord2.Visible := True;
      Contrato2 := docWord.Documents;
      Doc2 := Contrato.Open(´D:\vitor\word2\destino.doc´);
      Doc2.Content.Find.Execute(FindText := ´<#TexotoColado>´, ReplaceWith := doc.Range);



porem ainda não está copiando a formatação e os demais elementos.


Responder

20/10/2008

Vitor Rubio

será que não tem jeito?

procurei em tudo quanto é lugar.

Se tem alguma revista clube delphi falando disso deve ser uma edição que eu não tenho.

valew!


Responder

19/12/2018

Marcos D

consegui fazer isso aqui:
[code:1:ff37ce28e0] docWord := CreateOleObject(´Word.Application´);
docWord.Visible := True;
Contrato := docWord.Documents;
Doc := Contrato.Open(´D:\\vitor\\word2\\origem.doc´);
doc.Range.Select;

docWord2 := CreateOleObject(´Word.Application´);
docWord2.Visible := True;
Contrato2 := docWord.Documents;
Doc2 := Contrato.Open(´D:\\vitor\\word2\\destino.doc´);
Doc2.Content.Find.Execute(FindText := ´<#TexotoColado>´, ReplaceWith := doc.Range);[/code:1:ff37ce28e0]

porem ainda não está copiando a formatação e os demais elementos.


procedure TesteDocWord;

  procedure WordReplace(pSelOrigem, pSelDestino: Variant; pTextoProcurado: string);
  begin
    pSelDestino.Find.Forward := True;
    pSelDestino.Find.ClearFormatting;
    pSelDestino.Find.MatchWholeWord := True;
    pSelDestino.Find.Execute(pTextoProcurado);
    if pSelDestino.Text = pTextoProcurado then
    begin
      pSelOrigem.Copy;
      pSelDestino.Paste;
    end;
  end;

var
  lWord: Variant;
  lDocOrigem, lDocDestino: Olevariant;
begin
  lWord := CreateOleObject('Word.Application');
  try
    lWord.Visible := True;
    lDocOrigem := lWord.Documents.Open('c:\\temp\\Origem.doc');
    lDocOrigem.Range.Select;

    lDocDestino := lWord.Documents.Open('c:\\temp\\Modelo.doc');
    WordReplace(lDocOrigem.Range, lDocDestino.Content, '<#CustomTextTag>');

    lDocDestino.SaveAs2('c:\\temp\\Destino.doc');
  finally
    lWord.Quit;
    lWord := Unassigned;
    lDocOrigem := Unassigned;
    lDocDestino := Unassigned;
  end;
end;
Responder

21/12/2018

Marcos D

consegui fazer isso aqui:
[code:1:ff37ce28e0] docWord := CreateOleObject(´Word.Application´);
docWord.Visible := True;
Contrato := docWord.Documents;
Doc := Contrato.Open(´D:\\\\vitor\\\\word2\\\\origem.doc´);
doc.Range.Select;

docWord2 := CreateOleObject(´Word.Application´);
docWord2.Visible := True;
Contrato2 := docWord.Documents;
Doc2 := Contrato.Open(´D:\\\\vitor\\\\word2\\\\destino.doc´);
Doc2.Content.Find.Execute(FindText := ´<#TexotoColado>´, ReplaceWith := doc.Range);[/code:1:ff37ce28e0]

porem ainda não está copiando a formatação e os demais elementos.


procedure TesteDocWord;

  procedure WordReplace(pSelOrigem, pSelDestino: Variant; pTextoProcurado: string);
  begin
    pSelDestino.Find.Forward := True;
    pSelDestino.Find.ClearFormatting;
    pSelDestino.Find.MatchWholeWord := True;
    pSelDestino.Find.Execute(pTextoProcurado);
    if pSelDestino.Text = pTextoProcurado then
    begin
      pSelOrigem.Copy;
      pSelDestino.Paste;
    end;
  end;

var
  lWord: Variant;
  lDocOrigem, lDocDestino: Olevariant;
begin
  lWord := CreateOleObject('Word.Application');
  try
    lWord.Visible := True;
    lDocOrigem := lWord.Documents.Open('c:\\\\temp\\\\Origem.doc');
    lDocOrigem.Range.Select;

    lDocDestino := lWord.Documents.Open('c:\\\\temp\\\\Modelo.doc');
    WordReplace(lDocOrigem.Range, lDocDestino.Content, '<#CustomTextTag>');

    lDocDestino.SaveAs2('c:\\\\temp\\\\Destino.doc');
  finally
    lWord.Quit;
    lWord := Unassigned;
    lDocOrigem := Unassigned;
    lDocDestino := Unassigned;
  end;
end;


Complementando o exemplo citado acima, consegui não utilizar o ClipBoard, utilizando o "FormattedText":

  procedure WordReplace(pSelOrigem, pSelDestino: Variant; pTextoProcurado: string);
  begin
    pSelDestino.Find.Forward := True;
    pSelDestino.Find.ClearFormatting;
    pSelDestino.Find.MatchWholeWord := True;
    pSelDestino.Find.Execute(pTextoProcurado);
    if pSelDestino.Text = pTextoProcurado then
    begin
      //pSelOrigem.Copy;
      //pSelDestino.Paste;
      pSelDestino.FormattedText := pSelOrigem;
    end;
  end;
Responder