Microsoft KB Archive/229310

= How To Automate Word to Perform Mail Merge from Delphi =

Article ID: 229310

Article Last Modified on 1/24/2007

-

APPLIES TO


 * Microsoft Word 2002 Standard Edition
 * Microsoft Word 2000 Standard Edition
 * Microsoft Word 97 Standard Edition

-



This article was previously published under Q229310



SUMMARY
This article demonstrates how to create and manipulate a Word document using Automation from Delphi.



MORE INFORMATION
This article parallels two articles that describe the same process using Visual C++ and Visual Basic. For more information, please see the following articles in the Microsoft Knowledge Base:

220607 How To Automate Word to Perform Mail Merge From Visual Basic

220911 How To Automate Word to Perform a Mail Merge from Visual C++ and MFC

Building the Automation Sample
 Start Delphi. A new project should be created by default. Add a button to Form1.  Replace the contents of the code window for Unit1 with the following: unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure InsertLines(LineNum : Integer); procedure CreateMailMergeDataFile; procedure FillRow(Doc : Variant; Row : Integer;                Text1,Text2,Text3,Text4 : String); private { Private declarations }

public wrdApp, wrdDoc: Variant; { Public declarations } end;

var Form1: TForm1;

implementation

uses ComObj;

Const wdAlignParagraphLeft = 0; Const wdAlignParagraphCenter = 1; Const wdAlignParagraphRight = 2; Const wdAlignParagraphJustify = 3; Const wdAdjustNone = 0; Const wdGray25 = 16; Const wdGoToLine = 3; Const wdGoToLast = -1; Const wdSendToNewDocument = 0;

{$R *.DFM}

procedure TForm1.InsertLines(LineNum : Integer); var iCount : Integer; begin for iCount := 1 to LineNum do    wrdApp.Selection.TypeParagraph; end;

procedure TForm1.FillRow(Doc : Variant; Row : Integer;                Text1,Text2,Text3,Text4 : String);

begin Doc.Tables.Item(1).Cell(Row,1).Range.InsertAfter(Text1); Doc.Tables.Item(1).Cell(Row,2).Range.InsertAfter(Text2); Doc.Tables.Item(1).Cell(Row,3).Range.InsertAfter(Text3); Doc.Tables.Item(1).Cell(Row,4).Range.InsertAfter(Text4); end;

procedure TForm1.CreateMailMergeDataFile; var wrdDataDoc : Variant; iCount : Integer; begin // Create a data source at C:\DataDoc.doc containing the field data wrdDoc.MailMerge.CreateDataSource('C:\DataDoc.doc',,,'FirstName, LastName,' +      ' Address, CityStateZip'); // Open the file to insert data wrdDataDoc := wrdApp.Documents.Open('C:\DataDoc.doc'); for iCount := 1 to 2 do   wrdDataDoc.Tables.Item(1).Rows.Add; // Fill in the data FillRow(wrdDataDoc, 2, 'Steve', 'DeBroux',       '4567 Main Street', 'Buffalo, NY  98052'); FillRow(wrdDataDoc, 3, 'Jan', 'Miksovsky',       '1234 5th Street', 'Charlotte, NC  98765'); FillRow(wrdDataDoc, 4, 'Brian', 'Valentine',       '12348 78th Street  Apt. 214', 'Lubbock, TX  25874'); // Save and close the file wrdDataDoc.Save; wrdDataDoc.Close(False); end;

procedure TForm1.Button1Click(Sender: TObject); var StrToAdd : String; wrdSelection, wrdMailMerge, wrdMergeFields : Variant; begin // Create an instance of Word and make it visible wrdApp := CreateOleObject('Word.Application'); wrdApp.Visible := True; // Create a new document wrdDoc := wrdApp.Documents.Add; wrdDoc.Select;

wrdSelection := wrdApp.Selection; wrdMailMerge := wrdDoc.MailMerge;

// Create MailMerge data file CreateMailMergeDataFile;

// Create a string and insert it into the document StrToAdd := 'State University' + Chr(13) + 'Electrical Engineering Department'; wrdSelection.ParagraphFormat.Alignment := wdAlignParagraphCenter; wrdSelection.TypeText(StrToAdd);

InsertLines(4);

// Insert Merge Data wrdSelection.ParagraphFormat.Alignment := wdAlignParagraphLeft; wrdMergeFields := wrdMailMerge.Fields;

wrdMergeFields.Add(wrdSelection.Range,'FirstName'); wrdSelection.TypeText(' '); wrdMergeFields.Add(wrdSelection.Range,'LastName'); wrdSelection.TypeParagraph; wrdMergeFields.Add(wrdSelection.Range,'Address'); wrdSelection.TypeParagraph; wrdMergeFields.Add(wrdSelection.Range,'CityStateZip');

InsertLines(2);

