NPOI, создающий Excel с SXSSFWorkbook - ошибка при открытии - PullRequest
0 голосов
/ 14 декабря 2018

Я просто хочу передать файл xlsx методом NPOI SXSSF.Но при загрузке потокового файла Excel в открывшемся окне появляется сообщение:

Excel обнаружил нечитаемый контент в «MyExcelFile.xlsx».Вы хотите восстановить содержимое рабочей книги?Если вы доверяете источнику этой книги, нажмите Да.

Мой код:

Response.Headers.Add("Content-disposition", "attachment; filename=\"MyExce.xlsx\"");
Response.Headers.Add("Content-type", "octet-stream");


SXSSFWorkbook wb = new SXSSFWorkbook();
SXSSFSheet sheet = (SXSSFSheet)wb.CreateSheet("FirstSheet");

IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);
cell.SetCellValue("firstCell");

//Write file to output stream
wb.Write(Response.Body);
wb.Close();
Response.Body.Flush();

Что я делаю не так?

1 Ответ

0 голосов
/ 17 декабря 2018

Для wb.Write(Response.Body) он удалит поток после того, как wb.Write и Response.Body будут прерваны.

Попробуйте код ниже, чтобы сохранить поток и записать сохраненный поток в тело.

public void DownloadFile()
{
    MemoryStream ms = new MemoryStream();
    using (MemoryStream stream = new MemoryStream())
    {
        Response.Headers.Add("Content-disposition", "attachment; filename=\"MyExce.xlsx\"");
        Response.Headers.Add("Content-type", "octet-stream");

        SXSSFWorkbook wb = new SXSSFWorkbook();
        SXSSFSheet sheet = (SXSSFSheet)wb.CreateSheet("FirstSheet");

        IRow row = sheet.CreateRow(0);
        ICell cell = row.CreateCell(0);
        cell.SetCellValue("firstCell");

        //Write file to output stream
        wb.Write(stream);
        var byteArray = stream.ToArray();
        ms.Write(byteArray, 0, byteArray.Length);
        ms.Seek(0, SeekOrigin.Begin);
        ms.WriteTo(Response.Body);
    }
}
...