Взаимодействие Word происходит безумно медленно, когда я пытаюсь проанализировать текст в документе с более чем 100 страницами. Я переписал свой код для использования OpenXML SDK, который намного быстрее. Моя проблема в том, что, как только я нашел информацию в документе OpenXML, мне нужно найти ее, затем в документе Word и прокрутить к ней главное окно. Для этого мне нужно как-то сопоставить абзац OpenXML с абзацем взаимодействия. Я думал, что абзацы взаимодействия идеально совпадают с абзацами openxml, но я ошибся. На самом деле взаимодействие обычно имеет больше абзацев, чем в OpenXML. Есть ли какая-то хитрость или какая-то информация, которая может помочь мне сопоставить их? Например, я выяснил, что обычно у взаимодействия есть еще 1 пустой абзац после каждой строки в таблице. Поэтому я, вероятно, мог бы использовать эту информацию и помнить об этом, однако я боюсь, что я нашел гораздо больше, чем один случай.
UPDATE
Ниже приведены скриншоты простой надстройки, которую я создал, чтобы продемонстрировать разницу между абзацами interop и openxml в документе Word с простым содержимым, подобным этому:
Затем надстройка извлекает список абзацев взаимодействия и список абзацев OpenXML и показывает их рядом:
![Side-by-side comparison](https://i.stack.imgur.com/ye97c.png)
Вот код, который я использовал:
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();