首页 > 解决方案 > Phpspreadsheet:下载不适用于 .csv 和 .pdf 文件

问题描述

我使用 Symfony 4 框架。我的目标是能够以不同的可能格式(xlsx、ods、csv、pdf)导出数据。

在我的控制器中,我这样做了:

    /**
         * Permet d'exporter des données.
         *
         * @Route("rh/export", name="rh_export")
         */
        public function export(Request $request, ExportService $exportService)
        {
            $exportExcel = new ExportExcel();

            $form = $this->createForm(ExportExcelType::class, $exportExcel);
            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $spreadsheet = $exportService->export($exportExcel);

                switch($exportExcel->getExtension())
                {
                    case "xlsx":
                        $writer = new Xlsx($spreadsheet);
                    break;

                    case "csv":
                        $writer = new Csv($spreadsheet);
                    break;

                    case "ods":
                        $writer = new Ods($spreadsheet);
                    break;

                    case "pdf":
                        $writer = new Dompdf($spreadsheet);
                    break;

                    default:
                        $writer = new Xlsx($spreadsheet);
                    break;
                }

                if($exportExcel->getExtension() === "pdf")
                {
                    $writer->writeAllSheets();
                }

                // Create a Temporary file in the system
                $fileName = $exportExcel->getNomFichier().'.' . $exportExcel->getExtension();
                $temp_file = tempnam(sys_get_temp_dir(), $fileName);

                // Create the excel file in the tmp directory of the system
                $writer->save($temp_file);

                // Return the excel file as an attachment
                return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
            }

            return $this->render('rh/export.html.twig', [
                'form' => $form->createView(),
            ]);
        }
  1. 我分析表单的提交。
  2. 我创建电子表格
  3. 根据所需的文件类型,我初始化 $writer
  4. 在系统中创建临时文件
  5. 在系统的tmp目录下创建excel文件
  6. 将excel文件作为附件返回

奇怪的是,当文件类型为.xlsx 或.ods 时,文件下载正确。但是,如果它是 .csv 或 .pdf,则不会下载该文件,而是在我的浏览器中打开

编辑:我解决了我的问题:

代替 :

 // Create a Temporary file in the system
                $fileName = $exportExcel->getNomFichier().'.' . $exportExcel->getExtension();
                $temp_file = tempnam(sys_get_temp_dir(), $fileName);

                // Create the excel file in the tmp directory of the system
                $writer->save($temp_file);

                // Return the excel file as an attachment
                return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);

经过

$response =  new StreamedResponse(
                function () use ($writer) {
                    $writer->save('php://output');
                }
            );

            $fileName = $exportExcel->getNomFichier().'.' . $exportExcel->getExtension();
            $response->headers->set('Content-Type', 'application/vnd.ms-excel');
            $response->headers->set('Content-Disposition', sprintf('attachment;filename="%s"', $fileName));
            $response->headers->set('Cache-Control','max-age=0');
            return $response;

标签: excelfiledownloadphpspreadsheet

解决方案


推荐阅读