Экспорт данных jqgrid в xsl/excel с использованием Zend Framework
Я пытаюсь экспортировать данные jqgrida в Excel или CSV-файл, и я следовал этому примеру php + jqgrid + export для Excel, но после того, как я нажал кнопку, чтобы экспортировать данные, ничего не происходит. здесь идет код..
это мой list.phtml, где я рендерим сетку, и как только я нажимаю кнопку export, все отлично, она извлекает данные из jqgrid и отправляет их в action /checkins/export.
<div class="simplebox grid740" style="z-index: 500;">
<script>
$(function() {
$("#toolbar").jqGrid({
caption:"Checkins",
colNames:['ID','Nome da Tag','Localização da Tag','Cliente','Utilizador','Data da Leitura','Data da Escrita',],
colModel:[
{name:'id_checkin',index:'id_checkin',hidden:true},
{name:'tag_nome',index:'tag_nome'},
{name:'localizacao',index:'localizacao'},
{name:'nome_cli',index:'nome_cli'},
{name:'nome_user',index:'nome_user'},
{name:'data_leitura',index:'data_leitura'},
{name:'data_escrita',index:'data_escrita'},
],
datatype:"json",
height:421,
rownumWidth:40,
pager:'#ptoolbar',
rowList:[10,20,30],
rowNum:10,
sortname:'id_cliente',
sortorder:'desc',
url:'/checkins/list/',
viewrecords:true,
width:740,
});
$("#toolbar").jqGrid('navGrid','#ptoolbar',{del:false,add:false,edit:false,search:false,excel:true});
jQuery("#toolbar").jqGrid('navButtonAdd','#ptoolbar',{
caption:"export",
onClickButton : function () {
alert('export to excel');
var mya=new Array();
mya=$("#toolbar").getDataIDs(); // Get All IDs
var data=$("#toolbar").getRowData(mya[0]); // Get First row to get the labels
var colNames=new Array();
var ii=0;
for (var i in data){colNames[ii++]=i;} // capture col names
var html="";
for(k=0;k<colNames.length;k++)
{
html=html+colNames[k]+"\t"; // output each Column as tab delimited
}
html=html+"\n"; // Output header with end of line
for(i=0;i<mya.length;i++)
{
data=$("#toolbar").getRowData(mya[i]); // get each row
for(j=0;j<colNames.length;j++)
{
html=html+data[colNames[j]]+"\t"; // output each Row as tab delimited
}
html=html+"\n"; // output each row with end of line
}
html=html+"\n"; // end of line at the end
$.ajax({
url: '/checkins/export',
type: 'POST',
data: {param1: html},
datatype: "json"
});
}
});
});
</script>
<table id="toolbar"></table>
<div id="ptoolbar"></div>
</div>
поэтому в соответствии с firebug он отправляет это: param1:
id_checkin tag_nome localizacao nome_cli nome_user data_leitura data_escrita
1 Саша Майя; Порту; tesret1212; admin 2013-08-14 15:45:00 2013-08-14 16:00:00
2 Саша Майя; Порту; tesret1212; tre 2013-08-14 16:06:00 2013-08-14 16:05:00
3 Саша Майя; Порту; tesret1212; teste 14-08-14 12:15:00 2013-08-14 16:15:00
и в моем действии / checkins / export я делаю это:
public function exportAction()
{
if($this->_request->isXmlHttpRequest())
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
$param1 = $this->_request->getParam('param1');
header("Content-Type: application/vnd.ms-excel");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("content-disposition: attachment;filename=contacts-download-" . time() . ".xls");
$buffer = $param1;
try{
echo $buffer;
}catch(Exception $e){
}
}
}
здесь я получаю информацию param1 и устанавливаю заголовки, а затем выводим данные. Но окно с просьбой загрузить файл не появляется, я пробовал другое решение, но ничего не работает... что я пропустил. Можно сделать представление в виде файла CSV / Excel, путем создания макета Excel? заранее спасибо Хьюго
1 ответ
Я реализовывал те же вещи, что и ниже, и он работает нормально. Ниже приведен мой код jqgrid.
jQuery("#list2").jqGrid('navButtonAdd', '#pager2', {
caption: "Download", buttonicon:"ui-icon-save", title: "Excel Export",
onClickButton: function(){
exportExcel();
},
position:"last"
});
}
function exportExcel()
{
var mya=new Array();
mya=$("#list2").getDataIDs(); // Get All IDs
var data=$("#list2").getRowData(mya[0]); // Get First row to get the labels
var colNames=new Array();
var ii=0;
for (var i in data){colNames[ii++]=i;} // capture col names
var html="";
for(k=0;k<colNames.length;k++)
{
html=html+colNames[k]+"\t"; // output each Column as tab delimited
}
html=html+"\n"; // Output header with end of line
for(i=0;i<mya.length;i++)
{
data=$("#list2").getRowData(mya[i]); // get each row
for(j=0;j<colNames.length;j++)
{
html=html+data[colNames[j]]+"\t"; // output each Row as tab delimited
}
html=html+"\n"; // output each row with end of line
}
html=html+"\n"; // end of line at the end
console.log(html);
document.forms[0].csvBuffer.value=html;
document.forms[0].method='POST';
document.forms[0].action='analytics.do?method=getDownload';
document.forms[0].target='_blank';
document.forms[0].submit();
}
добавить ниже три строки в вашем HTML-коде
<form id='_export' method="post" action="">
<input type="hidden" name="csvBuffer" id="csvBuffer" value="" />
</form>
и ваш код сервера для загрузки файла CSV как
public void getDownload(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception{
PrintWriter out = response.getWriter();
String param1 = request.getParameter("csvBuffer");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment;filename=downloadfilename.csv");
try{
System.out.println(param1);
out.print(param1);
}catch(Exception $e){
}
} //end of getDownload method
Так что скачивайте файл в формате csv.