2015-08-28 4 views
1

Я пытаюсь скопировать/вставить форматирование поля в Word. (Microsoft.Office.Interop.Word)Word automation - CopyFormat in loop = slow

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

Я заметил, что это очень медленно в большой петле. У меня есть + - 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(); 
     } 
    } 

ответ

0

Я хватался за соломинку немного, здесь, однако ...

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

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