ClosedXml 无法访问已关闭的流。

3

当我尝试将ClosedXML Workbook(XLWorkbook)保存到内存流中时,出现“无法访问已关闭的流”的错误。

    public byte[] GetStream()
    {
        using (var stream = new MemoryStream())
        {
            Workbook.SaveAs(stream);

            return stream.ToArray();
        }
    }

据我所理解,由于在访问保存方法之前刚创建了流,因此 ClosedXml 库存在问题。

你是怎么创建那个工作簿的?从文件还是从流中创建的,还是从头开始创建的? - rene
我正在从流(模板Excel文件)中创建它。我尝试从头开始创建一个,但它生成了一个格式不正确的Excel文件。 - Andrei Ivascu
如果它是从流创建的,我希望您的代码采用 此else,这使我相信您的原始流应该可用,即未被释放。 - rene
@rene 您是正确的。看来处理原始流是问题所在。奇怪的是,工作簿没有对流进行深度复制(也许是为了节省内存空间?)。然而,xlsx 仍然损坏,似乎与此问题有关问题。您能否写一个答案,以便我可以将其标记为正确答案? - Andrei Ivascu
1个回答

3

这取决于你创建工作簿的方式。如果是从流创建的,它将在保存操作期间访问原始流。

因此,异常不是由你在save方法中提供的内存流引起的,而是原始流是罪魁祸首。确保在完成想要在工作簿上执行的所有操作之前,保留该流。


实际上,处理原始流似乎是问题所在,因为Workbook保留了对原始流的引用。 - Andrei Ivascu
如果我使用byte[]创建了工作簿,那我在这种情况下就没有流对象。 - Nick Farsi
@NickFarsi 任何 byte[] 实例都可以传入 MemoryStream 的构造函数,例如 new MemoryStream(byteArray);。但是请注意,如果您想将数据保存回同一流中,则使用该构造函数时无法扩展流的大小。 - rene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接