2012-05-21 33 views
1

使用Word 2010 GUI,有一個選項「從文件中插入文本......」,這正是這麼做的:它插入文本中的一個主要部分將文檔保存到文檔中的當前位置。如何「從插入文件中的文本」使用的OpenXML SDK 2.0

我想做同樣使用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是什麼樣的?

回答

1

而不是像在書籤位置插入文檔body標籤的後代一樣簡單。一些原因:

  • 這兩個文件可能會使用不同的風格;您將不得不復制相關樣式,或更新引用以使用目標文檔中的樣式。
  • <bookmarkStart>標籤幾乎可以在任何地方出現在文檔中,包括一個段落,一個跑,一個表格單元格,等裏面既然你不能嵌套段落或運行時,你將不得不決定在書籤位於,然後上升/下載XML樹,直到找到插入內容的適當位置。

使用OpenXml SDK時,您要做的事情變得相當複雜。它需要對格式及其模式有深入的瞭解。

我幾乎建議使用VSTO/OLE自動化來代替,因爲它使您可以使用內置到Word的功能。

+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; 
} 
相關問題