How to add custom style into MS Word 2007 document
For VFP 8/9
m.loSession=EVALUATE([xfrx("XFRX#INIT")]) m.lnRetVal = m.loSession.SetParams("test.docx",,,,,,"NATIVE_FDOCX") IF m.lnRetVal=0 Â Â m.loHACK=CREATEOBJECT("_XFRXHACK",m.loSession) Â Â m.loSession.ProcessReport("_reports\basetext") Â Â m.loSession.Finalize() Â Â RELE m.loHACK END IFÂ DEFINE CLASS _XFRXHACK AS CUSTOM oEWriter=.NULL. cTarget="" nVersion=0 PROCEDURE Init(m.loSession) m.loSession=IIF(TYPE("m.loSession.oxfSession")="O",m.loSession.oxfSession,m.loSession) This.nVersion=VAL(CHRTRAN(m.loSession.GetVersion(); ,CHRTRAN(m.loSession.GetVersion(),"0123456789",""),"")) This.cTarget=m.loSession.cTarget DO CASE CASE This.cTarget=="NATIVE_FDOCX" OR This.cTarget=="NATIVE_DOCX" =BINDEVENT(m.loSession.oDocumentWriter,"Finalize",This,"Finalize",0) ENDCASE This.oEWriter=m.loSession.oDocumentWriter ENDPROC PROCEDURE Finalize(m.tnHeight, m.tnWidth, m.tnPageNo) LOCAL m.liSele, m.loEWriter, m.lcPom m.liSele=SELECT() m.loEWriter=This.oEWriter WITH m.loEWriter.oOXML * Attention, all text data must be in UTF-8 *m.lcBaseStyle, m.lcBaseName, m.lcHeight (line height in twips), m.lcBefore (before space in twips), m.lcTABSKEY, m.lcTABS, m.llTABs .addParagraphStyle("Normal","YourStyle",.ToTWIP(100),"0","","",.F.) SELECT (.Alias) m.lcPom=; [ <w:rPr>]+CHR(13)+CHR(10)+; [ <w:rFonts w:hAnsi="Courier New" w:ascii="Courier New"/>]+CHR(13)+CHR(10)+; [ <w:lang w:eastAsia="en-US"/>]+CHR(13)+CHR(10)+; [ <w:color w:val="]+.C2RGB(0, 120, 0,1)+["/>]+CHR(13)+CHR(10)+; && Fore color - RGB [ <w:sz w:val="]+LTRIM(STR(10*2,11))+["/>]+CHR(13)+CHR(10)+; && Fontsize*2 [ <w:sz-cs w:val="]+LTRIM(STR(10*2,11))+["/>]+CHR(13)+CHR(10)+; && Fontsize*2 [ <w:strike/>]+CHR(13)+CHR(10)+; && m.llStriked [ <w:b/>]+CHR(13)+CHR(10)+; && m.llBold [ <w:i/>]+CHR(13)+CHR(10)+; && m.llItalics [ <w:u w:val="single"/>]+CHR(13)+CHR(10)+; && m.llUnderline [ </w:rPr>]+CHR(13)+CHR(10) REPLACE XX001 WITH STRTRAN(XX001,"</w:pPr>","</w:pPr>"+CHR(13)+CHR(10)+m.lcPom) Â * Change default font for document LOCAL m.liStart, m.liEnd, m.lcPom2, m.lihFile, m.lcPom m.lihFile=.GetFileHandle("word\styles.xml") m.lcPom="" =FSEEK(m.lihFile,0) DO WHILE NOT FEOF(m.lihFile) m.lcPom=m.lcPom+FREAD(m.lihFile,65000) ENDDO ** Font name m.liStart=ATC("<w:rFonts",m.lcPom)+10 m.lcPom2=SUBSTR(m.lcPom,m.liStart) m.liEnd=m.liStart+ATC("/>",m.lcPom2)-1 m.lcPom=STUFF(m.lcPom,m.liStart,m.liEnd-m.liStart,[w:cs="Courier New" w:hAnsi="Courier New" w:eastAsia="Courier New" w:ascii="Courier New"]) ** Font Color, strike, bold, italic, underline m.liStart=ATC("<w:sz ",m.lcPom) m.lcPom2=[ <w:color w:val="]+.C2RGB(0, 0, 255,1)+["/>]+CHR(13)+CHR(10)+; [ <w:strike/>]+CHR(13)+CHR(10)+; && m.llStriked [ <w:b/>]+CHR(13)+CHR(10)+; && m.llBold [ <w:i/>]+CHR(13)+CHR(10)+; && m.llItalics [ <w:u w:val="single"/>]+CHR(13)+CHR(10) && m.llUnderline m.lcPom=STUFF(m.lcPom,m.liStart,0,m.lcPom2) Â ** Font size m.liStart=ATC([<w:sz w:val="],m.lcPom)+13 m.lcPom2=SUBSTR(m.lcPom,m.liStart) m.liEnd=m.liStart+ATC(["],m.lcPom2)-1 m.lcPom=STUFF(m.lcPom,m.liStart,m.liEnd-m.liStart,LTRIM(STR(20*2,11))) && Fontsize*2 Â m.liStart=ATC([<w:szCs w:val="],m.lcPom)+15 m.lcPom2=SUBSTR(m.lcPom,m.liStart) m.liEnd=m.liStart+ATC(["],m.lcPom2)-1 m.lcPom=STUFF(m.lcPom,m.liStart,m.liEnd-m.liStart,LTRIM(STR(20*2,11))) && Fontsize*2 Â Â =FSEEK(m.lihFile,0) DO WHILE LEN(m.lcPom)>0 =FWRITE(m.lihFile,LEFT(m.lcPom,65000)) m.lcPom=SUBSTR(m.lcPom,65001) ENDDO ENDWITH SELECT (m.liSele) ENDPROC ENDDEFINE
Â
For VFP 5/6/7
m.loSession=EVALUATE([xfrx("XFRX#INIT")]) m.lnRetVal = m.loSession.SetParams("test.docx",,,,,,"NATIVE_FDOCX") IF m.lnRetVal=0 m.loSession.setOtherParams("NEXT_PAGE_NAME_EXPR","_HACKPAGENAME(this)") m.loSession.ProcessReport("_reports\basetext") m.loSession.Finalize() END IF PROCEDURE _HACKPAGENAME(m.loReport) LOCAL m.lcPage, m.liSele, m.lcPom m.liSele=SELECT() WITH loreport.odocumentwriter.ooxml   m.lcPage= "Page "+LTRIM(STR(.npageno,11)) IF .npageno=1 * Attention, all text data must be in UTF-8 .cEntityStyle="w:styles" *m.lcBaseStyle, m.lcBaseName, m.lcHeight (line height in twips), m.lcBefore (before space in twips), m.lcTABSKEY, m.lcTABS, m.llTABs .addParagraphStyle("Normal","YourStyle",.ToTWIP(100),"0","","",.F.) SELECT (.Alias) m.lcPom=; [ <w:rPr>]+CHR(13)+CHR(10)+; [ <w:rFonts w:hAnsi="Courier New" w:ascii="Courier New"/>]+CHR(13)+CHR(10)+; [ <w:lang w:eastAsia="en-US"/>]+CHR(13)+CHR(10)+; [ <w:color w:val="]+.C2RGB(0, 120, 0,1)+["/>]+CHR(13)+CHR(10)+; && Fore color - RGB [ <w:sz w:val="]+LTRIM(STR(10*2,11))+["/>]+CHR(13)+CHR(10)+; && Fontsize*2 [ <w:sz-cs w:val="]+LTRIM(STR(10*2,11))+["/>]+CHR(13)+CHR(10)+; && Fontsize*2 [ <w:strike/>]+CHR(13)+CHR(10)+; && m.llStriked [ <w:b/>]+CHR(13)+CHR(10)+; && m.llBold [ <w:i/>]+CHR(13)+CHR(10)+; && m.llItalics [ <w:u w:val="single"/>]+CHR(13)+CHR(10)+; && m.llUnderline [ </w:rPr>]+CHR(13)+CHR(10) REPLACE XX001 WITH STRTRAN(XX001,"</w:pPr>","</w:pPr>"+CHR(13)+CHR(10)+m.lcPom)  * Change default font for document LOCAL m.liStart, m.liEnd, m.lcPom2, m.lihFile, m.lcPom m.lihFile=.GetFileHandle("word\styles.xml") m.lcPom="" =FSEEK(m.lihFile,0) DO WHILE NOT FEOF(m.lihFile) m.lcPom=m.lcPom+FREAD(m.lihFile,65000) ENDDO ** Font name m.liStart=ATC("<w:rFonts",m.lcPom)+10 m.lcPom2=SUBSTR(m.lcPom,m.liStart) m.liEnd=m.liStart+ATC("/>",m.lcPom2)-1 m.lcPom=STUFF(m.lcPom,m.liStart,m.liEnd-m.liStart,[w:cs="Courier New" w:hAnsi="Courier New" w:eastAsia="Courier New" w:ascii="Courier New"]) ** Font Color, strike, bold, italic, underline m.liStart=ATC("<w:sz ",m.lcPom) m.lcPom2=[ <w:color w:val="]+.C2RGB(0, 0, 255,1)+["/>]+CHR(13)+CHR(10)+; [ <w:strike/>]+CHR(13)+CHR(10)+; && m.llStriked [ <w:b/>]+CHR(13)+CHR(10)+; && m.llBold [ <w:i/>]+CHR(13)+CHR(10)+; && m.llItalics [ <w:u w:val="single"/>]+CHR(13)+CHR(10) && m.llUnderline m.lcPom=STUFF(m.lcPom,m.liStart,0,m.lcPom2) ** Font size m.liStart=ATC([<w:sz w:val="],m.lcPom)+13 m.lcPom2=SUBSTR(m.lcPom,m.liStart) m.liEnd=m.liStart+ATC(["],m.lcPom2)-1 m.lcPom=STUFF(m.lcPom,m.liStart,m.liEnd-m.liStart,LTRIM(STR(20*2,11))) && Fontsize*2 m.liStart=ATC([<w:szCs w:val="],m.lcPom)+15 m.lcPom2=SUBSTR(m.lcPom,m.liStart) m.liEnd=m.liStart+ATC(["],m.lcPom2)-1 m.lcPom=STUFF(m.lcPom,m.liStart,m.liEnd-m.liStart,LTRIM(STR(20*2,11))) && Fontsize*2  =FSEEK(m.lihFile,0) DO WHILE LEN(m.lcPom)>0 =FWRITE(m.lihFile,LEFT(m.lcPom,65000)) m.lcPom=SUBSTR(m.lcPom,65001) ENDDO ENDIF  ENDWITH SELECT (m.liSele) RETURN lcPage ENDPROC