【问题标题】:Concatenate two Word documents using Delphi使用 Delphi 连接两个 Word 文档
【发布时间】:2016-07-01 18:34:20
【问题描述】:

我想使用 Delphi 将两个 word 文档合二为一。

在我的数据库中,我有一个表,其中包含一个包含 Word 文档的 varbinary(max) 表,我想根据条件从该表的某些行创建一个 Word 文档。

我尝试过使用流

见:Concatenate TStringStream

有什么想法可以实现吗?我一直在寻找,但没有找到解决方案。

var
  i: Int32;
  stream: TFileStream;
  Path1: string;
  WordApp: TWordApplication;
begin
  Path1 := IncludeTrailingPathDelimiter(GetEnvironmentVariable('TEMP')) +
    FormatDateTime('yyyymmddhhnnssz', Now) + '.doc';
  WordApp := TWordApplication.Create(nil);
  stream := TFileStream.Create(Path1, fmCreate);
  try
    try
      with dm do
      begin
        DataSet.First;
        CopyBlobFieldToStream(dm.DataSet,
          dm.DataSetBlobField, stream);
        ShowMessage(IntToStr(stream.Size));
        DataSet.Next;
        CopyBlobFieldToStream(dm.DataSet,
          dm.DataSetBlobField, stream);
        ShowMessage(IntToStr(stream.Size));
        CopyBlobFieldToStream(dm.DataSet2,
          dm.DataSet2BlobField, stream);
        ShowMessage(IntToStr(stream.Size));
      end;
    finally
      stream.Free;
    end;
    WordApp.Documents.Open(Path1, EmptyParam, False, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
    WordApp.Visible := True;
  finally
    WordApp.Free;
  end;

这是我尝试过的。

【问题讨论】:

  • 顺便说一句,但为什么要使用with dm,然后在大多数封闭字段中添加dm.?从长远来看,删除with 会更干净、更安全。
  • @DavidA 它仍在调试中,我已经尝试了各种代码行,这就是为什么会这样,当我有一个可行的解决方案时我会重构它。
  • 我认为你不能这样做。您应该单独保存文档,分别用Delphi打开这些文件并将一个内容复制到另一个内容。看看这里stackoverflow.com/questions/5393368/…
  • 我认为您认为连接流等同于连接它们包含的 Word 文档的假设是错误的。它不是 - Word 文档是一个容器。

标签: delphi ms-word


【解决方案1】:

正如我在您上一个问题中所说,Word BIFF8 文件不能简单地连接。您需要创建一个包含两个文档内容的新 BIFF8 文件。

使用 Word 自动化来做到这一点。装入第一个文档。将所选内容移动到该文档的末尾。在该点插入第二个文档。保存合并的文档。这是一个使用后期绑定 COM 的非常简单的示例:

uses
  ComObj;
....
procedure CombineDocFiles(const input1, input2, output: string);
const
  wdStory = $00000006;
var
  Word, Document: OleVariant;
begin
  Word := CreateOleObject('Word.Application');
  Document := Word.Documents.Open(input1);
  Word.Selection.EndKey(wdStory);
  Word.Selection.InsertFile(input2);
  Document.SaveAs(output);
  Word.Quit;
end;

因为我使用了后期绑定的 COM,所以我选择显式定义 wdStory。您也可以使用 Word2000 单位。如果你这样做了,你也可以切换到早期绑定的 COM,如果你愿意的话。

无论如何,我真的不认为这个问题应该成为如何进行 Word 自动化的完整课程。这只是一个开始,让您指向正确的方向。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2015-03-30
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多