// Right justify the line and insert a date field with // the current date wrdSelection.ParagraphFormat.Alignment := wdAlignParagraphRight; wrdSelection.InsertDateTime('dddd, MMMM dd, yyyy',False);

InsertLines(2);

// Justify the rest of the document wrdSelection.ParagraphFormat.Alignment := wdAlignParagraphJustify;

wrdSelection.TypeText('Dear '); wrdMergeFields.Add(wrdSelection.Range,'FirstName');

wrdSelection.TypeText(','); InsertLines(2);

// Create a string and insert it into the document StrToAdd := 'Thank you for your recent request for next ' + 'semester''s class schedule for the Electrical ' + 'Engineering Department. Enclosed with this ' + 'letter is a booklet containing all the classes ' + 'offered next semester at State University. ' +     'Several new classes will be offered in the ' + 'Electrical Engineering Department next semester. ' +     'These classes are listed below.'; wrdSelection.TypeText(StrToAdd);

InsertLines(2);

// Insert a new table with 9 rows and 4 columns wrdDoc.Tables.Add(wrdSelection.Range,9,4); wrdDoc.Tables.Item(1).Columns.Item(1).SetWidth(51,wdAdjustNone); wrdDoc.Tables.Item(1).Columns.Item(2).SetWidth(170,wdAdjustNone); wrdDoc.Tables.Item(1).Columns.Item(3).SetWidth(100,wdAdjustNone); wrdDoc.Tables.Item(1).Columns.Item(4).SetWidth(111,wdAdjustNone); // Set the shading on the first row to light gray

wrdDoc.Tables.Item(1).Rows.Item(1).Cells .Shading.BackgroundPatternColorIndex := wdGray25; // BOLD the first row wrdDoc.Tables.Item(1).Rows.Item(1).Range.Bold := True; // Center the text in Cell (1,1) wrdDoc.Tables.Item(1).Cell(1,1).Range.Paragraphs.Alignment := wdAlignParagraphCenter;

// Fill each row of the table with data FillRow(wrdDoc, 1, 'Class Number', 'Class Name', 'Class Time',     'Instructor'); FillRow(wrdDoc, 2, 'EE220', 'Introduction to Electronics II',    '1:00-2:00 M,W,F', 'Dr. Jensen'); FillRow(wrdDoc, 3, 'EE230', 'Electromagnetic Field Theory I',    '10:00-11:30 T,T', 'Dr. Crump'); FillRow(wrdDoc, 4, 'EE300', 'Feedback Control Systems',    '9:00-10:00 M,W,F', 'Dr. Murdy'); FillRow(wrdDoc, 5, 'EE325', 'Advanced Digital Design',    '9:00-10:30 T,T', 'Dr. Alley'); FillRow(wrdDoc, 6, 'EE350', 'Advanced Communication Systems',    '9:00-10:30 T,T', 'Dr. Taylor'); FillRow(wrdDoc, 7, 'EE400', 'Advanced Microwave Theory',    '1:00-2:30 T,T', 'Dr. Lee'); FillRow(wrdDoc, 8, 'EE450', 'Plasma Theory',    '1:00-2:00 M,W,F', 'Dr. Davis'); FillRow(wrdDoc, 9, 'EE500', 'Principles of VLSI Design',    '3:00-4:00 M,W,F', 'Dr. Ellison');

// Go to the end of the document

wrdApp.Selection.GoTo(wdGotoLine,wdGoToLast); InsertLines(2);

// Create a string and insert it into the document StrToAdd := 'For additional information regarding the ' + 'Department of Electrical Engineering, ' + 'you can visit our website at '; wrdSelection.TypeText(StrToAdd); // Insert a hyperlink to the web page wrdSelection.Hyperlinks.Add(wrdSelection.Range,'http://www.ee.stateu.tld'); // Create a string and insert it into the document StrToAdd := '. Thank you for your interest in the classes ' + 'offered in the Department of Electrical ' + 'Engineering. If you have any other questions, ' + 'please feel free to give us a call at ' + '555-1212.' + Chr(13) + Chr(13) + 'Sincerely,' + Chr(13) + Chr(13) + 'Kathryn M. Hinsch' + Chr(13) + 'Department of Electrical Engineering' + Chr(13); wrdSelection.TypeText(StrToAdd);

// Perform mail merge wrdMailMerge.Destination := wdSendToNewDocument; wrdMailMerge.Execute(False);

// Close the original form document wrdDoc.Saved := True; wrdDoc.Close(False);

// Notify the user we are done. ShowMessage('Mail Merge Complete.');

// Clean up temp file DeleteFile('C:\DataDoc.doc');

end;

end.  Press the F9 key to run the project. Click the button and Microsoft Word should start and display a sample letter.

NOTE: Delphi is manufactured by Borland (Inprise Corporation), a vendor independent of Microsoft; we make no warranty, implied or otherwise, regarding this product's performance of reliability. Contact Inprise for any developer support regarding the Delphi language.

