Невозможно получить файл Excel из Web Api Dot Net Core 2.1 с помощью пакета epplus Excel - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь сгенерировать файл / поток excel в своем веб-интерфейсе и вернуть его в HttpResponseMessage, чтобы загрузить его клиенту в Angular 5 для загрузки.

Генерация завершена успешно и файл xlsxгенерируется и сохраняется на сервере, но когда я возвращаю его в Content моего httpResponseMessage, мой браузер показывает только несколько json вместо всего файла excel.

{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,"minorRevision":-1},"content":{"headers":[{"key":"Content-Disposition","value":["attachment; filename=636742856488421817.xlsx"]},{"key":"Content-Type","value":["application/ms-excel"]},{"key":"Content-Length","value":["22780"]}]},"statusCode":200,"reasonPhrase":"OK","headers":[],"requestMessage":null,"isSuccessStatusCode":true}

Так я создаю файл excelи возвращает его:

        var dataBytes = File.ReadAllBytes(fileName);
        var dataStream = new MemoryStream(dataBytes);
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK);
        httpResponseMessage.Content = new StreamContent(dataStream);
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
        httpResponseMessage.Content.Headers.ContentLength = dataStream.Length;

Ответы [ 2 ]

0 голосов
/ 29 октября 2018
Try this following code:

For conroller:
    [Route("DownLoadExcel")]
    public IActionResult DownLoadExcel()
    {
     var pack = new ExcelPackage();                    
     ExcelWorksheet worksheet = pack.Workbook.Worksheets.Add("sample");
     //First add the headers
     worksheet.Cells[1, 1].Value = "ID";
     worksheet.Cells[1, 2].Value = "Name";                   

     //Add values
     worksheet.Cells["A2"].Value = 1000;
     worksheet.Cells["B2"].Value = "Jon";
     return File(pack.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Sample.xlsx");
    }

For client side:

    window.open("../.../DownLoadExcel");
0 голосов
/ 06 октября 2018

Я решил это:

Вот что я сделал

Вспомогательный класс, который создает пакет Excel и преобразует его в поток

var fileName = DateTime.Now.Ticks + ".xlsx";
FileInfo file = new FileInfo(fileName);
FileInfo templateFile = new FileInfo(@"Templates/ReportTemplate.xlsx");
ExcelPackage package = new ExcelPackage(file, templateFile);
ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault();
... filling rows and cells goed here ...
var dataBytes = package.GetAsByteArray();
Stream dataStream = new MemoryStream(dataBytes);
dataStream.Seek(0, SeekOrigin.Begin);
return dataStream;

В контроллере Iвернуть файл клиенту Angular следующим образом:

var stream = _helperClass.GenerateReport(exportDate, exportTitle);
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"Report-{DateTime.Now.ToShortDateString()}.xlsx");

В компоненте Angular я делаю это после того, как получаю ответ:

var blob = new Blob([res], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
var blobURL = window.URL.createObjectURL(blob);
var anchor = document.createElement("a");
anchor.download = `Report-${new Date().toISOString()}.xlsx`;
anchor.href = blobURL;
anchor.click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...