【问题标题】:Stream into package, package into WordDocument and then back again流到包中,打包到 WordDocument 中,然后再返回
【发布时间】:2011-10-11 05:26:59
【问题描述】:

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

【问题讨论】:

  • Package.Open(str ...) 中的 str 是什么?那应该读我吗?这是您的实际代码还是您在粘贴之前对其进行了修改?
  • 我将它从 str 修改为 mem 以使其更具可读性。我猜那失败了:/我已经修好了。

标签: c# stream package openxml-sdk


【解决方案1】:

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

并且:是的,你应该打电话给document.Close()

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

【讨论】:

  • 好的,由于您尝试帮助我,我将授予您的答案正确答案。你的答案没有错,我的原始代码也没有。我有两层错误的异常处理,没有让我知道 someIrreleventData 部分实际上是空的,我完全没有注意到。在转向 SO 之前,我应该对它进行更好的调试。谢谢。
猜你喜欢
  • 2011-01-15
  • 2014-01-11
  • 1970-01-01
  • 2023-01-25
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多