You should use MS Word as automation server.
Try this:
First of all, you must create word template.
Choose Insert, Field, MailMerge, MergeField. Then enter the name of the field and click ok. Field will appear in document somehow like this: «FIELDNAME».
Do this for every field you want to have in Word doc, and format the document as you like.
When the main document is merged with the selected data source, information from the specified data field is inserted in place of the merge field.
DEFINE VARIABLE hWord AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE hDocument AS COM-HANDLE NO-UNDO.
CREATE "Word.Application":U hWord NO-ERROR.
ASSIGN FILE-INFO:FILE-NAME = cTemplatePath.
IF FILE-INFO:FULL-PATHNAME = ? THEN
RETURN ERROR.
ASSIGN hWord:VISIBLE = NO
hWord

isplayAlerts = 0
hWord:ActivePrinter = SESSION

RINTER-NAME + " on ":U + SESSION

RINTER-PORT.
hWord

ocuments:Add()
/* page setup */
ASSIGN hWord:ActiveDocument

ageSetup:TopMargin = 2.54 * 28.35
hWord:ActiveDocument

ageSetup:BottomMargin = 2.54 * 28.35
hWord:ActiveDocument

ageSetup:RightMargin = 2.03 * 28.35
hWord:ActiveDocument

ageSetup:LeftMargin = 2.03 * 28.35
hWord:ActiveDocument

ageSetup:Gutter = 0
hWord:ActiveDocument

ageSetup:HeaderDistance = 1.27 * 28.35
hWord:ActiveDocument

ageSetup:FooterDistance = 1.27 * 28.35 NO-ERROR.
/*****/
hWord:Selection:InsertFile( FILE-INFO:FULL-PATHNAME ) NO-ERROR.
/* to replace fields in document */
/* cSearch - name of the field in Word document
cReplace - value that you want to assign */
hWord:ActiveDocument:Content:Find:Execute( cSearch,
NO,
NO,
NO,
NO,
NO,
YES,
1,
NO,
REPLACE( cReplace, "~n":U, ", ":U ),
2,
) NO-ERROR.
/* if you just want to print */
NO-RETURN-VALUE hWord

rintOut.
hWord:Quit( NO /* Don't save changes */ ).
/******/
/* if you want to see doc */
ASSIGN hWord:VISIBLE = YES.
/******/
RELEASE OBJECT hWord.
For detailed explanation of used metods and parameters see Word's Visual Basic editor help( Tools, Macro, VB editor ).
Hope this helps...