将OpenXML SDK中的段落与Word文档中的interop段匹配

问题描述 投票:1回答:1

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

UPDATE

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

MS Word Document Sample然后,加载项将检索互操作段落列表和OpenXML段落列表,并将它们并排显示:

Side-by-side comparison

这是我使用的代码下面:

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();
ms-word vsto openxml-sdk wordprocessingml
1个回答
0
投票

将我的评论转化为答案。


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

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

你也可以使用Range.Information[WdInformation.wdAtEndOfRowMarker]

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.