如何使用OpenXml SDK 2.0“从文件插入文本”

本文关键字:文件 插入文本 何使用 OpenXml SDK | 更新日期: 2023-09-27 18:34:41

使用 Word 2010 GUI,有一个"从文件插入文本..."的选项,它正是这样做的:它将文档主要部分中的文本插入到文档中的当前位置。

我想使用 C# 和 OpenXml SDK 2.0 做同样的事情

using (var mainDocument = WordprocessingDocument.Open("MainFile.docx", true);
{
    var mainPart = mainDocument.MainDocumentPart;
    var bookmarkStart = mainPart
                        .Document
                        .Body
                        .Descendants<BookmarkStart>()
                        .SingleOrDefault(b => b.Name == "ExtraContentBookmark");
    var extraContent = GetTextFromFile("ExtraFile.docx");
    bookmarkStart.InsertAfterSelf(extraContent);
}

我尝试使用纯XML(XElement(,使用OpenXmlElement(MainDocumentPart.Document.Body.Descendants(和使用AltChunk。到目前为止,每个替代方案都产生了一个不符合标准的docx文件。

GetTextFromFile的方法应该是什么样子的?

如何使用OpenXml SDK 2.0“从文件插入文本”

这就是我实现它的方式。 解决方案是使用 Eric White 所描述的 AltChunk。我已经尝试过了,但正如布拉德利在他的回答中所说,书签可能在文档中的任何位置,而我的书签则在段落内。一旦我在包含段落之前插入文本,一切正常。

这是(简化的(代码:

using (var mainDocument = WordprocessingDocument.Open("MainFile.docx", true);
{
    var mainPart = mainDocument.MainDocumentPart;
    var bookmarkStart = mainPart
                        .Document
                        .Body
                        .Descendants<BookmarkStart>()
                        .SingleOrDefault(b => b.Name == "ExtraContentBookmark");
    var altChunk = GetAltChunkFromFile("ExtraFile.docx", mainPart);
    var containingParagraph = element.Ancestors<Paragraph>().FirstOrDefault();
    containingParagraph.InsertBeforeSelf(altChunk);
}
...
private AltChunk GetAltChunk(string filename, MainDocumentPart mainDocumentPart)
{
    var altChunkId = "AltChunkId1";
    var chunk = mainDocumentPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.WordprocessingML, altChunkId);
    chunk.FeedData(File.Open(filename, FileMode.Open));
    var altChunk = new AltChunk { Id = altChunkId };
    return altChunk;
}

它不像在书签位置插入文档正文标签的后代那么简单。一些原因:

  • 这两个文档可能使用不同的样式;您必须跨从属样式进行复制,或者更新引用以使用目标文档中的样式。
  • <bookmarkStart> 标签几乎可以出现在文档中的任何位置,包括段落、运行、表格单元格等。由于无法嵌套段落或运行,因此必须确定书签的位置,然后升序/降序 XML 树,直到找到插入内容的合适位置。

在使用OpenXml SDK时,您尝试执行的操作变得非常复杂。它需要深入了解格式及其架构。

我几乎建议改用VSTO/OLE自动化,因为它使您能够使用Word内置的功能。