使用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

相关文章
相关标签/搜索