How to automate mail merge to Word using OLE and ODBC[VFP调用Word邮件合并—微软提供]
2010-04-01 19:39
429 查看
Below is the Visual FoxPro for Windows code using the Word.Application object model that performs the mail merge using an ODBC data source to an existing Visual FoxPro table. This code can use an existing data source name (DSN), created in the ODBC Driver Manager, or it can create one on the fly utilizing an API call to add and use the DSN. In the example below, "Visual FoxPro Tables" is the DSN created in the ODBC Driver Manager and points to the /Samples/Data folder in the VFP home folder. These paths will most likely have to be changed to reflect the users' paths.
Note This code was tested with the Service release-1 (SR-1) for Word 97 and Microsoft Office Word 2003. Using prior versions of Word 97 causes a Type Mismatch and other OLE errors.
Create a program and enter the following code:
[/code]
Note This code was tested with the Service release-1 (SR-1) for Word 97 and Microsoft Office Word 2003. Using prior versions of Word 97 causes a Type Mismatch and other OLE errors.
Create a program and enter the following code:
[code] ***/ Begin program code /*** * Code to create a new data source to a VFP table. * * Use the Declare DLL function to prototype the * SQLConfigDataSource function. * Using SQLConfigDataSource prevents having to go into * the ODBC Driver Manager and create the DSN. *** IF VAL(SUBSTR(VERSION(4),2,1))>7 lthemes=_screen.Themes _screen.Themes=.f. ENDIF DECLARE Integer SQLConfigDataSource in odbccp32.dll Integer, ; Integer, String, String *** * Create a string containing the settings appropriate to the driver. * The following is an example for the Microsoft VFP ODBC driver * accessing the Customer.dbf file. *** *** Change the path below to point to the Customer table *** *** in the /Samples/Data folder. *** settings="DSN=visual foxpro tables"+chr(0)+; "Description=VFP ODBC Driver"+chr(0)+; "SourceDB=e:/vfp7/samples/data"+chr(0)+; "SourceType=DBF" =SQLConfigDataSource(0,1,"Microsoft Visual FoxPro Driver",settings) * NOTE: Ensure there are no spaces on either side of the equal sign (=). ON ERROR DO errhand WITH ERROR(), MESSAGE(), MESSAGE(1), PROGRAM( ), LINENO( ) && Trap OLE & other errors. * Initialize variables passed to Word to create form letter. intro1="Congratulations! You are one of our best customers since you have ; purchased $" intro2=" each month from us. " intro3="As a result, your maximum order amount has been increased by ; $2500.00. If you have any questions, please feel free to contact us." oWord = CREATEOBJECT("Word.Application") WITH oWord * Assign values to variables dsname="e:/VFP7/SAMPLES/DATA/customer.DBF" wformat=0 wconfirmconv=0 wreadonly=0 wlinktosource=0 waddtofilelist=0 wpassworddoc="" wpasswordtemp="" wrevert=0 wprotectdoc="" wprotecttemp="" wconn="DSN=visual foxpro tables;uid=;pwd=;"+; "sourcedb=e:/vfp7/samples/data;sourcetype=dbf"+; "exclusive=no;backgroundfetch=yes;collate=machine;" wsqlstatement="SELECT contact,company,title,address,city,; postalcode,STR(maxordamt,12,2) as maxordamt FROM customer ; WHERE (customer.maxordamt>$100000)" .Visible=.T. && Make Word visible. .WindowState = 2 && Minimize Word. .Documents.Add && Add new document. .Selection.InsertParagraphAfter .ActiveDocument.MailMerge.OpenDataSource; (dsname,wformat,wconfirmconv,wreadonly,wlinktosource,; waddtofilelist,wpassworddoc,wpasswordtemp,wrevert,; wprotectdoc,wprotecttemp,wconn,wsqlstatement) .ActiveDocument.MailMerge.EditMainDocument .Selection.InsertDateTime("dddd, MMMM dd, yyyy", 1) .Selection.MoveRight .Selection.InsertParagraphAfter .Selection.MoveDown .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"contact") .Selection.InsertParagraphAfter .Selection.MoveDown .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"company") .Selection.InsertParagraphAfter .Selection.MoveDown .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"title") .Selection.InsertParagraphAfter .Selection.MoveDown .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"address") .Selection.InsertAfter(", ") .Selection.MoveRight .ActiveDocument.MailMerge.Fields.Add(oWord.Selection.Range,"city") .Selection.InsertAfter(" ") .Selection.MoveRight .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"postalcode") .Selection.MoveRight .Selection.InsertParagraphAfter .Selection.InsertParagraphAfter .Selection.InsertAfter("Dear ") .Selection.MoveRight .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"contact") .Selection.MoveRight .Selection.InsertAfter(":") .Selection.MoveRight .Selection.InsertParagraphAfter .Selection.InsertParagraphAfter .Selection.MoveDown .Selection.InsertAfter(intro1) .Selection.MoveRight .ActiveDocument.MailMerge.Fields.Add; (oWord.Selection.Range,"maxordamt") .Selection.MoveRight .Selection.InsertAfter(intro2) .Selection.MoveRight .Selection.InsertAfter(intro3) .Selection.MoveRight .Selection.InsertParagraphAfter .Selection.InsertParagraphAfter .Selection.MoveDown .Selection.InsertAfter("Thank you,") .Selection.MoveRight .Selection.InsertParagraphAfter .Selection.InsertParagraphAfter .Selection.MoveDown .Selection.Fields.Add(oWord.Selection.Range,-1,"author") .ActiveDocument.MailMerge.Destination = 0 && new document. .ActiveDocument.MailMerge.Execute && Run the merge. nanswer = MESSAGEBOX("Would you like to view the finished ; document?",36,"Switch to Word") DO CASE CASE nanswer = 6 .ActiveWindow.View.Type = 3 && Page layout view. .Visible = .T. .Application.Activate && Bring Word forward. .WindowState = 0 && Word in normal state. =INKEY(5) && Wait 5 seconds then bring VFP back. .WindowState = 2 && Then minimize Word. ENDCASE nanswer = MESSAGEBOX("Print the document?",36,; "Print the merged document.") DO CASE CASE nanswer = 6 && Yes .ActiveDocument.PrintOut && Print the merged form letter. ENDCASE nanswer = MESSAGEBOX("Save the document?",36,; "Enter the name to save the merged document.") DO CASE CASE nanswer = 6 && Yes cbaddoc=SPACE(25) DO WHILE .T. DEFINE WINDOW getname FROM 1,1 TO 15,60 ; FONT 'COURIER NEW',10 FLOAT GROW ZOOM ACTIVATE WINDOW getname cdoc=SPACE(25) mquit = SPACE(1) IF !EMPTY(cbaddoc) @2,1 SAY "Existing file name: "+cbaddoc COLOR R+/w ENDIF @4,1 SAY "Enter a name for the Word document." @5,1 GET cdoc color b/w VALID emptyChk(cdoc) @7,25 GET mquit FUNCTION '*T Save' SIZE 2,10 READ CYCLE CLEAR WINDOW getname cdoc=ALLTRIM(cdoc) cpath= .Options.DefaultFilePath(0) && Get Word's && default document path. IF FILE(cpath+"/"+cdoc+".doc") WAIT WINDOW "Document already exists! Enter another ; file name." TIME 1 cbaddoc=cdoc LOOP ELSE .ActiveDocument.SaveAs(cdoc) ENDIF .Documents.Close(0) .Application.Quit EXIT ENDDO CASE nanswer = 7 && No .Documents.Close(0) .Application.Quit ENDCASE ENDWITH ON ERROR && Restore system error handler. IF VAL(SUBSTR(VERSION(4),2,1))>7 _screen.Themes=lthemes endif PROCEDURE emptychk PARAMETER pcdoc IF !EMPTY(pcdoc) RETURN .T. ELSE WAIT WINDOW "Enter a name for the Word Document" RETURN 0 ENDIF PROCEDURE errhand PARAMETER merror, mess, mess1, mprog, mlineno CLEAR IF merror=1426 mlineno=LTRIM(STR(LINENO())) merror=LTRIM(STR(merror)) =MESSAGEBOX("You have an OLE error. Usually this is caused by quitting Word or canceling out of a dialog box in Word. "+CHR(13)+; "The error message is "+mess) ELSE mlineno=LTRIM(STR(LINENO())) merror=LTRIM(STR(merror)) =MESSAGEBOX("An error occured on line "+mlineno+; ". The error message is "+mess+" The error number is "+merror) ENDIF ON ERROR RETURN ***/ End program code /***
[/code]
相关文章推荐
- How to automate Excel using MFC and worksheet functions
- How to send mail using VBScript & JMail - SourceCode - 如何用VBScript & JMail 发送邮件 - 源码
- How to send mail using any email account through Foxmail ? - Foxmail 6 漏洞,如何通过 Foxmail 用任意邮件账号发送邮件?
- How to send mail using C++ & CAsyncSocket - SourceCode - 用C++ & CAsyncSocket 如何发送邮件 - 源码 - HackerJLY
- How to delete all email in the mail server using telnet & WCScript - 如何用 Telnet 删除邮件服务器上的所有邮件
- How to add icon for the item of ListCtrl using C++ (Mail Attachment ListCtrl) - 如何用C++为ListCtrl的Item添加图标(邮件附件ListCtrl)
- qmail Vpopmail And sqwebmail HOWTO
- How to send mail by EMS - 如何实现邮件特快专递
- How to Send an Email Using UTL_SMTP with Authenticated Mail Server
- wxWidgets: How to initialize wxApp without using macros and without entering the main loop
- [Sharepoint]How to Complete Task using code and send to next task
- how to get geometry type of layer using IMapServer3 and IMapLayerInfo? (C#)
- How to browse the entire documentation using XCode 5 Documentation and API Reference ?
- 转载:how to automate Microsoft Excel and return the values from a multi-cell range to an array
- How to convert Word table into Excel using OpenXML
- How To Automate Cleanup Of Dead Connections And INACTIVE 【如何自动清理ORACLE中的死连接和非活动会话】
- Use mail merge to create custom letters, invoices, labels and more
- How to Change the DBID and the DBNAME by using NID [ID 224266.1]
- [转]How to build a data storage and VM Server using comodity hardware and free software
- How To Download The Latest Updates And Patches Using 11.2.0.2 OUI [ID 1295074.1]