使用OpenXml打開word文檔中嵌入的另外一個文檔

        今天在寫字處理評分程序的時候遇到一個以前沒有經歷過的場景:在給定的字處理素材文檔文檔中嵌入了另外一個字處理文檔,題目要求既要對素材文檔進行修改,也要對嵌入的文檔進行格式調整。打開嵌入的文檔對於操做者來講很是容易,只需雙擊嵌入文檔的圖標就能夠了。可是,對於程序來講就不是那麼好辦了。以前都是使用OpenXml的Packaging命名空間下的WordprocessingDocument類來直接open須要檢查的文檔。方式是將文檔的路徑當作參數傳入Open函數,這裏的路徑是物理路徑,能夠是相對路徑也可使絕對路徑。可是如今這個文檔不存在於物理介質中,而是嵌入在另外一個文檔中,怎麼打開?函數

       一開始思考的解決方式是,將嵌入文檔的內容讀取出來,而後寫入到一個新文件中。新文件保存在當前路徑下,而後再使用WordprocessingDocument類的Open方法來打開。可是試了很長時間也得不到想要的結果。多是我對文件和流操做這塊概念比較混亂,感受代碼邏輯很凌亂。後來偶爾發現Open方法的重載版本里有一個是基於流的方式來打開文件的,呵呵,真是踏破鐵鞋無覓處,得來全不費功夫。首先,嵌入的文檔是一個EmbeddedPackagePart對象,該對象有個GetStream方法。如今只需把GetStream方法返回的流傳入WordprocessingDocument類的Open方法便可打開對應的文檔並得到一個WordprocessingDocument對象的引用,利用這個引用就能夠對這個嵌入的文檔進行各類操做了,局部代碼以下:spa

 1 using(WordprocessingDocument wd = WordprocessingDocument.Open(path, false))
 2 {
 3     MainDocumentPart mdp = wd.MainDocumentPart;
 4     EmbeddedPackagePart epp = mdp.EmbeddedPackageParts.FirstOrDefault();
 5 
 6     WordprocessingDocument embedDoc = WordprocessingDocument.Open(epp.GetStream(),false);
 7    ......       
 8     embedDoc.SaveAs("hehe.docx");
 9 
10 }

        首先打開主文檔,而後在主文檔中獲取嵌入文檔的對象引用,這裏是一個 EmbeddedPackagePart對象。而後調用GetStream()方法獲取對應的流,傳入WordprocessingDocument.Open方法便可打開對應的嵌入文檔。最後能夠調用SaveAs把這個嵌入文檔另存爲以一個單獨的文件保存。code

 

後記:對象

       看完整個題目要求才發現,最終會要求考生將嵌入的文檔另存爲一個單獨命名的文檔!好吧,白瞎了。blog

相關文章
相關標籤/搜索