c# - open - Usando EPPlus con un MemoryStream
open excel file in memory c# (8)
Estoy usando EPPlus para generar un archivo XLSX en C #. Tan pronto como instalo ExcelPackage con una secuencia de memoria, obtengo el error:
"Se produjo un error de disco durante una operación de escritura. (Excepción de HRESULT: 0x8003001D (STG_E_WRITEFAULT))"
El código es:
MemoryStream stream = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(stream))
{
...
}
¿Alguien más ha visto esto?
Estaba lidiando con el mismo error, pero ninguna de las otras respuestas me brindó ninguna ayuda.
Al final, el problema se resolvió después de agregar este código antes de intentar abrir el archivo:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Parece que la causa principal fue que EPPlus no pudo abrir el ZIP debido a una página de códigos faltante. Lo hice funcionar gracias a esta respuesta de .
Me enfrenté al mismo problema cuando intenté abrir un archivo existente de Excel y pasé un par de días con él. En mi caso recibí la excepción mencionada "Se produjo un error de disco durante una operación de escritura. (Excepción de HRESULT: 0x8003001D (STG_E_WRITEFAULT))" debido a la encriptación.
Pude leer el archivo .xlsx al pasar la contraseña. En mi caso, la cadena vacía "" fue suficiente.
en su caso, intente inicializar el paquete utilizando constructor con contraseña:
public ExcelPackage(Stream newStream, string Password)
package = new ExcelPackage(stream, "");
Eche un vistazo al código fuente de ExcelPackage http://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelPackage.cs
Hay un método
private void Load(Stream input, Stream output, string Password)
que se utiliza para cargar el archivo de Excel.
private void Load(Stream input, Stream output, string Password)
...
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);
}
...
El código intentará descifrar la secuencia de Excel incluso si la contraseña está vacía, PERO NO NULO.
Sin embargo, si intentas inicializar el paquete para el archivo que no está encriptado, tendrás una excepción:
''La transmisión no es un documento cifrado válido / compatible''.
Ninguna de las otras respuestas me llevó hasta allí (la hoja de cálculo de Excel siempre estaba vacía), pero esto funcionó para mí:
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("Worksheet Name");
worksheet.Cells["A1"].LoadFromCollection(data);
var stream = new MemoryStream(package.GetAsByteArray());
}
Parece que estás acertando un error en el manejador de errores del constructor ExcelPackage. Si intenta y le da una secuencia vacía, System.IO.Packaging.Package.Open
genera una indicación de excepción de que un paquete no puede estar vacío.
Este código funciona, incluso si el archivo no existe:
var file = new FileInfo("test.xlsx");
using (ExcelPackage package = new ExcelPackage(file))
{
}
Dado que la documentación de la sobrecarga del constructor indica que la transmisión puede estar vacía, recomiendo plantear este problema en el rastreador de problemas EPPlus.
Puede crear un ExcelPackage con un constructor vacío. Manejará su propio buffer interno.
http://epplus.codeplex.com/wikipage?title=WebapplicationExample
Sé que la pregunta fue respondida meses antes, pero así es como lo hago para futuras referencias a cualquiera que intente:
En 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()
}
El código de C # debería ser correcto, hasta donde yo sé. Y ExcelPackage tiene soporte integrado para transmisiones.
Si desea continuar usando una secuencia (por ejemplo, Response.OutputStream) , puede crear un ExcelPackage con un constructor vacío y usar el método SaveAs (Stream OutputStream ) .
Tuvimos un problema similar al convertir código que usaba la versión 4.1.1 de EPPlus a la versión 4.5.1.
Originalmente, estábamos usando el siguiente patrón:
using (var ms = new MemoryStream())
{
new ExcelBuilder().BuildResultFile(result, ms);
ms.Position = 0; // <-- Cannot access a closed Stream error thrown here
// Send Excel file to Azure storage
}
Y nuestra clase ExcelBuilder, función BuildResultFile:
public void BuildResultFile(List<ResultSet> resultSets, Stream stream)
{
using (var package = new ExcelPackage(stream))
{
// Create Excel file from resultSets
package.Save();
}
}
Para hacer que esto funcione con 4.5.1, tuvimos que eliminar el uso del bloque de la función BuildResultFile
.
Parece que no puedo encontrar ninguna documentación en GitHub sin / por qué esto cambió o si incluso estoy implementando esto correctamente.