jqGrid Экспорт в CSV - публикация, а не получение
У меня есть jqGrid, который использует Post для отправки запроса. У меня есть функция php, которая при задании параметров поиска и сортировки jqGrid может возвращать файл CSV. И я собрал внешнюю кнопку, которая может вызывать exportExcel в попытке вызвать эту функцию php и получить CSV.
Проблема в том, что ExcelExport использует GET для отправки данных, и мне все еще нужно, чтобы он был POST. Я посмотрел код и попробовал несколько способов настроить excelExport для отправки запроса через POST без удачи.
Итак, вопрос в следующем: есть ли способ заставить ExcelExport использовать POST, или есть ли простой способ для меня отправить точно такой же POST-запрос, который сетка отправила бы, если бы я перезагружал его в свою функцию php, которая может генерировать CSV?
2 ответа
Мне кажется, что то, что вы хотите, не возможно. Я должен объяснить более подробно, что я имею в виду.
Нет проблем получить файл 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"
(см. здесь). Дополнительно можно использовать Content-Disposition
Заголовок HTTP для определения предпочтительного имени файла ответа. Например, это может быть "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
дополнительно отключите кэширование данных на прокси-сервере и объявите, что данные могут кэшироваться, но не передаваться другим пользователям. Более подробную информацию о предмете вы можете найти в следующем уроке кэширования.
Эми, у меня была такая же проблема. Я не программист (вы поймете, что по коду, который я здесь вставлю:)), но решение, которое я нашел, кажется, работает нормально.
Это решение, которое я имел для другой подобной проблемы (не связанной с 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, поэтому мне нужно было отправить данные.
Надеюсь, что это работает для вас.
СМГ.