Сохранить как использование 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();