Я не видел такой ужасной производительности при тестировании на моей машине, но, тем не менее, есть способы улучшить производительность.
Самое большое улучшение - это установить aWordApp.ActiveWindow.Visible
в False
перед вызовом MSWordSearchAndReplaceInAllDocumentParts.
Вторым улучшением является установка aWordApp.ScreenUpdating
в False
.
Когда вы вызываете MSWordSearchAndReplaceInAllDocumentParts несколько раз подряд, примените вышеуказанные настройки один раз.Кроме того, установите ActiveWindow.ActivePane.View.Type
в wdPrintView
перед многократным вызовом MSWordSearchAndReplaceInAllDocumentParts.
Редактировать:
Я получил еще одно улучшение, изменив способ поиска / замены:Вместо того, чтобы менять SeekView, перебирайте все разделы и сами выбирайте диапазон документа, верхние и нижние колонтитулы и выполняйте поиск / замену в этих диапазонах.
procedure TForm1.MSWordSearchAndReplaceInAllDocumentParts(const aDoc: OleVariant);
var
i: Integer;
lSection: OleVariant;
lHeaders: OleVariant;
lFooters: OleVariant;
lSections: OleVariant;
begin
lSections := aDoc.Sections;
for i := 1 to lSections.Count do
begin
lSection := lSections.Item(i);
lHeaders := lSection.Headers;
lFooters := lSection.Footers;
if lSection.PageSetup.OddAndEvenPagesHeaderFooter then
begin
SearchAndReplaceInADocumentPart(lHeaders.Item(wdHeaderFooterEvenPages).Range);
SearchAndReplaceInADocumentPart(lFooters.Item(wdHeaderFooterEvenPages).Range);
end;
if lSection.PageSetup.DifferentFirstPageHeaderFooter then
begin
SearchAndReplaceInADocumentPart(lHeaders.Item(wdHeaderFooterFirstPage).Range);
SearchAndReplaceInADocumentPart(lFooters.Item(wdHeaderFooterFirstPage).Range);
end;
SearchAndReplaceInADocumentPart(lHeaders.Item(wdHeaderFooterPrimary).Range);
SearchAndReplaceInADocumentPart(lFooters.Item(wdHeaderFooterPrimary).Range);
SearchAndReplaceInADocumentPart(lSection.Range);
end;
end;
procedure TForm1.SearchAndReplaceInADocumentPart(const aRange: OleVariant);
begin
aRange.Find.ClearFormatting;
aRange.Find.Text := aSearchString;
aRange.Find.Replacement.Text := aReplaceString;
aRange.Find.Forward := True;
aRange.Find.MatchAllWordForms := False;
aRange.Find.MatchCase := True;
aRange.Find.MatchWildcards := False;
aRange.Find.MatchSoundsLike := False;
aRange.Find.MatchWholeWord := False;
aRange.Find.MatchFuzzy := False;
aRange.Find.Wrap := wdFindContinue;
aRange.Find.Format := False;
{ Perform the search}
aRange.Find.Execute(Replace := wdReplaceAll);
end;
Вы увидите еще большее улучшение, есливы открываете документ, который хотите изменить, когда приложение невидимо, или открываете документ с помощью Visible: = False;(установка приложения видимым снова также сделает документ видимым).