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.
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);
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);
}
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à.
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).
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();