使用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
应该是什么样的?
答案 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内置的功能。