将EPPlus与MemoryStream一起使用

dan*_*dan 44 c# excel epplus

我正在使用EPPlus在C#中生成XLSX文件.一旦我用内存流实例化ExcelPackage - 我收到错误:

"写操作期间发生磁盘错误.(HRESULT异常:0x8003001D(STG_E_WRITEFAULT))"

代码是:

MemoryStream stream = new MemoryStream();

using (ExcelPackage package = new ExcelPackage(stream))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有人见过这个?

Noa*_*man 63

没有其他答案让我在那里(Excel工作表总是空的),但这对我有用:

using (var package = new ExcelPackage())
{
    var worksheet = package.Workbook.Worksheets.Add("Worksheet Name");

    worksheet.Cells["A1"].LoadFromCollection(data);

    var stream = new MemoryStream(package.GetAsByteArray());
}
Run Code Online (Sandbox Code Playgroud)

  • 你的`数据'包含什么?一张工作表?一个CSV文件?一本练习册?这个答案缺乏关键信息. (7认同)
  • `LoadFromCollection` 已重载,但带有一个参数的版本采用一个 `IEnumerable<T>`,其泛型类型表示将被加载的 Excel 列,并且 IEnumerable 的每个成员成为一个 Excel 行。官方 CodePlex 站点有问题,将被关闭,但以下是具有 `LoadFromCollection` 实现的文件示例:https://github.com/pruiz/EPPlus/blob/master/EPPlus/ExcelRangeBase。 CS。在我的例子中,`data` 是一个 `IEnumerable<Person>`,其中 `Person` 类具有 `FirstName`、`LastName` 和 `Email` 等属性。 (2认同)

Rei*_*ein 19

我知道这个问题已在几个月前得到解答,但这是我今后如何参考任何人尝试的方法:

在VB.NET中:

Dim stream As New MemoryStream
Using package As New ExcelPackage(stream)
    'Here goes the ExcelPackage code etc 
    package.Save()
End Using
Run Code Online (Sandbox Code Playgroud)

在C#中:

MemoryStream stream = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(stream))
{
    //Here goes the ExcelPackage code etc
    package.Save()
}
Run Code Online (Sandbox Code Playgroud)

据我所知,C#代码应该是正确的.ExcelPackage内置了对流的支持.


Dan*_*nny 14

如果要继续使用流(例如Response.OutputStream),可以使用空构造函数创建ExcelPackage并使用SaveAs(Stream OutputStream)方法.


Mik*_*tly 9

看起来你正在点击ExcelPackage构造函数的错误处理程序中的错误.如果您尝试将其System.IO.Packaging.Package.Open设为空流,则会引发一个异常指示,指出包不能为空.

即使该文件不存在,此代码也可以工作:

var file = new FileInfo("test.xlsx");
using (ExcelPackage package = new ExcelPackage(file))
{
}
Run Code Online (Sandbox Code Playgroud)

鉴于构造函数重载的文档指示允许流为空,我建议在EPPlus问题跟踪器中提出此问题.