Abrir Word com variaveis (insistindo)

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

Abrir Word com variaveis (insistindo)

Mensagem por EANDRIOLI »

Amigos:

Consegui na internet um modelo que ao meu ver esta quase dando certo.

Como enviei em questoes anteriores, preciso abrir o Word 2003 com alguns campos preenchidos.

O metodo abaixo ira tentar abrir o Word, preenchendo variaveis pre-preenchidas que estiverem entre colchetes (ex.: [NOME])

Segue parte do fonte (esta dando erro ao abrir o Word - creio ser na parte referente aos campos/matriz.

Código: Selecionar todos

PROCEDURE OLEDOC
local x, oWord, cModelo:=curdrive()+':\LIXO\arquivo.doc'    //importante colocar a letra do drive senão dá erro

//Gerar um array com nome do "campo" que estará entre [] a ser substituído no word
// e o conteúdo do arquivo de dados
  
aCampos:={}
aadd( aCampos, { 'NOME', "JOSE DA SILVA" } )
aadd( aCampos, { 'CPF',  "550" } )


*function ContratoWord( aCampos )

   TRY
      oWord := GetActiveObject(  "Word.Application" )
   CATCH
      TRY
         oWord := CreateObject( "Word.Application" )  
      CATCH
         MsgBOX1("NÆo foi poss¡vel achar o Word instalado!!!")
         RETURN
      END
   END


oDoc := oWord:Documents:Open(cModelo)    //ABRE O WORD

for x=1 to len( aCampos )
        oWord:Replace( '['+aCampos[x,1]+']' , aCampos[x,2] )
next

//oWord:preview()                        // visualiza o documento no preview do Word
//oWord:Visualizar()                     // visualiza o documento 
//oWord:PrintDoc(.t.)                      // imprime o documento sem apresentar na tela
oWord:end()

return nil

Reparem que coloquei em comentario a linha que chama a Function ControWord por achar nao necessario.

Preciso da ajuda dos senhores clippeiros por favor.

Abraços amigos.

ERASMO
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por EANDRIOLI »

Amigos

Me disseram que eu poderia colocar assim em meu programa e acredito ser na linha após mandar abrir o word com o arquivo .doc:

oWord:Replace("[NOMECLI]",var)

Assim NOMECLI é o campo dentro do arquivo .doc e "var" a variavel de arquivo ou de dados do .dbf.

O problema é que ocorrem erros quando o Word vai ser aberto e esse erro é mostrado pelo programa compilado pelo Xharbour. Nao estou usando FIVEWIN.

O erro é este:

Error Word.Application/16389 E_FAIL: REPLACE Arguments:
( [ 1] = Type: C Val: [NOMECLI] [ 2] = Type: C Val: cArq)

Alguem pode ajudar? (Opa: cArq="C:\LOC\CTOLOC.DOC")

Obrigado, ERASMO.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por rochinha »

OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por Itamar M. Lins Jr. »

Ola!
Supondo, que o campo deve ser caractere, por exemplo igual ao sintaxe SQL.

Código: Selecionar todos

oWord:Replace("[NOMECLI]",var)
mude para:
oWord:Replace("[NOMECLI]","["+var+"]") ou 
oWord:Replace("[NOMECLI]"," ' "+var+" ' ") ou
oWord:Replace("[NOMECLI]",' " '+var+' " ')
Quem sabe funcione ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por EANDRIOLI »

Never... nao funciona mesmo... e o erro permanece...

(#-)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por Itamar M. Lins Jr. »

A sintaxe é qual da função replace ?
Eu achei essa no google.
Replace(string,find,replacewith[,start[,count[,compare]]])
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por Itamar M. Lins Jr. »

No caso:

Código: Selecionar todos

oDoc := oWord:Documents:Open(cModelo)    //ABRE O WORD

for x=1 to len( aCampos )
        oWord:Replace(oDoc, '['+aCampos[x,1]+']' , aCampos[x,2] )
next
Com certeza a função replace() estava recebendo os paramentros errados, não sei se vai funcionar, porém teste ai.

Suadações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por rochinha »

Amiguinhos,

Voce chegaram a dar uma passadinha de leve nos links que postei?

Tenho a certeza que não. Pois teriam notado que não existe a figura do REPLACE

Ao dar o comando replace da forma como exposto com certeza o word repassa de uma vez todas as variáveis identicas. Neste caso de etiquetas o repasse será efetuado em todas as variaveis NOME com um mesmo conteúdo e não conteúdo a conteúdo.

O certo é usar find encontrar, uma ocorrência e repassá-la.

Pequeno trecho de meu uso:

Código: Selecionar todos

   aVFields := { { "&#CL_NOME#&"                , CL_Nome },; 
                 { "&#cl_endereco#&"            , CL_Endereco },;
                 { "&#cl_cidade#&"              , CL_Cidade },;
                 { "&#cl_estado#&"              , CL_Estado },;
                 { "&#cl_cep#&"                 , CL_CEP },;
                 { "&#cl_telefone#&"            , CL_Telefone },;
                 { "&#cl_fax#&"                 , CL_Fax },;
                 { "&#cl_email#&"               , CL_Email },;
                 { "&#pn_idpedido#&"            , strzero(M->PRN_IDPEDIDO,6) },;
                 { "&#clienteNome#&"            , alltrim(M->PRN_NOME) },;
                 { "&#clienteEnderecoEntrega#&" , alltrim(M->PRN_LOCENTR) },;
                 { "&#clienteBairroEntrega#&"   , alltrim(M->PRN_BAIENTR) },;
                 { "&#clienteCidadeEntrega#&"   , alltrim(M->PRN_CIDENTR) },;
                 { "&#clienteCEPEntrega#&"      , alltrim(M->PRN_CEPENTR) },;
                 { "&#clienteNome#&"            , alltrim(M->PRN_NOME) },;
                 { "&#clienteEnderecoCobranca#&", alltrim(M->PRN_LOCCOBR) },;
                 { "&#clienteBairroCobranca#&"  , alltrim(M->PRN_BAICOBR) },;
                 { "&#clienteCidadeCobranca#&"  , alltrim(M->PRN_CIDCOBR) },;
                 { "&#clienteCEPCobranca#&"     , alltrim(M->PRN_CEPCOBR) },;
                 { "&#pn_subtotal#&"            , transf(M->PRN_SUBTOTAL,"@e 999,999.99") },;
                 { "&#pn_desconto#&"            , transf(M->PRN_DESCONTO,"@e 999,999.99") },;
                 { "&#pn_acrescimo#&"           , transf(M->PRN_ACRESCIMO,"@e 999,999.99") },;
                 { "&#pn_total#&"               , transf(M->PRN_TOTAL,"@e 999,999.99") },;
                 { "&#cl_email#&"               , CL_Email },;
                 { "&#pn_data#&"                , dtoc( date() ) } }
			//
   cTMPFile := cHomeDir+"DOC"+StrZero(Random(99999),5)+".DOC"
   if File(cDOCFile)
      CursorWait()
      __CopyFile( cDOCFile, cTMPFile )
      oWord := TOleAuto():New( "Word.Application" )
      oWord:Visible     := .f.
      //oWord:WindowState := 0
      oWord:Documents:Open( cTMPFile )
      oText := oWord:Selection()
      oFind := oText:Find()
      //
      for i = 1 to len( aVFields )
          //msgstop( "procurar "+aVFields[i][1] )
          oFind:Set("ClearFormatting")
          oFind:Text := aVFields[i][1]
          oFind:Wrap := 1
          oFind:Set("MatchWildcards",.t.)
          oFind:Execute()
          cFound := Alltrim(SubStr(aVFields[i][1],3,Len(Alltrim(aVFields[i][1]))-4))
          cFound := sSwap(cFound,{Chr(145),Chr(146)},"'")
          cFound := sSwap(cFound,{Chr(147),Chr(148)},'"')
          oText:TypeText( aVFields[i][2] )
      next
      //
      ...
      oWord:Documents:SaveAs( cTMPFile )
No meu caso as variáveis estão entre &# e #& e estão explicitas no meio do texto de meus documentos .RTF e .DOC.

No caso de voce estar usando aqueles controles de texto/edição do Word provavelmente o comando replace esteja falhando.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

ABRIR WORD COM VARIAVEIS (insistindo)

Mensagem por fladimir »

Eu uso essa q o Rochinha colocou os links e funciona...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

Abrir Word com variaveis (insistindo)

Mensagem por EANDRIOLI »

Senhores:

Deu certo... da forma abaixo... acredito que o mestre Rochinha resolveu o problema...

Fiz um teste usando uma var CAMPO valendo "erasmito", ficando assim:

Código: Selecionar todos

   * abrindo o contrato principal....
   oDoc := oWord:Documents:Open(cARQ)    //ABRE O WORD

   oText:=oWord:Selection()
   oFind:=oText:Find()

   oFind:Text :="CAMPO"
   oFind:Wrap := 1
   oFind:Set("MatchWildcards",.t.)   // localizar se existir

   oFind:Execute()                   // substituir uma vez
   oText:Typetext('erasmito')
   oFind:Execute()                   // substituir mais uma vez
   oText:Typetext('erasmito')
Obs.: Percebi que se for colocado em oFind:Text :="[CAMPO]" a variavel no documento Word nao é alterada. Tem que ser somente CAMPO e no arquivo documento tem que estar entre [] a palavra CAMPO.

Neste simples exemplo que deu certo, conforme mostro acima, se for usado oFind:Execute() duas vezes e existir no documento aberto pelo Word, dois locais com o texto [CAMPO], ambos serão alterados.

Gostei do esquema... esquentei um pouco a "moringa" mas deu certo graças a voces grandes companheiros.

Se em alguma linha do codigo acima eu estiver errado, me corrijam por obséquio.

Abraços a todos,

ERASMO ANDRIOLI
By programming XHarbour
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Abrir Word com variaveis (insistindo)

Mensagem por rochinha »

Amiguinho,

Voce apenas esquentou a moringa. Eu perdi todo o cabelo do lado esquerdo.

Voce esta usando um documento estilo mailing(etiquetas) correto?

Eu uso ele para gerar as cartas de fim de ano dos clientes, no meu caso é gerado um documento .DOC unico e cada pagina contém um conteúdo com os cabeçalhos com nomes de apresentação de cada cliente.

No final mando um comando para o Word, ele abre e sai imprimindo tudo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Abrir Word com variaveis (insistindo)

Mensagem por rossine »

Olá pessoal,

Vejam se é isto que precisam:

http://groups.google.com/group/harbour- ... 6260fef72#

Abraços,

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
wilson marchiori
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 20 Set 2012 16:22
Localização: são PAULO

Abrir Word com variaveis (insistindo)

Mensagem por wilson marchiori »

Sr. Erasmo

vi os exmplos mas não entendi a variavel
(erasmito)

temos carta word
com varios campos a ser atualizado (trocados)
ex.

Ilmo Sr [vnome], residente , [vender], Cidade [vcidade]

etc.. e outros

,no exemplo postado é execuar para cada uma variavel
uma rotina de troca

grato
wilsonmarchiori
wilceci2006@yahoo.com.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Abrir Word com variaveis (insistindo)

Mensagem por rochinha »

Amiguinhos,

Analise o código abaixo:

Código: Selecionar todos


#define CR             Chr(13)
#define LF             Chr(10)  

#define BS             "\"

Function OLEMerge( cDOCFile, cVFields, cVWords, lDOCPreview )
   LOCAL cHomeDir := CurDrive() + ":" + BS + CurDir() + BS
   LOCAL oDoc,oWord,oText,oFind,cFound,bError,cFile,cText
   DEFAULT lDOCPreview := .t.
   cFile := cHomeDir + cDOCFile
   aVFields := StringToArray( cVFields, ";" )
   aVWords  := StringToArray( cVWords, ";" )
   if File(cFile)
      CursorWait()
      oWord := TOleAuto():New( "Word.Application" )
      oDoc  := oWord:Get( "Documents" ) // oDoc := oWord:Documents:Open( cFile ) 
      oWord:Set("Visible",.t.)
      oDoc:Open( cFile )
      oText:=oWord:Selection()
      oFind:=oText:Find()
      for i = 1 to len( aVFields )
          oFind:Set("ClearFormatting")
          oFind:Text:=Alltrim(Upper(aVFields[i])) // "&#"+Alltrim(aVFields[i])+"#&"
          oFind:Wrap:=1
          oFind:Set("MatchWildcards",.t.)
          if oFind:Execute()
             cFound:=Alltrim(SubStr(aVFields[i],3,Len(Alltrim(aVFields[i]))-4))
             cFound:=sSwap(cFound,{Chr(145),Chr(146)},"'")
             cFound:=sSwap(cFound,{Chr(147),Chr(148)},'"')
             //if Empty(cFound)
             //   exit
             //endif
             oText:TypeText( aVWords[i] )
          endif
      next
      if lDOCPreview
         oWord:Set("Visible",.t.)
      else
         oWord:PrintOut()
         oWord:Quit()
      endif
      CursorArrow()
   else
      MsgInfo( "Arquivo "+cFile+" nao encontrado." )
   endif
   return nil

function StringToArray( cString, cSeparator )
   LOCAL nPos 
   LOCAL aString := {} 
   DEFAULT cSeparator := ";" 
   cString := ALLTRIM( cString ) + cSeparator 
   DO WHILE .T. 
      nPos := AT( cSeparator, cString ) 
      IF nPos = 0 
         EXIT 
      ENDIF 
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) ) 
      cString := SUBSTR( cString, nPos+1 ) 
   ENDDO 
   RETURN ( aString ) 

