如何使用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
的方法应该是什么样子的?
这就是我实现它的方式。 解决方案是使用 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内置的功能。