私はDelphiアプリケーションからWordオートメーションを使用していますが、非常に遅いです。私は自分のコードを最小限にとどめて、経験がある人が私がどこに間違っているか教えてくれることを願っていました(そして、私は実際ににがうまくいき、Delphi XE2からWordオートメーションを高速化するには
私のアプリケーションのオートメーションの本質はブックマークを扱います。アプリケーションは、いくつかの特別なブックマークを持つ文書を開き、それらを実行し、名前に基づいて変更します。実際のバージョンでは、ドキュメント変数やフィールドコードも多用しています。典型的な文書には50-80個のブックマークがあり、そのうちのいくつかは入れ子になっています。私はまた、いくつかの一時的な文書を使用して、生成される文書に連続して配置されるテキストと画像のブロックを構築します。添付されたコードは、この機能を持たないVERYストリップされたバージョンですが、望ましくない動作(つまり、ドキュメントを生成する時間)を表示します。付属のサンプルでは、ドキュメントの生成に約2.5秒かかります。典型的な実際の文書の場合、約30〜40秒かかります。
私が望んでいるのは、誰かが「これはすべて間違っていると言いたいのですが、Word AutomationをDelphiから実行するときは、必ずXXXに覚えておく必要があります!
完全プロジェクトが完全に削除されてもかなり大きいので、この小さなアプリケーションを作成しました。私のやり方に明白な間違いがある場合は、このコードからはっきりと分かるはずです。
新しいVCLフォームアプリケーションを作成してください。 Wordを開いて、新しい文書を作成します。最初の行にテキストを入力し、マークを付けてブックマークを挿入します。 2行目にテキストを入力し、これもブックマークしてください。ファイルを 'c:\ temp \ bm.doc'としてWord 97-2003文書として保存します。アプリケーションを実行した後、最初の行に乱数を付けてブックマークを付けないで新しい文書( 'c:\ temp \ bm_generated.doc')を作成する必要があります。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, OleServer, WordXP, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
vWordApp : TWordApplication;
vDoc : WordDocument;
vFileName : OleVariant;
vIndex : OleVariant;
vBookmark : Bookmark;
vSave : OleVariant;
begin
vWordApp := TWordApplication.Create(nil);
try
vWordApp.ConnectKind := ckNewInstance;
vWordApp.Connect;
vFileName := 'c:\temp\bm.doc';
vDoc := vWordApp.Documents.Open(vFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
//Replace bookmark text with random string:
vIndex := 1;
vBookmark := vDoc.Bookmarks.Item(vIndex);
vBookmark.Range.Text := inttostr(random(10000)); //Will also delete the bookmark!
//Delete bookmark content and bookmark
vIndex := 1; //This will be the bookmark that was originally the first, since that was deleted when we sat the text
vBookmark := vDoc.Bookmarks.Item(vIndex);
vWordApp.Selection.SetRange(vBookmark.Range.Start, vBookmark.Range.End_);
vWordApp.Selection.Text := '';
vFileName := 'c:\temp\bm_generated.doc';
vDoc.SaveAs2000(vFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
vWordApp.NormalTemplate.Saved := true; //For å slippe spørsmål om "normal.dot" skal lagres
vSave := wdDoNotSaveChanges;
vWordApp.Quit(vSave);
vWordApp.Disconnect;
finally
vWordApp.Free;
end;
end;
end.
ちょっとばかげて、文書を扱うたびに 'TWordApplication'インスタンスを保持するのか、新しいインスタンスを作成しますか?私はあなたがそれを守っていると確信しています。それが愚かな注釈としてマークされている理由です:-) – TLama
そんなに愚かではありません。私は一度にいくつかのドキュメントを生成する場合、同じTWordApplicationを使用しますが、ほとんどの場合、そうではありません。これはERPアプリケーションの印刷ルーチンの一部なので、TWordApplicationを作成すると、印刷ダイアログにワード文書が生成されていることが示され、終了すると解放されます。 –
そのコードは私によく見えます。おそらくそれはちょうどそれがどれくらいの時間かかります。 –