54 votes

Utiliser EPPlus avec un MemoryStream

J'utilise EPPlus pour générer un fichier XLSX en C#. Dès que j'instancier l'ExcelPackage avec un flux mémoire, j'obtiens l'erreur :

"Une erreur de disque s'est produite lors d'une opération d'écriture. (Exception de HRESULT : 0x8003001D (STG_E_WRITEFAULT))"

Le code est :

 MemoryStream stream = new MemoryStream();

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

Quelqu'un d'autre a-t-il vu cela?

82voto

Noah Heldman Points 2817

Aucune des autres réponses ne m'y a vraiment conduit (la feuille de calcul Excel était toujours vide), mais cela a fonctionné pour moi :

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

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

    var stream = new MemoryStream(package.GetAsByteArray());
}

27voto

Reigo Hein Points 343

Je sais que la question a été répondue des mois auparavant, mais voici comment je le fais pour toute référence future à quiconque essaie :

Dans VB.NET :

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

En C# :

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

Le code C# devrait être correct, pour autant que je sache. Et ExcelPackage a une prise en charge intégrée des flux.

14voto

Danny Points 87

Si vous souhaitez continuer à utiliser un flux (par exemple Response.OutputStream), vous pouvez créer un ExcelPackage avec un constructeur vide et utiliser la méthode SaveAs(Stream OutputStream ) .

9voto

Mike Goatly Points 1925

Il semble que vous rencontriez un bogue dans le gestionnaire d'erreurs du constructeur ExcelPackage. Si vous essayez de lui donner un flux vide, System.IO.Packaging.Package.Open lève une exception indiquant qu'un package ne peut pas être vide.

Ce code fonctionne, même si le fichier n'existe pas :

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

Étant donné que la documentation de la surcharge du constructeur indique que le flux est autorisé à être vide, je vous recommande de soulever ce problème dans l'outil de suivi des problèmes EPPlus.

1voto

Hamid Points 11

Vous pouvez créer un ExcelPackage avec un constructeur vide. Il gérera son propre tampon interne.

http://epplus.codeplex.com/wikipage?title=Exemple d'application Web

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X