使用带有MemoryStream的EPPlus

我正在使用EPPlus在C#中生成一个XLSX文件。 只要我用一个内存stream实例化ExcelPackage – 我得到的错误:

“在写入操作期间发生磁盘错误(从HRESULTexception:0x8003001D(STG_E_WRITEFAULT))”

代码是:

MemoryStream stream = new MemoryStream(); using (ExcelPackage package = new ExcelPackage(stream)) { ... } 

有没有人看过这个?

没有其他的答案让我在那里(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()); } 

我知道这个问题是在几个月前回答的,但这是我如何做的,以供将来参考任何尝试的人:

在VB.NET中:

 Dim stream As New MemoryStream Using package As New ExcelPackage(stream) 'Here goes the ExcelPackage code etc package.Save() End Using 

在C#中:

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

就我所知,C#代码应该是正确的。 ExcelPackage内置了对stream的支持。

如果你想继续使用一个stream(比如Response.OutputStream),你可以使用一个空的构造函数创build一个ExcelPackage,并使用SaveAs(Stream OutputStream方法。

它看起来像是在ExcelPackage构造函数的error handling程序中遇到错误。 如果您尝试给它一个空的stream, System.IO.Packaging.Package.Open引发一个exception指示,指出一个包不能为空。

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

 var file = new FileInfo("test.xlsx"); using (ExcelPackage package = new ExcelPackage(file)) { } 

考虑到构造函数重载的文档表明该stream允许为空,我build议在EPPlus问题跟踪器中提出这个问题。

您可以使用空的构造函数创build一个ExcelPackage。 它将处理自己的内部缓冲区。

http://epplus.codeplex.com/wikipage?title=WebapplicationExample