1

我正在尝试更新我用 Delphi 编写的会员软件,以邮件合并到 Word2010。

我在用着

wrdApp := CreateOleObject('Word.Application');
wrdDoc := wrdApp.Documents.add();

然后对于模板中的每个合并字段名称,我将其替换为表中的相应字段值。

由于之前的回答,我已经为单身成员成功完成了这项工作:MS Word 2010 mailmerge in Delphi 5

但是,我无法为表中的所有成员迭代此代码。理想情况下,我需要模板出现在同一文档的新页面上,并显示下一个成员的详细信息。

目前我只能为每个成员覆盖同一个文档,或者每次都创建一个新文档。

谁能告诉我如何在下一页上重新创建模板,将多个文档合并到同一个文档中或建议一种替代方法。

非常感谢

4

2 回答 2

1

您实际上并没有创建邮件合并。

这是一些可能有帮助的代码(见下面的注释)。它使用 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 := 'YourDatabasePath\DatabaseName';
  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 自动化页面下载的示例中获得的。(Deborah 曾经是(并且可能仍然是)TeamB 的成员。)我只是修改了它以连接 via并更新它以在 Delphi XE 下编译。TWordApplication

正如我所说,它TWordApplication用于与 Word 建立连接并公开使用的方法和类型。其他一切都在代码本身中完成。

于 2011-07-10T00:27:58.423 回答
0

看来您并没有真正执行邮件合并,而是执行搜索和替换。是否有一个原因?否则为什么不设置一个“真正的”邮件合并来解决你的问题。

于 2011-07-09T06:53:18.150 回答