Использование EPPlus с MemoryStream
Я использую EPPlus для создания файла XLSX на С#. Как только я создаю экземпляр ExcelPackage с потоком памяти, я получаю сообщение об ошибке:
"Ошибка записи диска во время операции записи. (Исключение из HRESULT: 0x8003001D (STG_E_WRITEFAULT))"
Код:
MemoryStream stream = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(stream))
{
...
}
Кто-нибудь еще видел это?
Ответы
Ответ 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.
Ответ 5
Вы можете создать ExcelPackage с пустым конструктором. Он будет обрабатывать свой собственный внутренний буфер.
http://epplus.codeplex.com/wikipage?title=WebapplicationExample