web-dev-qa-db-fra.com

Enregistrement d'une feuille PhpSpreadSheet en cliquant sur le bouton

J'essaie d'obtenir mon Laravel app pour télécharger un fichier Excel avec phpSpreadSheet une continuation de PhpExcel. Mais jusqu'à présent, je n'ai pas de chance avec elle. J'ai d'abord essayé de faire un appel Axios via un onClick mais cela n'a pas fonctionné car JS n'est pas autorisé à enregistrer les choses. Après cela, j'ai essayé d'attacher le bouton à une action Laravel cela vient d'ouvrir) une page vide.

Je ne sais pas si quelqu'un ici pourra m'aider mais je garderai espoir

15
Ferdi van der Woerd

Vous devez d'abord définir un point de terminaison dans vos itinéraires pour l'appeler en utilisant ajax (axios dans votre cas):

Route::get('spreadsheet/download',[
   'as' => 'spreadsheet.download', 
   'uses' => 'SpreadsheetController@download'
]);

Dans votre contrôleur:

public function download ()
{
    $fileContents = Storage::disk('local')->get($pathToTheFile);
    $response = Response::make($fileContents, 200);
    $response->header('Content-Type', Storage::disk('local')->mimeType($pathToTheFile));
    return $response;
}

Si vous n'avez pas le fichier, vous pouvez l'enregistrer dans php: // sortie :

public function download ()
{
    $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, "Xlsx");
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename="file.xlsx"');
    $writer->save("php://output");
}

Il ne vous reste plus qu'à appeler le point de terminaison /spreadsheet/download pour démarrer le téléchargement, mais une normale <a href="/spreadsheet/download">Download</a> travaillerait.

J'espère que cela vous aidera.

30
Asur