我正在使用PHPExcel读取excel模板,填充数据,并要求用户下载文件。
generate_excel.php
$objPHPExcel = PHPExcel_IOFactory::load("./template.xlsx");
//populate data ...
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="01simple.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
当我直接从浏览器打开generate_excel.php时,会下载结果文件。 但是如果我对generate_excel.php进行ajax调用,我就不会得到下载提示。使用chrome开发人员工具,我可以从“网络”选项卡中看到ajax调用已成功完成,并且在响应数据中看到了一堆随机字符。我假设那是excel对象。
有谁知道如何使用ajax实现下载excel功能?我不想刷新页面。当用户点击"导出"按钮,应该有一个ajax调用php文件并提示用户下载。
谢谢!
答案 0 :(得分:8)
我找了一些方法将带有ajax的JSON数据传递给PHP并返回一个excel文件(MySQL和PHPExcel)供用户保存。 我环顾四周,把一些碎片放在一起,希望它可以帮助别人:
jQuery的:
$("#exportBotton").on("click",function(event) {
event.preventDefault();
// create json object;
str_json = JSON.stringify({"key01":val01, "key02":val02, "key03":val03});
$.ajax({
type: "post",
data: str_json,
url: "../../includes/dbSelect_agentFormExport.php",
dataType: "json",
success: function(output){
// output returned value from PHP t
document.location.href =(output.url);
}
});
});
PHP:
$str_json = file_get_contents('php://input');
$objPHPExcel = new PHPExcel();
// here i populated objPHPExcel with mysql query result.....
function saveExcelToLocalFile($objWriter){
// make sure you have permission to write to directory
$filePath = '../tmp/saved_File.xlsx';
$objWriter->save($filePath);
return $filePath;
}
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$response = array(
'success' => true,
'url' => saveExcelToLocalFile($objWriter)
);
echo json_encode($response);
exit();
答案 1 :(得分:7)
并非一切都应该用AJAX完成。有时普通的旧HTML更适合工作。我猜你的按钮有a
标签?你为什么不做这样的事呢
<a href="generate_excel.php" target="_blank">Export to Excel</a>
你的HTML中的?请注意target="_blank"
部分。这是为了确保您的页面不会重新加载。
对于input
,您可以使用构造
<form action="generate_excel.php" target="_blank"><input type="button">...whatever</form>
答案 2 :(得分:5)
我认为你不能通过ajax调用下载任何东西。而不是你可以生成并保存服务器中的excel(临时)并向用户显示下载链接。
答案 3 :(得分:3)
找到了一种方法,虽然我不确定这是否是一种理想的方法。
我在页面中添加了一个隐藏的iframe。当ajax调用返回时,它返回所创建数据的url。我使用javascript将iframe重定向到自动触发下载操作的网址。
答案 4 :(得分:0)
您可以尝试这种方式: