1

当我尝试解析超过 100 页的文档中的文本时,Word 互操作速度非常慢。我重新编写了代码以使用速度更快的 OpenXML SDK。我的问题是,一旦我在 OpenXML 文档中找到信息,我必须在 Word 文档中找到它并将主窗口滚动到它。为了实现这一点,我必须以某种方式将 OpenXML 段落与互操作段落匹配。我认为互操作段落与 openxml 段落完美匹配,但我错了。事实上,互操作通常比 OpenXML 有更多的段落。有什么技巧或某种信息可以帮助我匹配它们吗?例如,我发现通常互操作在表中的每一行之后还有 1 个空段落。所以我可能会使用这些信息并记住它,

更新

下面是我创建的简单加载项的屏幕截图,用于演示 Word 文档中的 interop 和 openxml 段落之间的区别,内容如下:

MS 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();
4

1 回答 1

0

将我的评论变成答案。


对于表格行,您可以使用Range.IsEndOfRowMark检查是否正在查看行尾段落。

如果指定范围已折叠并且位于表中的行尾标记处,则此属性返回 True,否则返回 False。

您还可以使用Range.Information[WdInformation.wdAtEndOfRowMarker]

如果指定的选择或范围位于表中的行尾标记处,则返回 True

尽管文档略有不同,但该属性的范围也必须折叠。AFAIK,它们是等价的。

我还注意到,如果您直接访问一个段落,例如 Document.Paragraph[4],这将不起作用。您必须遍历它们才能使其正常工作。这似乎没有记录。

于 2019-03-13T15:18:36.740 回答