c# - 流式传输到包中,打包到 WordDocument 中,然后再返回

标签 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);
}

库代码是这样的:

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 部分为空,那里的提取器和 FillTemplate 方法中的代码都没有正确处理异常。

最佳答案

在尝试将包保存到文件之前,我没有看到您在包上调用 Flush() 和/或 Close() 的任何地方...< br/> 尝试改变

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

并且:是的,您应该调用 document.Close()

调用 .Dispose() 是一个好主意,但如果您使用 as using block 会更好,它会处理这个和其他几件事......

关于c# - 流式传输到包中,打包到 WordDocument 中,然后再返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793414/

相关文章:

dart - 库写入更多文件

C# 测试 null

c# - 当从不同的窗口调用 repository.save 时,mvvm 更新 ListView

c# - 寻找在调试器中获取对象实例的方法的工具?

c++ - 关于使用iostream进行解析的准则是什么?

c# - StreamReader 返回 null

python - 使用 doxygen 记录 Python 包

c# - C# 和 VB.NET 中的即时窗口行为差异

view - Flutter:bloc,如何显示警报对话框

prolog - 将 aleph 与 SWI-prolog : source_sink `library(aleph)' does not exist 一起使用