App::import('Vendor', 'PHPExcel/Classes/PHPExcel');
$objPHPExcel = new PHPExcel();
$objPHPExcel->getActiveSheet()->setTitle('ReceivedMessages');
header('Content-Type: application/vnd.ms-Excel');
$file_name = "kpi_form_".date("Y-m-d_H:i:s").".xls";
header("Content-Disposition: attachment; filename=$file_name");
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
上記のコードをブラウザーから直接呼び出すと、結果ファイルがダウンロードされます。しかし、上記のコードに対してajax呼び出しを行うと、ダウンロードプロンプトが表示されません。コンソールタブから、ajax呼び出しが正常に完了し、応答データに一連のランダムな文字が表示されていることがわかります。私はそれがExcelオブジェクトだと仮定しています。
Ajaxを使用してExcelのダウンロード機能を実現する方法を知っている人はいますか?ページを更新したくありません。ユーザーが「エクスポート」ボタンをクリックすると、phpファイルへのajax呼び出しがあり、ユーザーにダウンロードを促すメッセージが表示されます。
以下のようにajax成功関数にtarget = _blankを追加します
success: function(){
window.open('http://YOUR_URL','_blank' );
},
それ以外の場合は、jQueryトリガー機能などを使用して、新しいタブでExcelダウンロードリンクを開くようにスマートに処理できます。
PHP
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
ob_start();
$objWriter->save("php://output");
$xlsData = ob_get_contents();
ob_end_clean();
$response = array(
'op' => 'ok',
'file' => "data:application/vnd.ms-Excel;base64,".base64_encode($xlsData)
);
die(json_encode($response));
JS
$.ajax({
type:'POST',
url:"MY_URL.php",
data: {},
dataType:'json'
}).done(function(data){
var $a = $("<a>");
$a.attr("href",data.file);
$("body").append($a);
$a.attr("download","file.xls");
$a[0].click();
$a.remove();
});
セキュリティ上の理由からphpexcelでもphp自体でもajaxを使用してファイルをダウンロードすることはできません。また、ほとんどのブラウザーではサポートされていません。ただし、成功コールバックでwindow.locationを試すことができます。
var page='mydownload.php';
$.ajax({
url: page,
type: 'POST',
success: function() {
window.location = page;// you can use window.open also
}
});
@freakish answered このタイプの質問
さらに、ページにハイパーリンクを使用できるajaxは必要ありません。
<a href="mydownload.php" target="_blank" >Download</a>