Автоматизация Word - CopyFormat в цикле = медленно

Я пытаюсь скопировать / вставить форматирование поля в Word. (Microsoft.Office.Interop.Word)

Моя цель - скопировать форматирование, обновить поле и вставить форматирование, чтобы применить его к новому содержимому. (в моем тестовом коде часть обновления и вставки не указана)

Я заметил, что это становится очень медленным в большой петле. У меня есть +- 5000 полей в моем документе Word. После + -500 итераций выполнение одной итерации занимает до 1,2 секунды (только для кода внизу этого поста). После того, как он достигает 1,2 секунды, продолжительность больше не увеличивается (возможно, это связано с буфером).

Может кто-нибудь дать мне решение по улучшению скорости?

    foreach (Field o in m_doc.Fields)
    {
      if (o.Type == WdFieldType.wdFieldRef)
      {
        o.Select();
        Range r = o.Result;
        r.Select();
        m_doc.Application.Selection.CopyFormat();
      }
    }

1 ответ

Я немного цепляюсь за соломинку, но здесь...

  1. Конечно, вы можете немного ускорить процесс, не используя o.Select(); В этом нет необходимости, и каждый ваш вызов SELECT заметно повлияет на производительность.

  2. Медлительность - известная проблема в циклах foreach - она ​​связана с тем, как API работает с документом. Насколько я помню, он более или менее имеет тенденцию начинаться с начала и отсчитываться вперед в каждом цикле. Цикл for, использующий счетчик индекса, имеет тенденцию быть быстрее. И в некоторых случаях цикл for, который заполняет BACKWARDS, может быть даже более эффективным.

Другие вопросы по тегам