Подтвердить что ты не робот

Использование EPPlus с MemoryStream

Я использую EPPlus для создания файла XLSX на С#. Как только я создаю экземпляр ExcelPackage с потоком памяти, я получаю сообщение об ошибке:

"Ошибка записи диска во время операции записи. (Исключение из HRESULT: 0x8003001D (STG_E_WRITEFAULT))"

Код:

MemoryStream stream = new MemoryStream();

using (ExcelPackage package = new ExcelPackage(stream))
{
    ...
}

Кто-нибудь еще видел это?

4b9b3361

Ответ 1

Ни один из ответов не получил меня (лист Excel всегда был пустым), но это сработало для меня:

using (var package = new ExcelPackage())
{
    var worksheet = package.Workbook.Worksheets.Add("Worksheet Name");

    worksheet.Cells["A1"].LoadFromCollection(data);

    var stream = new MemoryStream(package.GetAsByteArray());
}

Ответ 2

Я знаю, что вопрос был отвечен несколько месяцев назад, но я так делаю это для будущей ссылки на всех, кто пытается:

В VB.NET:

Dim stream As New MemoryStream
Using package As New ExcelPackage(stream)
    'Here goes the ExcelPackage code etc 
    package.Save()
End Using

В С#:

MemoryStream stream = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(stream))
{
    //Here goes the ExcelPackage code etc
    package.Save()
}

Код С# должен быть правильным, насколько я знаю. И ExcelPackage имеет встроенную поддержку потоков.

Ответ 3

Если вы хотите продолжить использование потока (например, Response.OutputStream), вы можете создать ExcelPackage с пустым конструктором и использовать метод SaveAs (Stream OutputStream).

Ответ 4

Похоже, вы попадаете в ошибку в обработчике ошибок конструктора ExcelPackage. Если вы попытаетесь передать пустой поток, System.IO.Packaging.Package.Open вызывает указание исключения, что пакет не может быть пустым.

Этот код работает, даже если файл не существует:

var file = new FileInfo("test.xlsx");
using (ExcelPackage package = new ExcelPackage(file))
{
}

Учитывая, что документация для перегрузки конструктора указывает, что потоку разрешено быть пустым, я бы рекомендовал поднимать эту проблему в треевом выпуске EPPlus.