web-dev-qa-db-ja.com

ajax呼び出しを使用したPHPExcelのダウンロード

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呼び出しがあり、ユーザーにダウンロードを促すメッセージが表示されます。

15
Sadikhasan

以下のようにajax成功関数にtarget = _blankを追加します

success: function(){
  window.open('http://YOUR_URL','_blank' );
},

それ以外の場合は、jQueryトリガー機能などを使用して、新しいタブでExcelダウンロードリンクを開くようにスマートに処理できます。

10
Wiram Rathod

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();
});
39

セキュリティ上の理由から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>
7
Rohan Kumar