C# 将ePlus与MemoryStream一起使用
我正在使用EPPlus在C#中生成一个XLSX文件。一旦我用内存流实例化ExcelPackage,我就会得到错误: “写入操作期间发生磁盘错误。(HRESULT异常:0x8003001D(STG_E_WriteDefault))” 代码是: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
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
类具有eFirstName
,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);