web-dev-qa-db-fra.com

Enregistrer sous EPPlus?

Est-ce que quelqu'un sait comment utiliser la fonction package.Saveas?

package.SaveAs(tempFolderPathAlt + saveas + ".xlsx");

Pour le moment, cela est souligné en rouge avec l'erreur suivante:

La meilleure méthode surchargée pour 'OfficeOpenXml.ExcelPackage.SaveAs (System.IO.Stream)' a un .__ invalide. arguments

En ce moment, je sauvegarde le fichier de la manière suivante.

FileStream aFile = new FileStream(tempFolderPathAlt + saveas + ".xls",    FileMode.Create);
byte[] byData = package.GetAsByteArray();
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byData, 0, byData.Length);
aFile.Close();

Mais de cette façon, le paquet reste ouvert et je ne peux pas travailler avec les fichiers qu’il a utilisés.

La sauvegarde en tant que fermera le paquet correctement, mais n'acceptera pas mon chemin de fichier.


Modifier

J'ai essayé ceci:

using (FileStream aFile = new FileStream(tempFolderPathAlt + saveas + ".xlsx", FileMode.Create))
{
    byte[] byData = package.GetAsByteArray();
    aFile.Seek(0, SeekOrigin.Begin);
    package.SaveAs(aFile);
    //aFile.Write(byData, 0, byData.Length);
    aFile.Close();
}

Mais obtenir l'erreur suivante?

L'objet de package a été fermé et éliminé. Il est donc impossible d'effectuer des opérations sur cet objet ou sur un flux ouvert sur une partie de ce package.

17
Pomster

Le paquet sera fermé et jeté une fois que vous aurez appelé l'une des fonctions GetAsByteArray, Save, SaveAs. C'est la raison pour laquelle tu as reçu un message 

L'objet du paquet a été fermé et éliminé. Vous ne pouvez donc pas effectuer d'opérations sur cet objet ni sur aucun flux ouvert sur une partie de ce paquet.

La solution consiste à appeler la fonction Load après la sauvegarde pour poursuivre le traitement sur un fichier Excel. Ou si vous voulez simplement obtenir les deux ByteArray et FileOutput, je suis sûr que chez vous, ils sont tous les deux identiques. 

Vous pouvez lire les données après avoir sauvegardé le fichier sur le disque:

string path = @"C:\test1.xlsx";
Stream stream = File.Create(path);
package.SaveAs(stream);
stream.Close();

byte[] data = File.ReadAllBytes(path);

Ou vous pouvez enregistrer des données sur le disque après avoir récupéré le ByteArray:

byte[] data = package.GetAsByteArray();

string path = @"C:\test1.xlsx";
File.WriteAllBytes(path, data);
25
Han

Je suis venu chercher la réponse à cette question mais les réponses existantes n'étaient pas claires pour moi… .. Voici ce que j'ai fait avec EPPlus et System.Windows.Forms:

ExcelPackage xlPackage = new ExcelPackage(xlsTmpFileName)

// Populate the Excel spreadsheet here.

SaveFileDialog sfd = new SaveFileDialog();
using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
{
    xlPackage.SaveAs(fs);
}
8
Maximus

Je ne sais pas à partir de quelle version mais la méthode SaveAs de EPPlus accepte une FileInfo. Donc, vous pourriez faire quelque chose comme ça: 

using (var app = new ExcelPackage(new FileInfo(inputPath)))
{
    //process
    app.SaveAs(new FileInfo(outputPath));
}

Contrairement à la méthode Save, la méthode SaveAs et le fichier écrasé} également dans le cas où le nom du fichier existe déjà.

1
nawfal

SaveAs accepterait votre aFile Stream.

Vous pouvez trouver ces informations vous-même en consultant la signature de la fonction: SaveAs(System.IO.Stream). Cela prend une Stream. Passer une string ne peut pas être compilé, vous devez donc créer une Stream utile (ce que vous avez fait).

0
usr

Débarrassez-vous de l'appel package.GetAsByteArray excédentaire et vous devriez le résoudre.

Je viens de courir: 

using (FileStream aFile = new FileStream(@"C:\Temp\asdf.xlsx", FileMode.Create))
{
    aFile.Seek(0, SeekOrigin.Begin);
    package.SaveAs(aFile);
    aFile.Close();
}

// See here - I can still work with the spread sheet.
var worksheet = package.Workbook.Worksheets.Single(); 
0
LosManos