18
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');

When I call above code directly from the browser, the result file is downloaded. But if I make an ajax call to above code, I don't get the download prompt. I can see from console tab that the ajax call was successfully completed and a bunch of random characters is seen in the response data. I'm assuming that is the excel object.

Does anyone know how I can achieve the download excel feature using ajax? I don't want to refresh the page. When the user clicks on the "export" button, there should be an ajax call to the php file and prompt the user to download.

Sadikhasan
  • 17,212
  • 19
  • 72
  • 111

4 Answers4

48

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();
});
Cristiano Gehring
  • 631
  • 1
  • 5
  • 7
15

add target=_blank in your ajax success function like below

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

otherwise you can handle smartly to open your Excel download link in new tab with jQuery trigger function or etc.

Wiram Rathod
  • 1,805
  • 1
  • 19
  • 39
8

You cannot download a file using ajax neither by phpexcel nor by php itself as its a security reason and almost browsers doesn't support it. But, you can try window.location in success callback like,

var page='mydownload.php';
$.ajax({
    url: page,
    type: 'POST',
    success: function() {
        window.location = page;// you can use window.open also
    }
});

Also @freakish answered for this type of question

Even, you don't need of ajax you can use hyperlink for the page like,

<a href="mydownload.php" target="_blank" >Download</a>
Community
  • 1
  • 1
Rohan Kumar
  • 38,998
  • 11
  • 69
  • 99
1

i am trying to do the same thing in spreadsheet and it works so well with a xls file but not with mpdf file

IOFactory::registerWriter('Pdf', $this->classNamePdf);
ob_start();
IOFactory::createWriter($this->exportType, 'Pdf')->save('php://output');
$pdfData = ob_get_contents();
ob_end_clean();

return "data:application/pdf; base64,".base64_encode($pdfData);

success: function(response){
    var win = window.open("", "_blank");
    win.location.href = response;
}
dcarb
  • 11
  • 3
  • i have found the solution after many many tries: \PhpOffice\PhpSpreadsheet\Shared\File::setUseUploadTempDirectory("..."); – dcarb Jun 18 '20 at 15:02