mkyx Posted September 7, 2014 Report Share Posted September 7, 2014 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. Quote Link to comment Share on other sites More sharing options...
atnsoft Posted September 8, 2014 Report Share Posted September 8, 2014 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 Quote Link to comment Share on other sites More sharing options...
mkyx Posted September 11, 2014 Author Report Share Posted September 11, 2014 Esses comandos que vc passou dá erro na classe, quando eu executo o exe. De acordo com os erros acima. Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted September 11, 2014 Report Share Posted September 11, 2014 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 Quote Link to comment Share on other sites More sharing options...
mkyx Posted September 13, 2014 Author Report Share Posted September 13, 2014 Ariston, vc poderia passar a fonte da classe tword que você usa? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.