Загрузите файл Excel с .Net core 2 и EPPlus - PullRequest
0 голосов
/ 19 марта 2019

Из маршрута API: api / exportExcel, я хочу создать файл Excel с .netCore 2.0 и EPPlus, чтобы пользователь мог загрузить его на свой компьютер, но файл не был создан, и у меня нет ошибки сервера. С другой стороны, у меня есть двоичный контент в ответе: PK!rNäH­¯3[Content_Types].xmlµÏJ1Æ_eÉU´D, etc...

Вот мой код:

[HttpPost("exportBooks")]
public FileResult ExportBooks([FromBody] Books[] books)
{
        var comlumHeadrs = new string[]
        {
            "Book Id",
            "Name",
        };

        byte[] result;

        using (var package = new ExcelPackage())
        {
            var worksheet = package.Workbook.Worksheets.Add("Current Book"); //Worksheet name
            using (var cells = worksheet.Cells[1, 1, 1, 5])
            {
                cells.Style.Font.Bold = true;
            }

            for (var i = 0; i < comlumHeadrs.Count(); i++)
            {
                 worksheet.Cells[1, i + 1].Value = comlumHeadrs[i];
            }

            //Add values
            var j = 2;
            foreach (var book in books)
            {
                 worksheet.Cells["A" + j].Value = book.BookId;
                 worksheet.Cells["B" + j].Value = book.name;
                 j++;
            }

            result = package.GetAsByteArray();

            var excelFile= new FileContentResult(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            {
                 FileDownloadName = "book-export.xlsx"
            };

            return excelFile;
       }
  }

Угловой сервис:

exportBooks(books: Book[]): Observable<Book[]> {    
    const httpOptions = {
        headers: new HttpHeaders({ 'Content-Type': 'application/json' })
    };

    return this.http.post<Book[]>(`${this.bookUrl}/exportBooks`, books, httpOptions).pipe(
       catchError(this.handleError('excelReport', [])),
    );

}

1 Ответ

0 голосов
/ 19 марта 2019

Для загрузки файла из ajax, вы можете попробовать код ниже:

<script type="text/javascript">
        $(document).ready(function(){
            $.ajax({
                url: '/excelEbom',
                method: 'post',
                contentType:'application/json',
                xhrFields: {
                    responseType: 'blob'
                },
                success: function (data, status, response) {
                    var filename = "";
                    var disposition = response.getResponseHeader('Content-Disposition');
                    if (disposition && disposition.indexOf('attachment') !== -1) {
                        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
                        var matches = filenameRegex.exec(disposition);
                        if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
                    }
                    let a = document.createElement('a');
                    a.href = window.URL.createObjectURL(data);
                    a.download = filename;
                    document.body.append(a);
                    a.click();
                    window.URL.revokeObjectURL(url);
                }
            });
        });
    </script>

Обновление:

Для клиента Angular, попробуйте код ниже:

const httpOptions = {
  headers: {
    'Content-Type': 'application/json'
  },
  observe: 'response' as 'body',
  responseType: 'blob' as 'json',
};

http.post(`${baseUrl}api/SampleData/excelEbom`, null, httpOptions).subscribe((response: HttpResponse<Blob>) => {
  var filename = "";
  var disposition = response.headers.get('Content-Disposition');
  if (disposition && disposition.indexOf('attachment') !== -1) {
    var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
    var matches = filenameRegex.exec(disposition);
    if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
  }
  let a = document.createElement('a');
  a.href = window.URL.createObjectURL(response.body);
  a.download = filename;
  document.body.append(a);
  a.click();
});
...