1

使用 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样的?

4

2 回答 2

2

这就是我实现它的方式。解决方案是使用 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;
}
于 2012-05-21T09:41:19.600 回答
1

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

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

使用 OpenXml SDK 时,您尝试做的事情变得相当复杂。它需要对格式及其架构有深入的了解。

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

于 2012-05-21T01:03:59.663 回答