Jump to content
Fivewin Brasil

Novamente TWord


mkyx

Recommended Posts

Gostei muito desse modo de manipular arquivos word ou excel, porque não precisa especificar uma classe, durante a compilação,

No entanto, falta os comando para alterar o conteúdo dos campos dentro do documento do word,

Alguém sabe quais são eles??

A matriz ACAMPOS, contém o nome do campo que está dentro do documento do word e seu conteúdo de será dado um replace.

STATIC FUNCTION GeraTword( aCampos )
local x, cTemplate := "d:\P_S_F_P.doc", cDest := "D:\temp.doc"
COPYFILE(cTemplate ,cDEST,.F.)
oWord := CreateObject( "Word.Application" )
oWord:Documents:Open(cTemplate)
// Make the Necessary changes in the word file and then save this file with a different name
FOR x=1 to len( aCampos )
// aqui coloco os replaces para alterar os campos dentro do arquivo do word
// que comandos devo usar? Alguém sabe????
// tipo ---> oWord:Replace( aCampos[x,1], aCampos[x,2] )
NEXT
oWord:ActiveDocument:SaveAs(cDest)
oWord:ActiveDocument:Close()
oWord:Quit()
return .t.
Link to comment
Share on other sites

Eu uso assim :

Copy File (cDirRes)+"Cont_Freta.Doc" To (cDirRes)+"TempFreta.Doc"

oWord := TWord():New()

If ( oWord:IsVisible() )
oWord:Hide()
Endif

TRY
oWord:OpenDoc((cDirRes)+"TempFreta.Doc")

oWord:Replace( "{nNome}", nNome)
oWord:Replace( "{nCnpj}", nCnpj)
oWord:Replace( "{nTelefone}", nTelefone)
oWord:Replace( "{nEndereco}", nEndereco)
oWord:Replace( "{nBairro}", nBairro)
oWord:Replace( "{nCep}", nCep)
oWord:Replace( "{nUf}", nUf)
oWord:Replace( "{nCidade}", nCidade)
oWord:Replace( "{nSaida}", nSaida)
oWord:Replace( "{nDestino}", nDestino)
oWord:Replace( "{nDatar}", nDatar)
oWord:Replace( "{nTotal}", nTotal)
oWord:Replace( "{nSinal}", nSinal)
oWord:Replace( "{nVeiculo}", nVeiculo)
oWord:Replace( "{nIncluso}", nIncluso)
oWord:Replace( "{nDatafim}", VdataFim)
oWord:Replace( "{ExtensoData}", ExtensoData)

CATCH oError
// E avisamos ao usuario o motivo do erro!
MsgStop("Erro ao Abrir Gerenciador de Textos.","WinTur")
Return NIL
End

//oWord:Preview()

//oWord:Printdoc(.F.)
oWord:PrintDoc( .F., , , , , , , nPrtcopia)
oWord:End()

Os comandos podem ser vistos dentro da tword.prg

Link to comment
Share on other sites

Olá.

Eu uso as funções abaixo para gerar CC-e para Word e enviar por email.

Adapte e testa aí.

STATIC FUNCTION NfeCCeImp(_nRec)
   IF LEN(aNFeCCe) = 1
      IF EMPTY(aNFeCCe[1,4])
         SysRefresh()
         MsgAlert("Não existe Carta de Correção homologada para esta NF-e","Aviso")
         RETURN NIL
      ENDIF
   ENDIF
   aCampos := {}
   aadd( aCampos, { 'DATA', DataH(DATE(), .T., .F.) } )
   aadd( aCampos, { 'DESTINATARIO', ALLTRIM(NFE_INFO->D_NOME) } )
   aadd( aCampos, { 'ENDERECO', ALLTRIM(NFE_INFO->D_LOGR)+", "+ALLTRIM(NFE_INFO->D_NUME) } )
   aadd( aCampos, { 'CIDUF', ALLTRIM(NFE_INFO->D_CIDA)+"-"+ALLTRIM(NFE_INFO->D_UF) } )
   aadd( aCampos, { 'NFENR', ALLTRIM(STR(NFE_INFO->NFENUM)) } )
   aadd( aCampos, { 'CHNFE', ALLTRIM(NFE_INFO->CCHAVE) } )
   aadd( aCampos, { '01', " " } )
   aadd( aCampos, { '02', " " } )
   aadd( aCampos, { '03', " " } )
   aadd( aCampos, { '04', " " } )
   aadd( aCampos, { '05', " " } )
   aadd( aCampos, { '06', " " } )
   aadd( aCampos, { '07', " " } )
   aadd( aCampos, { '08', " " } )
   aadd( aCampos, { '09', " " } )
   aadd( aCampos, { '10', " " } )
   aadd( aCampos, { '11', " " } )
   aadd( aCampos, { '12', " " } )
   aadd( aCampos, { '13', " " } )
   aadd( aCampos, { '14', " " } )
   aadd( aCampos, { '15', " " } )
   aadd( aCampos, { 'COD1', " " } )
   aadd( aCampos, { 'COD2', " " } )
   aadd( aCampos, { 'COD3', " " } )
   aadd( aCampos, { 'COD4', " " } )
   aadd( aCampos, { 'COD5', " " } )
   aadd( aCampos, { 'COD6', " " } )
   aadd( aCampos, { 'COD7', " " } )
   aadd( aCampos, { 'COD8', " " } )
   aadd( aCampos, { 'CORR01', " " } )
   aadd( aCampos, { 'CORR02', " " } )
   aadd( aCampos, { 'CORR03', " " } )
   aadd( aCampos, { 'CORR04', " " } )
   aadd( aCampos, { 'CORR05', " " } )
   aadd( aCampos, { 'CORR06', " " } )
   aadd( aCampos, { 'CORR07', " " } )
   aadd( aCampos, { 'CORR08', " " } )
   aadd( aCampos, { 'EMITENTE', ALLTRIM(mEmp) } )
   aadd( aCampos, { 'RESPONSAVEL', ALLTRIM(cPnom) } )

   cOutr := ""
   nOcor := 1
   nL := _nRec
