jqGrid Экспорт в CSV - публикация, а не получение - PullRequest
1 голос
/ 20 апреля 2011

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

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

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

Ответы [ 2 ]

7 голосов
/ 23 апреля 2011

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

Нет проблем получить файл 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 дополнительно отключает кэширование данных на прокси и объявляет, что данные могут кэшироваться, но не передаваться другим пользователям.Более подробную информацию о предмете вы можете найти в следующем Caching Tutorial .

1 голос
/ 11 апреля 2012

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

Это решение, которое у меня было для другой подобной проблемы (не связанной с 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, поэтому мне нужно было ПОСТАВИТЬ данные.

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

СМГ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...