C# 将ePlus与MemoryStream一起使用

C# 将ePlus与MemoryStream一起使用,c#,excel,epplus,C#,Excel,Epplus,我正在使用EPPlus在C#中生成一个XLSX文件。一旦我用内存流实例化ExcelPackage,我就会得到错误: “写入操作期间发生磁盘错误。(HRESULT异常:0x8003001D(STG_E_WriteDefault))” 代码是: MemoryStream stream = new MemoryStream(); using (ExcelPackage package = new ExcelPackage(stream)) { ... } 还有其他人看到过吗?看起来您在Ex

我正在使用EPPlus在C#中生成一个XLSX文件。一旦我用内存流实例化ExcelPackage,我就会得到错误:

“写入操作期间发生磁盘错误。(HRESULT异常:0x8003001D(STG_E_WriteDefault))”

代码是:

MemoryStream stream = new MemoryStream();

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

还有其他人看到过吗?

看起来您在ExcelPackage构造函数的错误处理程序中遇到了错误。如果尝试为其提供一个空流,
System.IO.Packaging.Package.Open
将引发一个异常指示,表明包不能为空

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

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

鉴于构造函数重载的文档表明允许流为空,我建议在EPPlus问题跟踪程序中提出此问题。

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


如果您想继续使用流(例如Response.OutputStream),您可以创建一个带有空构造函数的ExcelPackage,并使用SaveAs(stream OutputStream)方法。

我知道这个问题在几个月前已经得到了回答,但我是这样做的,以供以后尝试的人参考:

在VB.NET中:

Dim stream As New MemoryStream
Using package As New ExcelPackage(stream)
    'Here goes the ExcelPackage code etc 
    package.Save()
End Using
在C#中:


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

其他答案都没有让我达到目的(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());
}

当我试图打开现有的excel文件并花了几天时间处理它时,我也遇到了同样的问题。 在我的例子中,由于加密,我收到了提到的异常“写入操作期间发生磁盘错误。(来自HRESULT的异常:0x8003001D(STG_E_WriteDefault))”

我可以通过传递密码来读取.xlsx文件就我而言,空字符串“”就足够了。

在您的情况下,请尝试使用带密码的构造函数初始化包:

public ExcelPackage(Stream newStream, string Password)

package = new ExcelPackage(stream, "");
查看ExcelPackage源代码

有一种方法

private void Load(Stream input, Stream output, string Password) 
用于加载excel文件

private void Load(Stream input, Stream output, string Password) 

即使密码为空,但不为NULL,代码也将尝试解密excel流

但是,如果尝试为未加密的文件初始化包,则会出现异常:


“该流不是有效的/受支持的加密文档。”

我正在处理相同的错误,但其他答案都没有提供任何帮助

最后,在尝试打开文件之前添加此代码后,问题得到了解决:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
似乎根本原因是由于缺少代码页,EPPlus无法打开ZIP。
这要感谢我。

在将使用4.1.1版EPPlus的代码转换为4.5.1版时,我们遇到了类似的问题

最初,我们使用以下模式:

使用(var ms=new MemoryStream())
{
新建ExcelBuilder().BuildResultFile(结果,毫秒);

ms.Position=0;//但是,该问题的答案为+1,因为这看起来可能是一个有用的库:)强烈建议:(第一个答案-请参阅注释)可能是库出错,现在可以使用:)我是如何做到的。如果您在通过MemoryStream打开现有Excel文件时遇到此错误(从数据库或其他地方),这可能意味着您的Excel文件无效(在我的例子中,我打开的是一个随机XML文件,而不是XLSX),因此您必须先创建一个文件,然后才能读取流或填充“ExcelPackage”?你知道为什么或者这只是一个错误吗?你的
数据包含什么?工作表?CSV文件?工作簿?这个答案缺少关键信息。
LoadFromCollection
过载,但带有一个参数的版本采用
IEnumerable
,泛型类型表示将要加载的Excel列aded,IEnumerable的每个成员都变成一个Excel行。官方CodePlex网站出现问题,将被关闭,但下面是一个文件的示例,该文件实现了
LoadFromCollection
:。在我的例子中,
data
是一个
IEnumerable
,其中
Person
类具有e
FirstName
LastName
,和
Email
。谢谢你,伙计!!!有同样的空白excel问题,你不需要使用带密码的构造函数来写入流。库本身在过去6年中发生了很大变化。当时它使用不同的库进行压缩我不修改excel文件,只读取g、 在我的例子中,异常消息是误导性的。它没有说明任何关于加密的内容。我使用最新版本的EPPlus库v4.1.1。并且使用密码加载文件,甚至是空密码,修复了我的问题:使用(var package=new ExcelPackage()){using(var stream=file.OpenRead(excelFilePath)){package.Load(stream,”;}
if (Password != null)

{
  Stream encrStream = new MemoryStream();
  CopyStream(input, ref encrStream);
  EncryptedPackageHandler eph = new EncryptedPackageHandler();
  Encryption.Password = Password;
  ms = eph.DecryptPackage((MemoryStream)encrStream, Encryption);
}
else
{
  ms = new MemoryStream();
  CopyStream(input, ref ms);
 }
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);