web-dev-qa-db-fra.com

Téléchargez le fichier PhpSpreadsheet sans l'enregistrer auparavant

J'utilise PhpSpreadsheet pour générer un fichier Excel dans Symfony 4. Mon code est:

$spreadsheet = $this->generateExcel($content);

$writer = new Xlsx($spreadsheet);
$filename = "myFile.xlsx";
$writer->save($filename); // LINE I WANT TO AVOID
$response = new BinaryFileResponse($filename);
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->setContentDisposition(
    ResponseHeaderBag::DISPOSITION_ATTACHMENT,
    $filename
);

Mais je ne veux pas enregistrer le fichier, puis le lire pour revenir à l'utilisateur. Je souhaite télécharger directement du contenu Excel. Y a-t-il un moyen de le faire?

J'ai cherché à générer un flux de contenu (comme cette réponse dit) mais je n'ai pas réussi.

Merci d'avance et désolé pour mon anglais

7
Genarito

Si je comprends bien, vous générez le contenu de votre code. Vous pouvez diffuser la réponse dans Symfony et configurer PhpSpreadsheet Writer pour enregistrer dans 'php: // output' (voir ici le document officiel Rediriger la sortie vers le navigateur Web d'un client ).

Voici un exemple de travail utilisant Symfony 4.1 et Phpspreadsheet 1.3:

<?php

namespace App\Controller;

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use PhpOffice\PhpSpreadsheet\Writer as Writer;

class TestController extends Controller
{


    /**
     * @Route("/save")
     */
    public function index()
    {

        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'Hello World !');

        $writer = new Writer\Xls($spreadsheet);

        $response =  new StreamedResponse(
            function () use ($writer) {
                $writer->save('php://output');
            }
        );
        $response->headers->set('Content-Type', 'application/vnd.ms-Excel');
        $response->headers->set('Content-Disposition', 'attachment;filename="ExportScan.xls"');
        $response->headers->set('Cache-Control','max-age=0');
        return $response;
    }
}
16
Florin Celeapca