Сохранить как использование EPPlus?
Кто-нибудь знает, как использовать функцию package.Saveas?
package.SaveAs(tempFolderPathAlt + saveas + ".xlsx");
В данный момент это подчеркивается красным цветом со следующей ошибкой:
Наилучшее перегруженное соответствие метода для 'OfficeOpenXml.ExcelPackage.SaveAs(System.IO.Stream)' имеет некоторые недопустимые Аргументы
В настоящий момент я сохраняю файл следующим образом.
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();
Но таким образом пакет остается открытым, и я не могу работать с файлами, которые он использовал.
Сохранить как будет закрывать пакет правильно, но не принимает мой путь к файлу.
Edit:
Я пробовал это:
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();
}
Но получите следующую ошибку?
Объект пакета был закрыт и удален, поэтому не может выполнять операции над этим объектом или любым потоком, открытым на части этого пакета.
Ответы
Ответ 1
Пакет будет закрыт и удален после вызова любых функций GetAsByteArray
, Save
, SaveAs
. Вот почему вы получили сообщение
Объект пакета был закрыт и удален, поэтому не может выполнять операции над этим объектом или любым потоком, открытым на части этого пакета.
Решение состоит в том, что после сохранения вы вызываете функцию Load
для продолжения обработки файла excel. Или, если вы просто хотите получить как ByteArray, так и FileOutput, я уверен, что вы оба одинаковы.
Вы можете читать данные после сохранения файла на диск:
string path = @"C:\test1.xlsx";
Stream stream = File.Create(path);
package.SaveAs(stream);
stream.Close();
byte[] data = File.ReadAllBytes(path);
Или вы можете сохранить данные на диск после получения ByteArray:
byte[] data = package.GetAsByteArray();
string path = @"C:\test1.xlsx";
File.WriteAllBytes(path, data);
Ответ 2
Я искал ответ на этот вопрос, но существующие ответы мне не были понятны.
Вот что я сделал с использованием EPPlus и 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);
}
Ответ 3
Я не знаю, из какой версии, но EPPlus SaveAs
метод принимает FileInfo
. Таким образом, вы можете сделать:
using (var app = new ExcelPackage(new FileInfo(inputPath)))
{
//process
app.SaveAs(new FileInfo(outputPath));
}
В отличие от метода Save
метод SaveAs
перезаписывает файл в случае, если имя файла файла уже существует.
Ответ 4
SaveAs
будет принимать ваш поток aFile
.
Вы можете сами найти такие вещи, посмотрев на подпись функции: SaveAs(System.IO.Stream)
. Требуется Stream
. Передача string
невозможно компилировать, поэтому вам нужно как-то создать полезный Stream
(который вы сделали).
Ответ 5
Избавьтесь от излишнего вызова package.GetAsByteArray
, и вы должны его решить.
Я только что побежал:
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();