it-swarm.com.de

Speichern als mit EPPlus?

Kann jemand die package.Saveas-Funktion verwenden?

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

Im Moment ist dies mit dem folgenden Fehler rot unterstrichen:

Die beste überladene Methode für 'OfficeOpenXml.ExcelPackage.SaveAs (System.IO.Stream)' hat einige ungültige Argumente

Im Moment speichere ich die Datei auf folgende Weise.

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();

Auf diese Weise bleibt das Paket jedoch offen und ich kann nicht mit den von ihm verwendeten Dateien arbeiten.

Beim Speichern unter wird das Paket ordnungsgemäß geschlossen, jedoch wird der Dateipfad nicht akzeptiert.


Bearbeiten

Ich habe das versucht:

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

Aber bekomme den folgenden Fehler?

Das Paketobjekt wurde geschlossen und verworfen. Daher können keine Operationen an diesem Objekt oder an einem Teil dieses Pakets geöffneten Stream ausgeführt werden.

17
Pomster

Nach dem Aufruf einer der Funktionen GetAsByteArray, Save, SaveAs wird das Paket geschlossen und entsorgt. Das ist der Grund, warum Sie eine Nachricht erhalten haben 

Package-Objekt wurde geschlossen und verworfen, daher können keine Operationen an diesem Objekt oder an einem Stream ausgeführt werden, der an einem Teil dieses Pakets geöffnet wurde.

Die Lösung besteht darin, dass Sie nach dem Speichern die Funktion Load aufrufen, um die Verarbeitung der Excel-Datei fortzusetzen. Oder wenn Sie nur ByteArray und FileOutput erhalten möchten, sind Sie sich sicher, dass beide identisch sind. 

Sie können Daten lesen, nachdem Sie die Datei auf der Festplatte gespeichert haben:

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

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

Oder Sie können Daten auf Festplatte speichern, nachdem Sie das ByteArray abgerufen haben:

byte[] data = package.GetAsByteArray();

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

Ich bin auf der Suche nach der Antwort darauf gekommen, aber die vorhandenen Antworten waren mir nicht klar .. Hier habe ich EPPlus und System.Windows.Forms verwendet:

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

Ich weiß nicht, von welcher Version an, aber die SaveAs-Methode von EPPlus akzeptiert eine FileInfo. So könnte man so etwas machen: 

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

Anders als die Save-Methode SaveAs-Methode überschreibt file auch, falls der Dateiname bereits existiert.

1
nawfal

SaveAs würde Ihren aFile-Stream akzeptieren.

Sie können solche Dinge selbst herausfinden, indem Sie die Funktionssignatur betrachten: SaveAs(System.IO.Stream). Es braucht eine Stream. Das Übergeben einer string-Datei kann möglicherweise nicht kompiliert werden. Sie müssen also eine nützliche Stream-Komponente erstellen (was Sie getan haben).

0
usr

Beseitigen Sie den Überschuss package.GetAsByteArray und Sie sollten ihn lösen.

Ich bin gerade gelaufen: 

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