Utilisation D'EPPlus avec un flux de mémoire

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

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

le Code est:

MemoryStream stream = new MemoryStream();

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

quelqu'un d'autre A vu cela?

38
demandé sur Pure.Krome 2011-04-21 04:20:14

8 réponses

aucune des autres réponses ne m'a vraiment amené là (la feuille de travail 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());
}
54
répondu Noah Heldman 2014-09-25 15:56:14

je sais que la question a été répondue des mois avant, mais c'est comme ça que je le fais pour 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 doit être correct, autant que je sache. Et L'ExcelPackage a intégré un support pour les flux.

15
répondu Reigo Hein 2015-09-23 09:19:35

Si vous souhaitez continuer à utiliser un flux (par exemple, Réponse.OutputStream) vous pouvez créer un ExcelPackage avec un constructeur vide et utiliser le Enregistrer Sous(Stream OutputStream) méthode.

11
répondu Danny 2011-06-23 21:46:32

on dirait que vous touchez un bug dans le gestionnaire d'erreurs du constructeur ExcelPackage. Si vous essayez et donnez-lui un vide stream, System.IO.Packaging.Package.Open soulève une exception indiquant qu'un paquet 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 pour la surcharge du constructeur indique que le flux est autorisé à être vide, je recommande de soulever cette question dans le traqueur de problèmes D'EPPlus.

9
répondu Mike Goatly 2011-04-21 13:13:57

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

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

1
répondu Hamid 2011-05-19 18:14:27

je faisais face à la même erreur, mais aucune des autres réponses n'a fourni d'aide.

a la fin, le problème a été résolu après avoir ajouté ce code avant d'essayer d'ouvrir le fichier:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

il semble que la cause fondamentale était Qu'EPPlus ne pouvait pas ouvrir le ZIP à cause d'une page de code manquante. J'ai eu ce travail merci à c'StackOverflow réponse.

0
répondu Kristof Verbiest 2018-02-20 15:43:58

nous avons eu un problème similaire lors de la conversion du code qui utilisait la version 4.1.1 D'EPPlus à la version 4.5.1.

à l'origine, nous utilisions le modèle suivant:

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
}

et notre classe ExcelBuilder, la fonction BuildResultFile:

public void BuildResultFile(List<ResultSet> resultSets, Stream stream)
{
    using (var package = new ExcelPackage(stream))
    {
        // Create Excel file from resultSets
        package.Save();
    }
}

pour que cela fonctionne avec 4.5.1 nous avons dû supprimer l'utilisation du bloc de BuildResultFile fonction.

Je n'arrive pas à trouver de documentation sur in GitHub w/r/t pourquoi cela a changé ou si je suis même implémenter ceci correctement.

0
répondu Electric_Wizard 2018-03-30 15:19:16

j'ai fait face à la même question quand essayé d'ouvrir le fichier excel existant et a passé quelques jours avec elle. Dans mon cas, j'ai reçu mentionné exception "une erreur de disque s'est produite pendant une opération d'écriture. (Exception de HRESULT: 0x8003001D (STG_E_WRITEFAULT)) " due to encryption.

j'ai pu lire .fichier xlsx en passant le mot de passe. Dans mon cas, la chaîne vide "" est assez.

dans votre cas veuillez essayer d'initialiser le paquet en utilisant le constructeur avec mot de passe:

public ExcelPackage(Stream newStream, string Password)

package = new ExcelPackage(stream, "");

regarder dans ExcelPackage code source http://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelPackage.cs

Il y a une méthode

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

qui est utilisé pour charger le fichier 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);
 }

...

le Code essaiera de décrypter excel stream même si password est vide, mais pas NULL.

Toutefois, si vous essayez d'initialiser le package de fichier non cryptés, vous aurez exception:

'Le flux n'est pas valide soutenu, document chiffré.'

-1
répondu Artem 2018-01-26 12:04:53