流到包中,包到WordDocument中,然后再返回



我不太了解流的所有机制,更不用说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);
}

库代码是这样的:

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?
}

文档就像它被保存到数据库中一样出来,没有添加任何额外的数据。

我假设当我用内存流打开包时,对包的所有更改也将保存到流中。

我做错了什么,我怎样才能做得更好。

编辑

我错了,我的代码没有任何问题。问题是someinrelentdata部分为空,那里的获取器和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

AND:是的,你应该调用document.Close()

调用.Dispose()是一个好主意,虽然它甚至会更好,如果你使用作为using块,照顾那和其他一些事情…

相关内容

最新更新