Integração com word impressão em massa

04/06/2008

1

Saudações,
procurei bastante por aqui e não encontrei, por avor, se já houver algum tópico relacionado aos meus questionamentos, solicito que seja informado o link.

Há um tempo atrás, desenvolvi uma aplicação onde era montado um contrato de serviço no word, usando substituição de tags.
gerei um arquivo padrao somente leitura (para o usuario nao salvar sem querer) e expliquei ao cliente como editar as tags...

até aí está tudo ok.
porém, recentemente o cliente solicitou uma alteração no sistema que seria um cadastro simples de funcionários, desta forma, seria definida, semanalmente, uma listagem de funcionários que trabalharam na semana, em qual evento eles trabalharam, valor, data, etc...
ok..
montei um arquivo matriz no word, com as tags, no padrão que o cliente já está acostumado...
porém, esbarrei em um problema...
a idéia principal é: pegar esta listagem, e, para cada item, abrir o doc do word, alterar as tags, imprimir e fechar o doc do word...

só que estou com uns problemas...
[b:d610ac56ff]primeiro[/b:d610ac56ff]: como eu seleciono para qual impressora que quero enviar os dados (já que, no primeiro arquivo que criei (antigo), eu abria o word e mantinha aberto, o cliente verificava, alterava o necessário e imprimia manualmente)... no caso atual, serão impressos mais de 30 documentos por vez, ficando inviável a interação com o usuário a cada impressão...

[b:d610ac56ff]segundo[/b:d610ac56ff]: quando mando fechar o doc ele pede para salvar, há alguma maneira de suprimir isto ? e como meu arquivo é somente leitura, é gerado um erro também, mas creio que seria suprimido se eu conseguir fechar o doc sem salvar ;)

bom, estas são as minhas principais tormentas do momento.

agradeço sinceramente a todos que estiveram aqui, nem que seja para somente ler...

obrigado.
estou contando com a ajuda de vocês...

ah !
vou colocar aqui a forma que estou trabalhando, já que acima somente citei a lógica desejada...

inicío abrindo o word
              Word := CreateOleObject(´Word.Application´);
              Word.Visible := False; // NÃO EXIBIR PARA O USUÁRIO
              Docs := Word.Documents;


no loop eu faço assim:
// ABRINDO O DOCUMENTO
              Doc := Docs.Open(´C:\test\test.doc´);
//SUBSTITUINDO AS TAGS
                  Doc.Content.Find.Execute(FindText := ´<VALOR>´, ReplaceWith := Valor); // AQUI NO FORUM NAO VOU POR TODAS, APENAS PARA SABEREM COMO ESTOU MANIPULANDO

              // INICIAR IMPRESSAO
              Doc.PrintOut(False); // IMPRIMIR
              Doc.Close; // FECHAR O ARQUIVO DE DENTRO DO WORD



após o loop eu encerro o word
          Word.quit; // FECHAR O WORD



quando mando o comando de impressão, ele pega minha impressora padrão, que, na verdade, nem impressora é, é um gerador de PDF :roll: por isto que queria selecionar a impressora, no cliente há várias impressoras, gostaria que ele pudesse decidir para qual enviar a impressão.

e quando dou o close no arquivo word aparece a tela de ´salvar como´, mesmo o word não estando aberto...
clico no cancelar, ele abre pra mim o arquivo do word da forma que deveria ser impresso, mas sem nenhum menu do word, apenas a barra de título...
fecho o doc, ele pergunta se eu quero salvar, digo que não, então, na minha aplicação eu vejo a seguinte mensagem de erro:
Este arquivo é somente leitura.
(C:\teste\teste.doc)

após isto ele não processa o restante da lista (faz apenas para o primeiro, e, após o erro, aborta os demais...
alguma ajdua ?
obrigado


Responder

Posts

04/06/2008

David_farina

vixe, ficou grande meu post :oops:


(na verdade este reply é pq esqueci de marcar a opção ´Notificar-me quando for respondida) no primeiro post, e como não dá pra editar, estou pondo uma resposta
:roll: :oops: :roll: :oops:


Responder

04/06/2008

David_farina

uma parte solucionada...
não da forma que eu gostaria... ainda procuro por uma solução melhor.. de imediato ela me serve, mas tem que ser melhorada...

consegui fechar o documento sem a tela de salvar...

para isto eu mudei um pouco a lógica...

antes:
- abrir wordd LOOP BEGIN - abrir doc - editar doc - imprimir doc - fechar doc (sem salvar) LOOP END - fechar word


agora:
LOOP BEGIN - abrir wordd - abrir doc - editar doc - imprimir doc - matar word LOOP END


isto torna MUITO mais lento o processo, e, PIOR que isto, ao matar o word, eu mato o processo word, ou seja, se o cliente estava com um doc importante aberto e sem salvar, já era ! perdeu... ele fecha todos os docs aberto, já que finaliza o word....
para finalizar o word eu utilizei esta dica:
[url]http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=532[/url]
que serve para finalizar qualquer aplicativo que esteja rodando no seu win...


tentei usar para fechar o doc o seguinte comando:
MSWord.ActiveDocument.Close(SaveChanges := 0);

mas dá erro
[img:69d18d8f75]http://img237.imageshack.us/img237/5738/imagemmc2.png[/img:69d18d8f75]

alguma luz ?


Responder

05/06/2008

José Henrique

Use
Doc.Close(SaveChanges := 0); // FECHAR O ARQUIVO DE DENTRO DO WORD
ap invés de
MSWord.ActiveDocument.Close(SaveChanges := 0);


Responder

05/06/2008

José Henrique

Do help do Word
[b:b3c79c0443]Propriedade ActivePrinter[/b:b3c79c0443] Consulte também Aplica-se a Exemplo Informações específicas Retorna ou define o nome da impressora ativa. String de leitura/gravação. Exemplo Este exemplo exibe o nome da impressora ativa. MsgBox ´The name of the active printer is ´ & ActivePrinter Este exemplo torna uma impressora de rede HP LaserJet IIISi a impressora ativa. Application.ActivePrinter = ´HP LaserJet IIISi on \\printers\laser´ Este exemplo torna uma impressora HP LaserJet 4 local em LPT1 a impressora ativa. Application.ActivePrinter = ´HP LaserJet 4 local on LPT1:´


Então creio que se fizer:
              Word := CreateOleObject(´Word.Application´);
              Word.Visible := False; // NÃO EXIBIR PARA O USUÁRIO 
              Word.ActivePrinter = "HP LaserJet 4 local on LPT1:"


funcione. Não testei.


Responder