copiar trecho do word
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.
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.
Vitor Rubio
Curtidas 0
Respostas
Marcosrocha
15/10/2008
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.
Caso não tenha êxito, volte a postar que eu arrumo um tempo pra fazer um exemplo e te mandar.
GOSTEI 0
Vitor Rubio
15/10/2008
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.
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.
GOSTEI 0
Marcosrocha
15/10/2008
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).
Ps.: Depois eu posto um exemplo dependendo da sua resposta (ou seja, quando eu entender pra que é o código).
GOSTEI 0
Vitor Rubio
15/10/2008
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.
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.
GOSTEI 0
Marcosrocha
15/10/2008
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
Vou elaborar um exemplo e posto aqui mais tarde
GOSTEI 0
Vitor Rubio
15/10/2008
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.
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.
GOSTEI 0
Emarcolongo
15/10/2008
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.
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.
GOSTEI 0
Marcosrocha
15/10/2008
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.
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.
GOSTEI 0
Vitor Rubio
15/10/2008
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.
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.
GOSTEI 0
Vitor Rubio
15/10/2008
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.
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.
GOSTEI 0
Vitor Rubio
15/10/2008
consegui fazer isso aqui:
porem ainda não está copiando a formatação e os demais elementos.
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.
GOSTEI 0
Vitor Rubio
15/10/2008
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!
procurei em tudo quanto é lugar.
Se tem alguma revista clube delphi falando disso deve ser uma edição que eu não tenho.
valew!
GOSTEI 0
Marcos D
15/10/2008
consegui fazer isso aqui:
porem ainda não está copiando a formatação e os demais elementos.
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.
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;
GOSTEI 0
Marcos D
15/10/2008
consegui fazer isso aqui:
porem ainda não está copiando a formatação e os demais elementos.
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.
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;GOSTEI 0
Laercio Geronymo
15/10/2008
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.
Boa tarde Vitor... Eu tenho esta rotina para imprimir a ordem de serviço dos funcionários.... Aqui está a rotina inteira que roda em meu sistema... Lembre-se de que você tem que ter um modelo com as variáveis dos @textoAserSubstituido...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.
procedure TfrmFuncionario.sbImprimirOSClick(Sender: TObject);
var
MSWord: OleVariant;
v_dd, v_mm, v_aa, v_TipoRisco, NomeDoc: String;
linha, linhaP, v_Linha, I: integer;
const
wdHeaderFooterPrimary = 1;
begin
if (tbFuncOS.RecordCount > 0) and (tbRiscoFunOS.RecordCount > 0) then
begin
Mdadosempr.Text := tbFuncOSDadosEmpr.Value;
Mresumo.Text := tbFuncOSDados0.Value;
Mrisco.Text := '';
Mlesao.Text := '';
Melimina.Text:='';
NomeDoc:= 'MODELO OS.doc';
MSWord := CreateOleObject('Word.Application');
{ Será aberto seu documento com o parametro a ser substituido }
MSWord.Application.Documents.Open(ExtractFilePath(Application.ExeName) + NomeDoc);
// Inicia aqui
// Limpo os parametros de busca do word
MSWord.Application.Selection.Find.ClearFormatting;
{ Adiciono no find o parametro que quero buscar dentro do word e abaixo esta selecionado as condições }
MSWord.Application.Selection.Find.Text := '@nome';
MSWord.Application.Selection.Find.Replacement.Text := '';
MSWord.Application.Selection.Find.Forward := true;
MSWord.Application.Selection.Find.Format := False;
MSWord.Application.Selection.Find.MatchCase := False;
MSWord.Application.Selection.Find.MatchWholeWord := False;
MSWord.Application.Selection.Find.MatchWildcards := False;
MSWord.Application.Selection.Find.MatchSoundsLike := False;
MSWord.Application.Selection.Find.MatchAllWordForms := False;
// Executo o pesquisa, o parametro se estiver no texto vai ficar selecionado
MSWord.Application.Selection.Find.Execute;
if MSWord.Application.Selection.Find.Found then { verifica se achou }
// Substituo o parametro selecionado pelo texto que esta eu quero
MSWord.Application.Selection.TypeText(frmFuncionario.tbFuncNome.Text);
MSWord.Application.Selection.Find.Text := '@cargo';
MSWord.Application.Selection.Find.Replacement.Text := '';
MSWord.Application.Selection.Find.Forward := true;
MSWord.Application.Selection.Find.Format := False;
MSWord.Application.Selection.Find.MatchCase := False;
MSWord.Application.Selection.Find.MatchWholeWord := False;
MSWord.Application.Selection.Find.MatchWildcards := False;
MSWord.Application.Selection.Find.MatchSoundsLike := False;
MSWord.Application.Selection.Find.MatchAllWordForms := False;
// Executo o pesquisa, o parametro se estiver no texto vai ficar selecionado
MSWord.Application.Selection.Find.Execute;
if MSWord.Application.Selection.Find.Found then { verifica se achou }
// Substituo o parametro selecionado pelo texto que esta eu quero
MSWord.Application.Selection.TypeText(frmFuncionario.tbFuncv_Cargo.Text);
// Salvar Documento
Messagedlg('Se não visualizar a OS, verifique na barra de ferramentas do windows.... Ok!!!',mtWarning,[mbOk],0);
editnome.Text:=frmFuncionario.tbFuncNome.Text + '.doc';
// Deixo o word visivel
MSWord.Visible := true;
MSWord.ActiveDocument.SaveAs(editnome.Text,0);
// MSWord.Quit;
end
else
ShowMessage('Não existe O.S. lançada no funcionário... Lance a O.S. para imprimir... Ok!!!');
end;
GOSTEI 0