jqGrid Экспорт в CSV - сообщение вместо Get - jquery


1

У меня есть jqGrid, который использует Post для отправки запроса. У меня есть функция php, которая, если заданы параметры поиска и сортировки jqGrid, может возвращать CSV файл. И я собрал внешнюю кнопку, которая может вызвать exportExcel, чтобы вызвать эту функцию php и получить CSV.

Проблема заключается в том, что excelExport использует GET для отправки данных, и мне все еще нужно, чтобы это было POST. Я просмотрел код и попробовал несколько способов установить excelExport для отправки запроса через POST без везения.

Итак, вопрос заключается в следующем: есть ли способ заставить excelExport использовать POST, или есть простой способ для меня отправить тот же самый запрос POST, который будет отправлять сетка, если бы я перезагрузил его в свою php-функцию, может генерировать CSV?

2 ответа

1

Amy, У меня такая же проблема. Я не программист (вы поймете, что по коду я буду вставлять сюда:)), но решение, которое я нашел, работает нормально.

Это решение, которое у меня было для другой аналогичной проблемы (не связанной с jqGrid).

excelExport : function(o) { 
    o = $.extend({
        exptype : "remote",
        url : null,
        oper: "oper",
        tag: "excel",
        exportOptions : {}
    }, o || {});
    return this.each(function(){
        if(!this.grid) { return;}
        if(o.exptype == "remote") {
            var pdata = $.extend({},this.p.postData);

            pdata[o.oper] = o.tag;

            var form = document.createElement("form");
            form.setAttribute("method", "post");
            form.setAttribute("action", o.url);
            form.setAttribute("target", "_blank");

            $.each( pdata, function(i, l){
                if (typeof l != undefined) {
                    if (typeof l == function) {
                        post_value = l();
                    }
                    else {
                        post_value = l;
                    }
                    var hiddenField = document.createElement("input");
                    hiddenField.setAttribute("type", "hidden");
                    hiddenField.setAttribute("name", i);
                    hiddenField.setAttribute("value", post_value);
                    form.appendChild(hiddenField);
                }
             });

            document.body.appendChild(form);    // Not entirely sure if this is necessary
            form.submit();

        }
    });
}

Как вы можете видеть, он создает форму и отправляет данные на новую страницу. Большинство людей здесь найдут лучший (и более элегантный) способ сделать это, но это решение, как есть, работает. Мне нужно отправить много информации на сервер, поэтому для меня недостаточно GET, поэтому мне нужно было выполнить POST-данные.

Надеюсь, это сработает для вас.

СМГ.

  • 8 фев 2020 2020-02-08 08:05:30
7

Мне кажется, что вы не хотите. Я должен объяснить более подробно, что я имею в виду.

Невозможно получить файл CSV, XLS или XLSX для HTTP POST. Проблема заключается в том, чтобы показать ответ сервера в Excel, если вы будете использовать HTTP POST.

Код метода excelExport очень прост, вы можете увидеть его здесь. Что excelExport сделать - это просто открыть URL-адрес, где будут добавлены дополнительные параметры. Основная часть кода следующая

window.location = url;

Итак, все реальные интересные вещи реализованы на сервере. Важно, чтобы сервер устанавливал некоторые HTTP-заголовки, особенно Content-Type, которые определяют ответ HTTP как файл Excel (или CSV, если вы не можете генерировать данные XLSX). Я лично использую Open XML SDK 2.0 для создания файла XLSX и установки "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" в качестве Content-Type. В вашем случае это должно быть "text/csv" (см. здесь). Кроме того, можно использовать заголовок HTTP Content-Disposition для определения предпочтительного имени файла ответа. Например, в вашем случае это может быть "attachment; filename=test.csv". Поскольку у вас уже есть код сервера, у вас есть все, что реализовано в коде.

Самая важная часть: веб-браузер знает, как открыть другой URL-адрес. Если он откроет новый url ( для HTTP GET!!!), он будет использовать соответствующее приложение, такое как Excel, чтобы его показать.

С другой стороны, если вы используете $.ajax, вы можете получить CSV для HTTP POST, но как вы хотите решить следующую проблему - запустить Excel с данными? Я не знаю простого решения без использования элементов управления ActiveX, работающих только в Internet Explorer.

Поэтому я рекомендую вам просто использовать HTTP GET. Если вы не хотите кэшировать данные, вы можете сделать это, установив соответствующие HTTP-заголовки. В большинстве случаев достаточно установить Cache-Control: max-age=0. Установка Cache-Control: private дополнительно отключает кеширование данных прокси и объявляет, что данные могут быть кэшированы, но не доступны другим пользователям. Более подробную информацию о предмете вы можете найти в следующем Учебное пособие по кэшированию.

  • 8 фев 2020 2020-02-08 08:05:30