Blazor экспорт в Excel - PullRequest
       6

Blazor экспорт в Excel

0 голосов
/ 05 марта 2020

Я пытаюсь добавить кнопку экспорта в Excel в моем приложении Blazor Server. До сих пор после прочесывания inte rnet это то, что я сделал.

Моя кнопка

    <div class="row text-right">
                <div class="col-12 p-3">
                    <button class="btn btn-outline-success" @onclick="@(() =>DownloadExcel(formValues.Region, formValues.startDate, formValues.endDate))">
                        Export to Excel&nbsp;
                        <i class="fa fa-file-excel" aria-hidden="true"></i>
                    </button>
               </div>
            </div>

Мой метод на моей странице .razor

    public FileResult DownloadExcel(string Region, DateTime StartDate, DateTime EndDate)
    {
        FileResult ExcelFile = searchService.ExportToExcel(Region, StartDate, EndDate);
        return ExcelFile;
    }

И Наконец, мои логики c в моем сервисе

        public FileResult ExportToExcel(string Region, DateTime StartDate, DateTime EndDate)
        {
            var queryable = context.AuditCardPinrecords.Where(s => Region == s.RegionRecordId)
                .Where(s => s.AuditComplete == true)
                .Where(s => s.DateTime >= StartDate && s.DateTime <= EndDate).AsQueryable();

            var stream = new MemoryStream();

            using (var package = new ExcelPackage(stream))
            {
                var workSheet = package.Workbook.Worksheets.Add("Sheet1");
                workSheet.Cells.LoadFromCollection(queryable, true);
                package.Save();
            }


            string excelName = $"AuditPinRecords-{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";

            return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName); 

        }

Мой ожидаемый результат - загрузка файла excel. К сожалению, ничего не происходит при нажатии кнопки. Любой совет будет принята с благодарностью. Спасибо!

1 Ответ

1 голос
/ 05 марта 2020

Компонент .razor не является конечной точкой HTTP, как представление MVC. Ваш возврат FileResult не будет запускать загрузку браузером.

Вам нужно будет создать действие контроллера MVC и перенаправить туда пользователя, либо использовать JavaScript, чтобы вызвать действие сохранения файла. Затем вам нужно будет использовать JavaScript Interop для вызова функции JS.

window.msSaveBlob = function (payload, filename) {

    const createBlob = data => new Blob([data], { type: "text/csv;charset=utf-8;" });

    const buildDownloadLink = (blob, fileName) => {
        let link = document.createElement("a");
        link.setAttribute("href", URL.createObjectURL(blob));
        link.setAttribute("download", fileName);
        link.style = "visibility:hidden";
        return link;
    };
    const invokeDownload = link => {
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    };
    const isHtmlDownloadAllowed = document.createElement("a").download !== undefined;
    const isSaveBlobAllowed = navigator.msSaveBlob;

    isSaveBlobAllowed ? navigator.msSaveBlob(createBlob(payload), filename) :
        isHtmlDownloadAllowed ? invokeDownload(buildDownloadLink(createBlob(payload), filename)) :
            console.log("Feature unsupported");

};

Конечно, есть и коммерческие библиотеки, помогающие с такими вещами. Telerik UI для обработки документов Blazor

...