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

时间:2012-05-21 00:16:20

标签: c# openxml openxml-sdk

使用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应该是什么样的?

2 个答案:

答案 0 :(得分:2)

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

这是(简化)代码:

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;
}

答案 1 :(得分:1)

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

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

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

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