今天在写字处理评分程序的时候遇到一个以前没有经历过的场景:在给定的字处理素材文档文档中嵌入了另外一个字处理文档,题目要求既要对素材文档进行修改,也要对嵌入的文档进行格式调整。打开嵌入的文档对于操做者来讲很是容易,只需双击嵌入文档的图标就能够了。可是,对于程序来讲就不是那么好办了。以前都是使用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