Сгенерировать таблицу экспорта Excel с использованием EPPlus.Core

#c# #excel #asp.net-core #export

#c# #excel #asp.net-core #экспорт

Вопрос:

Я хочу создать сервис, который будет генерировать таблицу Excel из моей хранимой процедуры. Я ищуhttps://www.talkingdotnet.com/import-export-excel-asp-net-core-2-razor-pages / где это работает непосредственно для страницы razor, но мне нужно создать сервис (на моем бизнес-уровне и предоставить его контроллеру).

Я столкнулся с проблемой, что в этом руководстве это возврат IActionResult из функции:

 public async Task<IActionResult> OnPostExport()
{
    //logic
    return File(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", sFileName);
}
  

Пожалуйста, смотрите https://www.talkingdotnet.com/import-export-excel-asp-net-core-2-razor-pages / для получения подробной информации о режиме.

Я пытался написать этот код:

 public class ExportService
{      
    private IHostingEnvironment _hostingEnvironment;

    public ExportService(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    public async Task OnPostExport(int year)
    {
        //logic
        return File(memory, "application/vnd.openxmlformats- 
        officedocument.spreadsheetml.sheet", sFileName);
    }
  

Это не работает, потому что «return File» — функционал из PageModel, как это работает в руководстве. Я хочу вернуть файл контроллеру из моей службы. Какой тип я должен вернуть из своей OnPostExport функции? Я буду благодарен за любую информацию и идеи, которые мне нужно сделать.

Комментарии:

1. Я думаю, что вы ищете byte[] . Вы можете сохранить файл EPPlus в массив байтов вместо фактического файла с помощью MemoryStream , а затем вернуть этот массив байтов.

Ответ №1:

Для File это базовый метод, из ControllerBase которого будет возвращен FileContentResult результат. Если вы предпочитаете использовать File , вы могли бы реализовать код из вариантов FileResult.

ИМО, я бы посоветовал вам вернуться byte[] из public async Task OnPostExport(int year) , а затем сконструировать ответ File следующим образом

 public async Task<byte[]> OnPostExport(int year)
{
    //logic
    return filebytearray;
}


var dt = await _exportService.OnPostExport(1);
return File(dt, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", sFileName);