2016-01-22 16 views
-2

Я хотел бы объединить два документа Word в один, используя Delphi.Объединить два документа Word, используя Delphi

В моей базе данных У меня есть таблица, содержащая таблицу с 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; 

Это то, что я пробовал.

+2

Просто в стороне, но зачем использовать 'с dm', а затем добавить' dm.' в большинство закрытых полей? В конечном итоге будет проще и безопаснее удалить «с». –

+0

@DavidA все еще в отладке, я пробовал разные строки кода, поэтому я так реорганизую, когда у меня есть рабочее решение. – CiucaS

+0

Я думаю, вы не можете сделать это таким образом. вы должны сохранять документы отдельно, открывать эти файлы с помощью Delphi отдельно и копировать один контент на другой. посмотрите здесь http://stackoverflow.com/questions/5393368/ole-automation-how-do-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

Смежные вопросы