Экспорт .NET C # в excel через JS post с использованием ExcelPackage

#javascript #c# #asp.net #excel #excelpackage

#javascript #c# #asp.net #excel #excelpackage

Вопрос:

Я не уверен, чего мне здесь не хватает. У меня есть кнопка, при нажатии на которую я использую javascript для вызова контроллера. Этот контроллер должен создать файл Excel и вернуть его пользователю, предоставив ему возможность загрузить / сохранить файл. Я пробовал несколько разных методов, но не смог заставить его работать. Вот моя сторона javascript:

 function exportList() {
    var val = $("#team-dropdown").val();
    const date = new Date().toISOString();
    const param = {
        "Date": date,
        "GroupID": 1
    }

    $.ajax({
        url: "@Url.Action("ExportToExcel", "Home")",
        type: "POST",
        data: param
    });
}
  

Вот моя серверная часть:

 public FileResult ExportToExcel(DateTime date, int groupID)
        {
            Load l = new Load();
            List<Load> loadList = l.GetLoadsForGroup(date, groupID);

            var fileDownloadName = "fileName.xlsx";
            var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

            ExcelPackage pck = new ExcelPackage();
            var ws = pck.Workbook.Worksheets.Add("New workbook");
            ws.View.ShowGridLines = true;
            ws.DefaultColWidth = 25;
            ws.Cells[1, 1].Value = "Order #";

            var currRow = 2;
            foreach (var load in loadList)
            {
                ws.Cells[2, 2].Value = load.LoadNumber;                    
            }



            var fs = new MemoryStream();
            pck.SaveAs(fs);
            fs.Position = 0;
            var fsr = new FileStreamResult(fs, contentType);
            fsr.FileDownloadName = fileDownloadName;
            return (fsr);
        }
  

Не уверен, какой лучший способ сделать это. Если есть способ получше, пожалуйста, не стесняйтесь уточнить.

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

1. Здравствуйте, я использовал ActionResult вместо FileResult и выходных данных, которые я отправил, выполнив: Response.Clear(); Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; Response.AddHeader("content-disposition", "attachment; filename="" fileName """); Response.BinaryWrite(data); Response.Flush(); Response.End();

2. Еще раз здравствуйте. Я только что использовал ваш код и смог получить рабочую книгу с помощью html form . Следующим образом: <form action="/Home/ExportToExcel"> <input type="submit" value="ok" /> </form> Попробуйте

3. @VagnerLucas заставил это работать. Спасибо за вашу помощь!

4. Неплохо. Просто улучшил мой первый комментарий в качестве ответа. Приветствия!

Ответ №1:

Ваш метод выглядит нормально. В этом случае вам просто нужно использовать html form для публикации вместо использования функции js. В качестве альтернативы, если вы хотите использовать ActionResult , вы можете написать:

 public ActionResult ExportToExcel()
    {
        Load l = new Load();
        List<Load> loadList = l.GetLoadsForGroup(date, groupID);

        var fileDownloadName = "fileName.xlsx";
        var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        ExcelPackage pck = new ExcelPackage();
        var ws = pck.Workbook.Worksheets.Add("New workbook");
        ws.View.ShowGridLines = true;
        ws.DefaultColWidth = 25;
        ws.Cells[1, 1].Value = "Order #";

        var currRow = 2;
        foreach (var load in loadList)
        {
            ws.Cells[2, 2].Value = load.LoadNumber;
        }

        Response.Clear();
        Response.ContentType = contentType;
        Response.AddHeader("content-disposition", "attachment; filename=""   fileDownloadName   """);
        Response.BinaryWrite(pck.GetAsByteArray());
        Response.Flush();
        Response.End();
        return View();
    }
  

И вы получите тот же результат, что и ваш метод.