2016-01-22 82 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