Tempos atras postei um topico relacionado a Merge de um arquivo .RTF a partir de um executável de linha de comando em MERGE - Colagem de dados via Command Line.
Pois é, depois de muito tempo(e conseguindo enrolar o Pablo), um amiguinho me contactou dizendo que ao passar comandos, dependendo do tamanho da string, paulava o aplicativo.
E como venho enxendo a mão com o uso de XML em meus sistemas resolvi usar a mesma técnica para passar parametros para o aplicativo.
A forma de usá-lo é assim:
OLEMerge arquivo.doc arquivo.xml
Exemplo:
OLEMerge teste.rtf teste.xml
Exemplo do arquivo .XML:
Código: Selecionar todos
<?xml version="1.0" encoding="ISO-8859-1"?>
<olemerge>
<campos>nome</campos>
<campos>endereco</campos>
<campos>bairro</campos>
<campos>cep</campos>
<dados>Jose Carlos da rocha</dados>
<dados>Rua Dr Mario Mauro Ramos Mattoso 50</dados>
<dados>Pirituba</dados>
<dados>05171-340</dados>
</olemerge>
O limite de campos e dados dependerá da memória da maquina ao processar o merge.
Arquivo .RTF de exemplo(copie e cole o tenho entre as tags CODE e /CODE e salve como DOC.RTF):
Código: Selecionar todos
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1046\deflangfe1046{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f36\froman\fcharset238\fprq2 Times New Roman CE;}{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}
{\f40\froman\fcharset162\fprq2 Times New Roman Tur;}{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}
{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f56\fmodern\fcharset238\fprq1 Courier New CE;}{\f57\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f59\fmodern\fcharset161\fprq1 Courier New Greek;}
{\f60\fmodern\fcharset162\fprq1 Courier New Tur;}{\f61\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f62\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f63\fmodern\fcharset186\fprq1 Courier New Baltic;}
{\f64\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0
\fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\faauto\rin0\lin0\itap0
\fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 \sbasedon0 \snext15 header;}{\s16\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 \sbasedon0 \snext16 footer;}}
{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid2510635\rsid12271358\rsid14224086\rsid15612869}{\*\generator Microsoft Word 11.0.5604;}{\info{\title ______February 3, 1997}{\author ziggy stardust}{\operator Administrador}
{\creatim\yr2007\mo11\dy29\min42}{\revtim\yr2008\mo5\dy27\hr18\min2}{\version5}{\edmins4}{\nofpages1}{\nofwords11}{\nofchars65}{\*\company 5volution}{\nofcharsws75}{\vern24689}}\margl1701\margr1701\margt1417\margb1417
\widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot14224086
\fet0{\*\ftnsep \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsep
\par }}{\*\ftnsepc \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsepc
\par }}{\*\aftnsep \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsep
\par }}{\*\aftnsepc \pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\insrsid14224086 \chftnsepc
\par }}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\header \pard\plain \s15\qc \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {\b\f2\fs28\insrsid12271358 NOME DA EMPRESA}{
\b\f2\fs28\insrsid2510635\charrsid2510635
\par }{\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid14224086 123 Endereco Completo
\par Bairro, UF 00000-000
\par }{\fs28\insrsid14224086 (011)9999-9999
\par }{\lang1024\langfe1024\noproof\langnp1046\insrsid12271358 {\shp{\*\shpinst\shpleft-72\shptop260\shpright8713\shpbottom261\shpfhdr1\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid2049
{\sp{\sn shapeType}{\sv 20}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fShadow}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 0}}}{\shprslt{\*\do\dobxcolumn\dobypara\dodhgt8192\dpline\dpptx0\dppty0\dpptx8785\dppty1
\dpx-72\dpy260\dpxsize8785\dpysize1\dplinew15\dplinecor0\dplinecog0\dplinecob0}}}}{\fs28\insrsid14224086
\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}
{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0 \fs20\lang1033\langfe1046\cgrid\langnp1033\langfenp1046 {
\f2\fs28\insrsid14224086
\par }{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid2510635 Nome: }{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid2510635\charrsid2510635 &#NOME#&}{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid2510635
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid15612869 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid15612869\charrsid2510635
\par Endere\'e7o: &#ENDERECO#&
\par
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid12271358 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635 Bairro: &#BAIRRO#&
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid15612869 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid15612869
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid12271358 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358 Cep}{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635 : &#}{
\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358 CEP}{\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635 #&
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0\pararsid15612869 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid12271358\charrsid2510635
\par }\pard \ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0 {\f2\fs28\lang1046\langfe1046\langnp1046\insrsid14224086\charrsid2510635
\par }}
Código: Selecionar todos
#include "FiveWin.ch"
#define CR Chr(13)
#define LF Chr(10)
#define BS "\"
Function OLEMerge( cDOCFile, cXMLFile, lDOCPreview )
LOCAL cHomeDir := CurDrive() + ":" + BS + CurDir() + BS
LOCAL oDoc,oWord,oText,oFind,cFound,bError,cFile,cText
DEFAULT lDOCPreview := .t.
cFile := cHomeDir + cDOCFile
oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM")
oXMLDoc:async := .f.
lSuccess := oXMLDoc:load( cXMLFile )
if lSuccess
aCampos := {}
oCampos := oXMLDoc:getElementsByTagName( "campos" )
for i = 1 to oCampos:length
aadd( aCampos, "&#" + oCampos:Item(i-1):Text + "#&" )
next
aDados := {}
oDados := oXMLDoc:getElementsByTagName( "dados" )
for i = 1 to oDados:length
aadd( aDados, oDados:Item(i-1):Text )
next
endif
aVFields := aCampos
aVWords := aDados
if File(cFile)
CursorWait()
oWord :=TOleAuto():New( "Word.Application" )
oDoc :=oWord:Get( "Documents" )
oWord:Set("Visible",.f.)
oDoc:Open( cFile )
oText:=oWord:Selection()
oFind:=oText:Find()
for i = 1 to len( aVFields )
oFind:Set("ClearFormatting")
oFind:Text:="&#*#&"
oFind:Wrap:=1
oFind:Set("MatchWildcards",.t.)
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] )
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



