使用 AJAX 调用下载 PHPExcel 文件
Posted
技术标签:
【中文标题】使用 AJAX 调用下载 PHPExcel 文件【英文标题】:PHPExcel file download using AJAX call 【发布时间】:2017-08-23 21:08:46 【问题描述】:我有一个用于导出文件的 phpExcel 代码,当我通过正常的静态输入运行它时它工作得非常好,但是当尝试使用 ajax 调用时,文件没有被下载。 生成代码的php代码如下
include "dbconnect.php";
include 'PHPExcel/Classes/PHPExcel/IOFactory.php';
include 'PHPExcel/Classes/PHPExcel.php';
$objPHPExcel = new PHPExcel();
if (isset($_POST['sql']))
$sql=mysql_query($_POST['sql']);
echo $sql;
if($sql === FALSE)
die(mysql_error()); // TODO: better error handling
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'A');
$objPHPExcel->getActiveSheet()->setCellValue('B1', 'B');
$objPHPExcel->getActiveSheet()->setCellValue('C1', 'C');
$objPHPExcel->getActiveSheet()->setCellValue('D1', 'D');
$objPHPExcel->getActiveSheet()->setCellValue('E1', 'E');
$objPHPExcel->getActiveSheet()->setCellValue('F1', 'F');
$objPHPExcel->getActiveSheet()->setCellValue('G1', 'G');
$objPHPExcel->getActiveSheet()->setCellValue('H1', 'H');
$objPHPExcel->getActiveSheet()->setCellValue('I1', 'I');
$objPHPExcel->getActiveSheet()->setCellValue('J1', 'J');
$objPHPExcel->getActiveSheet()->setCellValue('K1', 'K');
$objPHPExcel->getActiveSheet()->setCellValue('L1', 'L');
$objPHPExcel->getActiveSheet()->setCellValue('M1', 'M');
$n=2;
while($sqlr= mysql_fetch_array($sql))
$objPHPExcel->getActiveSheet()->setCellValue('A'.$n, $sqlr['a']);
$objPHPExcel->getActiveSheet()->setCellValue('B'.$n, $sqlr['b']);
$objPHPExcel->getActiveSheet()->setCellValue('C'.$n, $sqlr['c']);
$objPHPExcel->getActiveSheet()->setCellValue('D'.$n, $sqlr['d']);
$objPHPExcel->getActiveSheet()->setCellValue('E'.$n, $sqlr['e']);
$objPHPExcel->getActiveSheet()->setCellValue('F'.$n, $sqlr['f']);
$objPHPExcel->getActiveSheet()->setCellValue('G'.$n, $sqlr['g']);
$objPHPExcel->getActiveSheet()->setCellValue('H'.$n, $sqlr['h']);
$objPHPExcel->getActiveSheet()->setCellValue('I'.$n, $sqlr['i']);
$objPHPExcel->getActiveSheet()->setCellValue('J'.$n, $sqlr['j']);
$objPHPExcel->getActiveSheet()->setCellValue('K'.$n, $sqlr['k']);
$objPHPExcel->getActiveSheet()->setCellValue('L'.$n, $sqlr['l']);
$objPHPExcel->getActiveSheet()->setCellValue('M'.$n, $sqlr['m']);
$n++;
$objPHPExcel->getActiveSheet()->setTitle('SORTED');
$objPHPExcel->setActiveSheetIndex(0);
for($col = 'A'; $col !== 'Z'; $col++)
$objPHPExcel->getActiveSheet()
->getColumnDimension($col)
->setAutoSize(true);
$objPHPExcel->getActiveSheet()->getStyle("A1:M1")->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()
->getStyle('A1:M1')
->getFill()
->setFillType(PHPExcel_Style_Fill::FILL_SOLID)
->getStartColor()
->setARGB('75b847');
$objPHPExcel->setActiveSheetIndex(0);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="reports.xls"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
else
echo "no luck";
?>
而JS如下
$(document).on("click", "#submit2", function()
var sql=$("#sql").val();
console.log(sql);
$.ajax(
type: "POST",
url: 'exreports.php',
data:
sql : sql
,
success: function ()
window.open(this.url,'_blank' );
);
);
但这不是下载文件,我不想刷新页面,因为用户可能会执行一些其他操作,如果有什么方法可以在同一个窗口中下载,那就太好了。
提前致谢
【问题讨论】:
PHPExcel download using ajax call的可能重复 我试过了,但它对我不起作用,也没有运气@NochetImchen 尝试使用window.location()
而不是window.open
@NochetImchen 也尝试过,但它没有重定向,此外我还发布了一些数据,我猜它没有进入成功回调
单独编写代码window.location.href()
,不在ajax内部。无论如何,您都无法使用 ajax 下载文件。这是一个安全问题,所以浏览器不允许这样做。
【参考方案1】:
https://***.com/a/27702111/8221063
在您的 ajax 成功函数中添加 target=_blank
,如下所示
success: function()
window.open('http://YOUR_URL','_blank' );
,
否则,您可以使用 jQuery 触发功能等巧妙地处理在新选项卡中打开 Excel 下载链接。
【讨论】:
以上是关于使用 AJAX 调用下载 PHPExcel 文件的主要内容,如果未能解决你的问题,请参考以下文章