簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM