流入包,打包到WordDocument然后再返回

时间:2011-07-22 16:55:24

标签: c# stream package openxml-sdk

我不了解Streams周围的所有机制,更不了解System.IO.Package类的所有机制。

我在DataBase中有一个.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);
}

库代码如下所示:

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方法中的代码都没有正确处理异常。

1 个答案:

答案 0 :(得分:4)

在尝试将其保存到文件之前,我看不到您在包裹上调用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

AND:是的,你应该致电document.Close()

调用.Dispose()是一个好主意,但如果你使用using块来处理这个以及其他一些事情会更好......