Function sSwap( cChar, c1, c2 )
   LOCAL n1,n2:=-1,ac1,f
   IF ValType(c1)="A"
      ac1:=c1
      FOR f=1 TO Len(ac1)
         c1:=ac1[f]
         WHILE .T.
            n1:=At(Upper( c1 ),Upper( cChar ))
            IF n1=0 .OR. n1=n2
               EXIT
            ENDIF
            cChar:=SubStr( cChar, 1, n1-1 )+c2+SubStr( cChar, n1+Len(c1), Len(cChar)-Len(c1) )
            n2:=n1
         ENDDO
      NEXT
   ELSE
      WHILE .T.
         n1:=At(Upper( c1 ),Upper( cChar ))
         IF n1=0 .OR. n1=n2
            EXIT
         ENDIF
         cChar:=SubStr( cChar, 1, n1-1 )+c2+SubStr( cChar, n1+Len(c1), Len(cChar)-Len(c1) )
         n2:=n1
      ENDDO
   ENDIF
   return cChar
Exemplo de uso:

Código: Selecionar todos

      cMacro := [OLEMERGE.EXE CCEMERGE.DOC "&#CHAVE#&;&#PROTOCOLO#&;&#CORRECAO#&" "]+cChaveNFe+[;]+cNFEnProt+[;]+xCorrecao+["]
      MemoWrit( "ccemerge.bat", cMacro )
      RUN "ccemerge.bat"
Dentro do documento as variaveis são &#CHAVE#&, &#PROTOCOLO#& e &#CORRECAO#&

O laço for lê cada um dos campos passados e o if oFind:Execute() executa a transação, mas somente uma vez.

Desta forma se houver repetição do campo somente a primeira ocorrência deverá ser repassada.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder