いくつかの実験の後、次のコードを使用してMSWordで検索と置換を実行しました。このコードは、ヘッダーやフッターが最初のページや奇数/偶数ページで異なる場合を含め、ヘッダーとフッターでも完全に機能します。OLEとDelphiを使用してWord文書の検索置換のパフォーマンスを改善
問題は、私が置き換えるすべての文字列に対してMSWordSearchAndReplaceInAllDocumentParts
を呼び出す必要があり、許容できないパフォーマンス(4ページのドキュメントワードで約50文字列の2分間)が発生するということです。理想的には、それはもちろん「瞬間的」であるべきです。
ヘッダーとフッターを処理する前に、(wdSeekMainDocumentを使用して)メイン文書で検索と置換を行うだけでした。その場合、(たとえ非常に遅いとしても)輻輳は許容可能であった。私はちょうどなぜそんなに遅いのだろうか:切り替えるビューは時間がかかりますか?通常、ヘッダーやフッターには単語がほとんど含まれていないので、ヘッダーとフッターのすべての検索と置換が全体的なパフォーマンスをそれほど悪化させないと予想しました。しかし、これは私が観察したことではありません。ここで
// global variable (just for convenience of posting to Stack Overflow)
var
aWordApp: OLEVariant; // global
// This is the function that is executed once per every string I replace
function MSWordSearchAndReplaceInAllDocumentParts;
begin
try
iseekValue := aWordApp.ActiveWindow.ActivePane.View.SeekView;
iViewType := aWordApp.ActiveWindow.ActivePane.View.Type;
if iViewType <> wdPrintView then
aWordApp.ActiveWindow.ActivePane.View.Type := wdPrintView;
if aWordApp.ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter then
begin
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekEvenPagesFooter;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekEvenPagesHeader;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
end;
if aWordApp.ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter then
begin
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekFirstPageFooter;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekFirstPageHeader;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
end;
//Replace in Main Docpart
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekMainDocument;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
//Replace in Header
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageHeader;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
//Replace in Footer
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekCurrentPageFooter;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
//Replace in Header
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekPrimaryHeader;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
//Replace in Footer
Try
aWordApp.ActiveWindow.ActivePane.View.SeekView := wdSeekPrimaryFooter;
SearchAndReplaceInADocumentPart;
Except
// do nothing ..it was not able to set above view
end;
finally
aWordApp.ActiveWindow.ActivePane.View.SeekView := iseekValue;
if iViewType <> wdPrintView then
aWordApp.ActiveWindow.ActivePane.View.Type := iViewType;
end;
end;
// This is the function that performs Search And Replace in the selected View
// it is called once per view
function SearchAndReplaceInADocumentPart;
begin
aWordApp.Selection.Find.ClearFormatting;
aWordApp.Selection.Find.Text := aSearchString;
aWordApp.Selection.Find.Replacement.Text := aReplaceString;
aWordApp.Selection.Find.Forward := True;
aWordApp.Selection.Find.MatchAllWordForms := False;
aWordApp.Selection.Find.MatchCase := True;
aWordApp.Selection.Find.MatchWildcards := False;
aWordApp.Selection.Find.MatchSoundsLike := False;
aWordApp.Selection.Find.MatchWholeWord := False;
aWordApp.Selection.Find.MatchFuzzy := False;
aWordApp.Selection.Find.Wrap := wdFindContinue;
aWordApp.Selection.Find.Format := False;
{ Perform the search}
aWordApp.Selection.Find.Execute(Replace := wdReplaceAll);
end;
iは(私はAQtimeはプロを持っている)プロファイリングの結果を貼り付けます:
は、あなたがピンポイントで私を助けてください
この
は私がプロファイラの結果を置く下部に、コードであります問題?
本当にパフォーマンスが必要な場合OLEを介してWordを使用する/ ActiveXは基本的にはそれをカットしません... Word文書を処理するためのライブラリ(Word依存関係なし)を使用していますか? – Yahia
ベンチマークのために適切なサンプル文書を提供できる方が良いでしょう。 – menjaraz
プロファイリングの結果を詳しく説明できますか?時間は秒単位かミリ秒単位か、ヒットあたりの時間か、すべてのヒットの累積ですか? –