2010-07-28 132 views
10

在我們以前的基於MSWord-97的系統中,我們使用COM與.doc文件進行交互並嵌入OLE對象,以便嵌入文檔在父代中可見(而不是一個圖標)。使用OpenXML SDK將RTF文件的內容嵌入到DOCX文件中

我們用一個使用OpenXML SDK的系統取代了它,因爲它需要在我們的服務器上生成.docx文件。但是我們仍然需要將RTF文件的內容嵌入到生成的DOCX中......特別是我們用文件的內容替換書籤。

我在網上發現了幾個例子,但它們都有所不同。當我在Word中創建一個簡單的示例並查看XML時,有很多東西可以定位/顯示嵌入對象的可視表示,而嵌入本身並不太可怕。最簡單的方法是什麼?

+0

那麼我暫停了這個任務,但在3.5年後重新開放了它。我開始寫一個關於SO的問題,它讓我想起已經存在的問題! – 2013-11-27 15:58:22

+0

可能相關,也許它可以幫助某人:http://social.msdn.microsoft.com/Forums/office/en-US/7a729264-8747-4fc3-a604-d2f4443f3e84/insert-rtf-file-in-word- processing-document-using-office-open-xml?forum = oxmlsdk – 2013-11-27 16:09:00

回答

11

想通了你可以通過使用AltChunk錨外部內容嵌入RTF文件的內容爲OpenXML的DOCX文件 。 AltChunkw:altChunk)元素在您的OpenXML WordprocessingML文檔中指定 位置以插入外部內容,例如RTF文檔。 下面的代碼使用AltChunk類與 的AlternativeFormatImportPart類一起到RTF文檔的內容嵌入到DOCX文件中的最後一段:

using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(@"your_docx_file.docx", true)) 
{ 
    string altChunkId = "AltChunkId5"; 

    MainDocumentPart mainDocPart = wordDocument.MainDocumentPart; 
    AlternativeFormatImportPart chunk = mainDocPart.AddAlternativeFormatImportPart(
     AlternativeFormatImportPartType.Rtf, altChunkId);  

    // Read RTF document content. 
    string rtfDocumentContent = File.ReadAllText("your_rtf_document.rtf", Encoding.ASCII); 

    using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(rtfDocumentContent))) 
    { 
    chunk.FeedData(ms); 
    } 

    AltChunk altChunk = new AltChunk(); 
    altChunk.Id = altChunkId; 

    // Embed AltChunk after the last paragraph. 
    mainDocPart.Document.Body.InsertAfter(
    altChunk, mainDocPart.Document.Body.Elements<Paragraph>().Last()); 

    mainDocPart.Document.Save(); 
} 

如果你希望嵌入的Unicode RTF字符串轉換成DOCX文件,那麼你必須逃避Unicode字符。有關示例,請參閱以下stackoverflow answer

當您遇到錯誤「文件已損壞」然後確保你Dispose()Close()WordprocessingDocument。如果您沒有關閉()文檔,那麼w:altchunk的關聯並不存儲在Document.xml.rels文件中。

+0

我之前使用過'AltChunk'將HTML插入到docx文件中,並且它像一個魅力一樣工作。肯定要走的路 – flipchart 2013-12-02 10:32:13

+0

嗯,這似乎進行得如此順利,但我試圖在保存更改後在Word 2010中打開它時,「文件已損壞」。我現在正在使用這個例子。我應該檢查什麼,我應該在哪裏看? – 2013-12-05 17:26:18

+0

@John:你能提供一個示例文檔(這是腐敗)嗎?所以我會看看它。我使用OpenXML生產力工具包來檢查這些文檔。您插入的RTF文檔是否完整(有效)?內存流的當前位置是否爲零?請注意,FeedData方法不尋求流的開始。 – Hans 2013-12-05 19:05:03

0

這傢伙似乎已經用他自己的問題和答案在How can I embed any file type into Microsoft Word using OpenXml 2.0

+2

他的解決方案仍然需要你安裝Word,這對於服務器端文檔生成以及我們在第一名。除此之外,在某些服務器配置上,您無法通過COM運行Word。 – 2010-07-30 07:56:21

+2

呃,你說得對,就在那裏。似乎沒有任何意義可以提供WordprocessingML中的所有內容,只是爲了使用interop來破壞它。 – 2010-07-30 14:40:40

相關問題