我正在尝试更新用Delphi编写的会员软件,以便将邮件合并到Word2010中。
我使用
wrdApp := CreateOleObject('Word.Application');
wrdDoc := wrdApp.Documents.add();
那么对于模板中的每个合并字段名,我将其替换为表中相应的字段值。
我已经成功地为单个成员做到了这一点,感谢之前的回答:MS Word 2010 mailmerge in Delphi 5
然而,我有麻烦迭代这个代码在表中的所有成员。理想情况下,我需要模板出现在同一文档的新页面上,下一个成员的详细信息在。
目前我只能为每个成员覆盖同一个文档,或者每次创建一个新文档。
谁能告诉我如何在下一页上重新创建模板,将多个文档合并到同一个文档中或建议替代方法?
多谢
您实际上并没有创建邮件合并。
这里的一些代码(见下面的注释)可能会有所帮助。它使用Delphi的TWordApplication
组件来处理连接并提供数据类型,但它应该给您一个方向:
// Drop a TWordApplication (from the Servers palette page) on a new blank form,
// and change it's name to WordApp. No other property changes or components are
// used.
procedure TForm1.FormCreate(Sender: TObject);
var
Doc: _Document;
DBName: string;
Pause, SQL, Connection, SaveChanges: OleVariant;
begin
WordApp.Connect;
Doc := WordApp.Documents.AddOld(EmptyParam, EmptyParam);
WordApp.Visible := True;
SetUpMergeDoc(Doc);
DBName := 'YourDatabasePathDatabaseName';
Connection := 'YourADOorODBCConnectionString';
SQL := 'SELECT * FROM customer';
Doc.MailMerge.OpenDataSource(DBName, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, Connection,
SQL, EmptyParam, EmptyParam, EmptyParam);
// Do the actual mailmerge.
Pause := False;
Doc.MailMerge.Destination := wdSendToNewDocument;
Doc.MailMerge.Datasource.FirstRecord := wdDefaultFirstRecord;
Doc.MailMerge.Datasource.LastRecord := integer(wdDefaultLastRecord);
Doc.MailMerge.Execute(Pause);
// Save the mailmerged document
SaveChanges := wdDoNotSaveChanges;
WordApp.Quit(SaveChanges, EmptyParam, EmptyParam);
Doc := nil;
WordApp := nil;
end;
procedure TForm1.SetUpMergeDoc(Doc: _Document);
var
R: Range;
Direction: OleVariant;
begin
R := Doc.Range(EmptyParam, EmptyParam);
Direction := wdCollapseEnd;
R.InsertAfter('Dear ');
R.Collapse(Direction);
{ Insert a field with the name of the datasource field }
Doc.MailMerge.Fields.Add(R, 'Company');
R := Doc.Range(EmptyParam, EmptyParam);
R.Collapse(Direction);
R.InsertParagraphAfter;
R.InsertAfter('We have yet to receive payment for our invoice of ');
R.Collapse(Direction);
Doc.MailMerge.Fields.Add(R, 'LastInvoiceDate');
R := Doc.Range(EmptyParam, EmptyParam);
R.Collapse(Direction);
R.InsertAfter('.');
R.InsertParagraphAfter;
R.InsertAfter('Cough up or we''ll send the boys round.');
R.InsertParagraphAfter;
end;
注意:大部分代码是从下载的例子中获得的,我从Deborah Pate网站的Word自动化页面上得到的。(黛博拉曾经是(可能仍然是)TeamB的一员。)我只是把它修改为通过TWordApplication
连接,并更新为在Delphi XE下编译。
正如我所说,它使用TWordApplication
来连接Word并暴露所使用的方法和类型。其他的都在代码中完成。
看起来您并没有真正执行邮件合并,而是在搜索和替换之前。这有什么原因吗?否则,为什么不直接设置一个"真正的"邮件合并来解决你的问题呢?