HOWTO: Automate Word 97 to Perform Mail Merge from DelphiID: Q229310
|
This article demonstrates how to create and manipulate a Word 97 document using Automation from Delphi.
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:
Q220607 HOWTO: Automate Word 97 to Perform Mail Merge From Visual Basic
Q220911 HOWTO: Automate Word 97 to Perform a Mail Merge from Visual C++ and MFC
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.
For more information on Office Automation, please visit the Microsoft Office Development support site at:
http://support.microsoft.com/support/officedev/
© Microsoft Corporation 1999, All Rights Reserved.
Contributions by Mark Durrett, Microsoft Corporation
Keywords : kb3rdparty kbAutomation kbWord kbGrpDSO
Version : WINDOWS:97
Platform : WINDOWS
Issue type : kbhowto
Last Reviewed: June 30, 1999