Página 1 de 1

Abrir Word com variaveis (insistindo)

Enviado: 02 Fev 2012 23:24
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

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 03 Fev 2012 23:38
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.

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 06 Fev 2012 10:09
por rochinha

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 07 Fev 2012 10:58
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.

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 07 Fev 2012 13:11
por EANDRIOLI
Never... nao funciona mesmo... e o erro permanece...

(#-)

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 07 Fev 2012 13:52
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.

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 07 Fev 2012 14:26
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.

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 07 Fev 2012 15:27
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.

ABRIR WORD COM VARIAVEIS (insistindo)

Enviado: 07 Fev 2012 23:29
por fladimir
Eu uso essa q o Rochinha colocou os links e funciona...

[]´s

Abrir Word com variaveis (insistindo)

Enviado: 08 Fev 2012 20:53
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

Abrir Word com variaveis (insistindo)

Enviado: 08 Fev 2012 22:39
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.

Abrir Word com variaveis (insistindo)

Enviado: 09 Fev 2012 13:17
por rossine
Olá pessoal,

Vejam se é isto que precisam:

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

Abraços,

Rossine.

Abrir Word com variaveis (insistindo)

Enviado: 20 Set 2012 17:11
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

Abrir Word com variaveis (insistindo)

Enviado: 21 Set 2012 02:35
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.