none
Асинхронное формирование и скачивание файла Excel RRS feed

  • Общие обсуждения

  • Добрый день!

    Пытаюсь асинхронно создать и скачать файл Excel. Мои действия:

    1. Получаю источник данных.

    DataTable dt = GetDataSource();
    Session["DataSource"] = dt;

    2. Обрабатываю событие кнопки "Экспорт в excel"

    $(document).ready(function ()
    {
     $('input[id$=btn_ExpToExcel]').click(function () {
            $.ajax({
                type: "POST",
                url: "Filter.aspx/ExportToExcel",
                data: "{ }",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: false,
                cache: false,
                success: function (msg)
                {
    
                }
            }).done(function (data) {
                var a = document.createElement("a");
                document.body.appendChild(a);
                $(a).hide();
                var blob = new Blob([data.d], { type: 'text/plainapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
                var url = window.URL.createObjectURL(blob);
                a.href = url;
                a.download = 'file.xlsx';
                $(a).click();
                window.URL.revokeObjectURL(url)
            });
        });
    });

    3. Обработка асинхронного метода на сервере (использую библиотеку epplus)

      [WebMethod(EnableSession = true)]
            public static string ExportToExcel()
            {
                  if (HttpContext.Current.Session["DataSource"] != null)
                  {
                      DataTable dt = (DataTable)HttpContext.Current.Session["DataSource"];
                      OfficeOpenXml.ExcelPackage pck = new OfficeOpenXml.ExcelPackage();
                      OfficeOpenXml.ExcelWorksheet ws = pck.Workbook.Worksheets.Add("List");
                      ws.Cells["A1"].LoadFromDataTable(dt, true);             
                      return Convert.ToBase64String(pck.GetAsByteArray());
                  }
                  return null;
            }

    В итоге все отрабатывает, но скачка не наступает. Может формирование файла на стороне сервера не правильно делаю. Не знаю. Буду благодарен за любые подсказки.



    23 ноября 2015 г. 7:04

Все ответы

  • Метод done в JS у вас вызывается, вы проверяли?

    Сделаем содержимое сообщества лучше, вместе!

    24 ноября 2015 г. 10:54
    Модератор
  • Вызывается. пробовал вместо него success ставить. результат один.

    Также пробовал разные браузеры.

    • Изменено ilya83 24 ноября 2015 г. 12:18
    24 ноября 2015 г. 12:17
  • тема еще актуальна
    26 ноября 2015 г. 6:24
  • Вы пошагово в отладчике браузера и сервера проверяли, на сервере код вызывается, файл создаётся? Может там HttpContext.Current.Session["DataSource"] вообще пустой и не выполняется код в условии.

    Сделаем содержимое сообщества лучше, вместе!

    27 ноября 2015 г. 19:14
    Модератор
  • Проверял. HttpContext.Current.Session["DataSource"] не пустой. Асинхронный запрос возвращает данные. Проверял в отладчике javascript. Как я узнаю создается ли файл?  Blob создается (с данными). Javascript отрабатывает полностью.


    • Изменено ilya83 30 ноября 2015 г. 6:28
    30 ноября 2015 г. 6:27
  • Тогда получается формат данных не тот вы конвертируете бинарные данные в Base64, а я не уверен что их можно просто так открыть в браузере. Может нужно сохранить файл в файловой системе (временно), а только потом передавать.

    Сделаем содержимое сообщества лучше, вместе!

    30 ноября 2015 г. 15:52
    Модератор