2016-01-22 49 views
-2

我想用Delphi将两个word文档合并成一个。用Delphi连接两个Word文档

在我的数据库中,我有一个表包含一个varbinary(max)包含一个Word文档的表,我想根据条件从该表的某些行创建一个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; 

这就是我试过的。

+2

请稍等,但为何使用'with dm',然后将dm.'添加到大多数封闭的字段中?从长远角度来看,清除'with'将会更清洁和更安全。 –

+0

@DavidA它仍然在调试,我已经尝试过各种代码行,这就是为什么是这样的,当我有一个工作解决方案时,我会重构它。 – CiucaS

+0

我认为你不能这样做。您应该单独保存文档,分别使用Delphi打开这些文件并将一个内容复制到另一个。看看这里http://stackoverflow.com/questions/5393368/ole-automation-how-do-i-copy-text-between-word-documents-without-using-the-clip – sddk

回答

3

正如我在上一个问题中所说的,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自动化的完整教训。这只是让你指向正确方向的开始。

+0

按预期工作! – CiucaS