*  FOR nL := 1 TO LEN(aNFeCCe)
       cCorr := ALLTRIM(aNFeCCe[nL,4])
       cItem := ALLTRIM(aNFeCCe[nL,5])
       IF ! EMPTY(cCorr)
          nScn := ASCAN(aItmCCe, {|x|ALLTRIM(x[2])==cItem})
          IF nScn > 0 .AND. nScn < 15
             cFld := STRZERO(nScn,2)
             nPos := ASCAN(aCampos, {|y|y[1]==cFld})
             IF nPos > 0
                aCampos[nPos,2] := "X"
                nCrr := ASCAN(aCampos, {|z|z[1]=="COD"+STR(nOcor,1)})
                IF nCrr > 0 ; aCampos[nCrr,2] := cFld ; ENDIF
                nTxt := ASCAN(aCampos, {|z|z[1]=="CORR0"+STR(nOcor,1)})
                IF nTxt > 0 ; aCampos[nTxt,2] := cCorr ; ENDIF
                nOcor ++
             ELSE
                IF ! EMPTY(cOutr) ; cOutr += "; " ; ENDIF
                cOutr += cItem+" -> "+cCorr
             ENDIF
          ELSE
             IF ! EMPTY(cOutr) ; cOutr += "; " ; ENDIF
             cOutr += cItem+" -> "+cCorr
          ENDIF
       ENDIF
*  NEXT
   IF ! EMPTY(cOutr)
      nPos := ASCAN(aCampos, {|y|y[1]=="15"})
      IF nPos > 0
         aCampos[nPos,2] := "X"
         nCrr := ASCAN(aCampos, {|z|z[1]=="COD"+STR(nOcor,1)})
         IF nCrr > 0 ; aCampos[nCrr,2] := "15" ; ENDIF
         nTxt := ASCAN(aCampos, {|z|z[1]=="CORR0"+STR(nOcor,1)})
         IF nTxt > 0 ; aCampos[nTxt,2] := cOutr ; ENDIF
      ENDIF
   ENDIF
   SysRefresh()
   Send2Word( aCampos, "cc-e", ALLTRIM(NFE_INFO->CCHAVE)+"-CCe_"+ALLTRIM(STR(_nRec))+".doc" )
RETURN NIL

// Geração de modelos pelo word

function Send2Word(aCampos, cDocName, cNewName, _Prview)

   local x, oWord, cTempDoc,;
         cModelo := CurDrive()+":\"+CurDir()+"\modelos\"+cDocName+".doc" //importante colocar a letra do drive senão dá erro

   IF ! FILE(cModelo)
      MsgAlert("O documento modelo não foi encontrado:"+CRLF+CRLF+cModelo, "Aviso")
      RETURN NIL
   ENDIF

   DEFAULT cNewName := cDocName, _Prview := .T.

   cAguarde := "Gerando o documento. Aguarde..."
   DEFINE DIALOG oEspere FROM 0, 0 TO 4, 20 TITLE "Um momento..."
   oEspere:lHelpIcon := .f.
   @05,05 SAY oAguarde PROMPT cAguarde SIZE 80, 10 PIXEL OF oEspere UPDATE
   ACTIVATE DIALOG oEspere CENTER NOWAIT

   cTempDoc := strtran(cModelo, "\modelos\", "\")
   IF ! EMPTY(cNewName) ; cTempDoc := CurDrive()+":\"+CurDir()+"\tempdir\"+cNewName ; ENDIF

   if file(cTempDoc)
      ferase(cTempDoc)
      SysRefresh()
   endif

   oWord := TWord():New()                 // inicia o objeto OLE Word
   if oWord:IsVisible()
      oWord:Hide()
   endif
   oWord:OpenDoc( cModelo )               // abre o documento modelo
   for x=1 to len( aCampos )
       if valtype(aCampos[x,2]) != "A"
          oWord:Replace( '['+aCampos[x,1]+']' , aCampos[x,2] )
       else
          nLen := LEN('['+aCampos[x,1]+']')
          nEnd := oWord:Replace( '['+aCampos[x,1]+']' , " " )
          oWord:AddTables(aCampos[x,2], nEnd-nLen )
       endif
   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:Save(cTempDoc)
   oWord:end()
   SysRefresh()
   IF _Prview
      if file(cTempDoc)
         WHILE .T.
            nOpc := ALERT("Escolha uma opção",{"Visualizar","Enviar p/ E-mail","Retornar"},"Escolha uma opção")
            IF nOpc == 1
               WAITRUN( GetEnv( "ComSpec" )+" /C START WINWORD "+cTempDoc, 0)
               LOOP
            ELSEIF nOpc == 2
               _Subj := "Arquivo anexo"
               _Msge := "Prezado(s) Senhor(es),"+CRLF+CRLF+;
                        "Anexo a este e-mail voce esta recebendo o arquivo "+cFileName(cTempDoc)+"."+CRLF+CRLF+;
                        "Para maiores esclarecimentos, favor nos catactar."+CRLF+CRLF+ALLTRIM(mEmp)
               MailMain(SPACE(60), _Subj, _Msge, cTempDoc)
               LOOP
            ENDIF
            EXIT
         END
      endif
   ENDIF
   oEspere:End()

return nil

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...