NPOI экспортирует Excel напрямую во внешний интерфейс, не сохраняя его на сервере - PullRequest
0 голосов
/ 06 декабря 2018

Можно ли записать файл Excel (с NPOI) напрямую в браузер, не сохраняя его сначала на сервере.

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

public async Task<IActionResult> ExportExcel(){

    var fs = new MemoryStream();

    IWorkbook workbook;
    workbook = new XSSFWorkbook();
    ISheet excelSheet = workbook.CreateSheet("Test);

    IRow row = excelSheet.CreateRow(0);
    row.CreateCell(0).SetCellValue("ID");
    row.CreateCell(1).SetCellValue("Name");

    row = excelSheet.CreateRow(1);
    row.CreateCell(0).SetCellValue(1);
    row.CreateCell(1).SetCellValue("User 1");

    workbook.Write(fs);

    byte[] bytes = new byte[fs.Length];
    fs.Read(bytes, 0, (int)fs.Length);


    return File(bytes, "application/vnd.ms-excel", sampleType.Abbreviation+".xlsx"); 
}

При выполнении вышеупомянутого метода я всегда получаю следующую ошибку:

ObjectDisposedException: Cannot access a closed Stream.

...
System.IO.MemoryStream.get_Length()
byte[] bytes = new byte[fs.Length];
...

Или это еще один отличный пакет nuget для обработки (чтения и записи) файлов Excel без сохранения файлов на сервере?

PS: я использую пакет dotnet core 2.1 en nuget: https://www.nuget.org/packages/NPOI/

1 Ответ

0 голосов
/ 06 декабря 2018
  1. Пишите прямо в Response.Body.
  2. Поскольку Excel рассматривается как вложение, нам также необходимо установить Response.Headers

Чтобы упростить жизнь, мы можем сначала создать метод расширения:

public static class IWorkBookExtensions {

    public static void WriteExcelToResponse(this IWorkbook book, HttpContext httpContext, string templateName)
    {
        var response = httpContext.Response;
        response.ContentType = "application/vnd.ms-excel";
        if (!string.IsNullOrEmpty(templateName))
        {
            var contentDisposition = new Microsoft.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            contentDisposition.SetHttpFileName(templateName);
            response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();
        }
        book.Write(response.Body);
    }
}

и теперь мы можем экспортировать файл Excel напрямую:

public async Task ExportExcel(){

    IWorkbook workbook;
    workbook = new XSSFWorkbook();
    ISheet excelSheet = workbook.CreateSheet("Test");

    IRow row = excelSheet.CreateRow(0);
    row.CreateCell(0).SetCellValue("ID");
    row.CreateCell(1).SetCellValue("Name");

    row = excelSheet.CreateRow(1);
    row.CreateCell(0).SetCellValue(1);
    row.CreateCell(1).SetCellValue("User 1");

    workbook.WriteExcelToResponse(HttpContext,"test.xlsx");
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...