Ing*_*als 7 c# stream package openxml-sdk
我不了解Streams周围的所有机制,甚至不太了解System.IO.Package全班.
我有一个.docx文件作为数据库中的二进制文件,我不想获取它,稍微修改然后保存它.
我目前有一个在单独的库中修改文档的方法,因为它将在许多地方使用.
这就是我尝试这样做的方式:
byte[] doc = getDocFromDB();
using (MemoryStream mem = new MemoryStream())
{
mem.Write(doc, 0, 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);
}
Run Code Online (Sandbox Code Playgroud)
库代码如下所示:
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?
}
Run Code Online (Sandbox Code Playgroud)
该文档就像它保存到数据库中一样,没有添加所有额外数据.
我假设我打开包含内存流的包,所有对包的更改也将保存到流中.
我做错了什么,怎样才能做得更好.
编辑
我错了,我的代码没有任何损坏.问题是someIrreleventData部分为null,并且那里的fetcher和FillTemplate方法中的代码都没有正确处理异常.
在尝试将其保存到文件之前,我没有看到您调用Flush()和/或Close()在包上的任何位置...
尝试更改
mem.Write(doc, 0, doc.Length);
mem.Position = 0; // new, perhaps this is relevant for Package.Open ?
Package pack = Package.Open(mem, FileMode.Open, FileAccess.ReadWrite);
filler.FillTemplate(ref pack, someIrreleventData);
pack.Flush(); pack.Close(); // new
mem.Position = 0; // new
Run Code Online (Sandbox Code Playgroud)
并且:是的,你应该打电话document.Close()。
调用是一个好主意,但如果你使用 as block 来处理这个问题和其他一些事情,.Dispose()那就更好了......using
| 归档时间: |
|
| 查看次数: |
1404 次 |
| 最近记录: |