c# – 流入包,打包到WordDocument然后再返回
发布时间:2020-12-15 07:58:17 所属栏目:百科 来源:网络整理
导读:我不了解Streams周围的所有机制,甚至不了解System.IO.Package类. 我有一个.docx文件作为数据库中的二进制文件,我不想获取它,稍微修改然后保存它. 我目前有一个方法,在一个单独的库中修改文档,因为它将在许多地方使用. 这就是我尝试这样做的方式: byte[] doc
我不了解Streams周围的所有机制,甚至不了解System.IO.Package类.
我有一个.docx文件作为数据库中的二进制文件,我不想获取它,稍微修改然后保存它. 我目前有一个方法,在一个单独的库中修改文档,因为它将在许多地方使用. 这就是我尝试这样做的方式: byte[] doc = getDocFromDB(); using (MemoryStream mem = new MemoryStream()) { mem.Write(doc,doc.Length); Package pack = Package.Open(mem,FileMode.Open,FileAccess.ReadWrite); filler.FillTemplate(ref pack,someIrreleventData); string filePath = Path.GetTempPath() + "docname.docx"; using (FileStream file = new FileStream(filePath,FileMode.Create)) { mem.WriteTo(file); file.Flush(); file.Close(); } Process.Start(filePath); } 库代码如下: public void FillTemplate(ref Package package,XElement data) { WordprocessingDocument document = WordprocessingDocument.Open(package); //add the data to the document //should I do document.close() or document.dispose() here? } 该文档就像它保存到数据库中一样,没有添加所有额外数据. 我假设我打开包含内存流的包,所有对包的更改也会保存到流中. 我做错了什么,怎样才能做得更好. 编辑 我错了,我的代码没有任何损坏.问题是someIrreleventData部分为null,并且那里的fetcher和FillTemplate方法中的代码都没有正确处理异常. 解决方法
在尝试将其保存到文件之前,我没有看到任何在包上调用Flush()和/或Close()的地方……
尝试改变 mem.Write(doc,doc.Length); mem.Position = 0; // new,perhaps this is relevant for Package.Open ? Package pack = Package.Open(mem,FileAccess.ReadWrite); filler.FillTemplate(ref pack,someIrreleventData); pack.Flush(); pack.Close(); // new mem.Position = 0; // new AND:是的,你应该调用document.Close(). 调用.Dispose()是一个好主意虽然如果你使用块来处理它和其他一些事情会更好… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |