web-dev-qa-db-fra.com

Téléchargement de PHPExcel via un appel ajax

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

Lorsque j'appelle le code ci-dessus directement depuis le navigateur, le fichier de résultat est téléchargé. Mais si je fais un appel ajax au code ci-dessus, je ne reçois pas l'invite de téléchargement. Je peux voir dans l'onglet console que l'appel ajax s'est terminé avec succès et un tas de caractères aléatoires est visible dans les données de réponse. Je suppose que c'est l'objet Excel.

Est-ce que quelqu'un sait comment obtenir la fonctionnalité de téléchargement d'Excel en utilisant ajax? Je ne veux pas rafraîchir la page. Lorsque l'utilisateur clique sur le bouton "exporter", il devrait y avoir un appel ajax vers le fichier php et inviter l'utilisateur à télécharger.

15
Sadikhasan

ajoutez target = _blank dans votre fonction de réussite ajax comme ci-dessous

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

sinon vous pouvez gérer intelligemment pour ouvrir votre lien de téléchargement Excel dans un nouvel onglet avec la fonction de déclenchement jQuery ou etc.

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

Vous ne pouvez pas télécharger un fichier en utilisant ajax ni par phpexcel ni par php lui-même car c'est une raison de sécurité et presque les navigateurs ne le prennent pas en charge. Mais, vous pouvez essayer window.location en cas de rappel réussi comme,

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

Aussi @freakish répond pour ce type de question

Même, vous n'avez pas besoin d'ajax, vous pouvez utiliser un lien hypertexte pour la page comme,

<a href="mydownload.php" target="_blank" >Download</a>
7
Rohan Kumar