Взаимодействие Word безумно медленное, когда я пытаюсь разобрать текст в документе, состоящем из 100+ страниц. Я переписал свой код, чтобы использовать OpenXML SDK, который работает намного быстрее. Моя проблема в том, что как только я нашел информацию в документе OpenXML, мне нужно найти ее в документе Word и прокрутить к ней главное окно. Для этого мне нужно как-то сопоставить абзац OpenXML с абзацем взаимодействия. Я думал, что абзацы взаимодействия идеально соответствуют абзацам openxml, но я ошибался. Фактически, в интерфейсе обычно больше абзацев, чем в OpenXML. Есть ли какой-нибудь трюк или какая-то информация, которая могла бы помочь мне сопоставить их? Например, я выяснил, что обычно у interop есть еще 1 пустой абзац после каждой строки в таблице. Так что я, вероятно, мог бы использовать эту информацию и иметь ее в виду, однако я боюсь, что это гораздо больше, чем просто один случай, который я обнаружил.
ОБНОВЛЕНИЕ
Ниже приведены снимки экрана простой надстройки, которые я создал, чтобы продемонстрировать разницу между абзацами interop и openxml в документе Word с таким простым содержимым, как это:
Затем надстройка извлекает список абзацев взаимодействия и список абзацев OpenXML и показывает их рядом:
Вот код, который я использовал:
var document = Globals.ThisAddIn.Application.ActiveDocument;
if (document == null)
return;
var interopParagraphs = document
.StoryRanges
.Cast<Range>()
.SingleOrDefault(r => r.StoryType == WdStoryType.wdMainTextStory)
.Paragraphs
.Cast<Paragraph>()
.Select(p => p.Range.Text);
var openXmlDocument = WordprocessingDocument.FromFlatOpcString(document.Content.WordOpenXML);
if (openXmlDocument == null)
return;
var openXmlParagraphs = openXmlDocument
.MainDocumentPart
.Document
.Body
.Descendants<DocumentFormat.OpenXml.Wordprocessing.Paragraph>()
.Select(p => p.InnerText);
var compareDialog = new CompareForm(interopParagraphs, openXmlParagraphs);
compareDialog.ShowDialog();
selection.Find
в первых 255 символах абзаца? - person Cindy Meister   schedule 08.11.2018Range.IsEndOfRowMark
илиRange.Information[WdInformation.wdAtEndOfRowMarker]
(не забудьте сначала свернуть диапазон, иначе это не сработает), чтобы игнорировать их, но я не знаю, какие другие случаи могут существует. Также это не сработает, если вы просто пытаетесь сопоставить индексы без итерации. - person Chris   schedule 09.11.2018