当我尝试用100多页解析文档中的文本时,Word互操作非常慢。我重新编写了我的代码以使用OpenXML SDK,速度更快。我的问题是,一旦我在OpenXML文档中找到了信息,我就必须在Word文档中找到它并滚动主窗口。为了实现这一点,我必须以某种方式将OpenXML段落与interop段落相匹配。我认为互操作段落完全匹配openxml段落,但我错了。实际上,互操作通常比OpenXML中有更多的段落。是否有任何技巧或某种信息可以帮助我匹配它们?例如,我已经发现通常interop在表中的每一行之后还有1个空段。所以我可能会使用这些信息并记住它,但是我担心的不仅仅是我发现自己的一个案例。
UPDATE
下面是我创建的简单插件的截图,用于演示Word文档中interop和openxml段落之间的区别,简单内容如下:
然后,加载项将检索互操作段落列表和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();
将我的评论转化为答案。
对于表行的情况,您可以使用Range.IsEndOfRowMark检查是否正在查看行尾段。
如果指定的范围是折叠的并且位于表格中的行尾标记,则此属性返回True,否则返回False。
你也可以使用Range.Information[WdInformation.wdAtEndOfRowMarker]。
如果指定的选择或范围位于表中的行尾标记处,则返回True
尽管文档略有不同,但此属性的范围也必须折叠。 AFAIK,它们是等价的。
我还注意到,如果直接访问段落,例如Document.Paragraph [4],这不起作用。你必须遍历它们才能工作。这似乎没有记录。