[英]How to “Insert text from file” using OpenXml SDK 2.0
使用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內置的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.