excel - 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(),
]);
}
- 我分析表单的提交。
- 我创建电子表格
- 根据所需的文件类型,我初始化 $writer
- 在系统中创建临时文件
- 在系统的tmp目录下创建excel文件
- 将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;
解决方案
推荐阅读
- javascript - 为什么我的 JQuery 点击事件不起作用?
- php - 如果存在,则 text/plain 和 text/html 只能提供一次
- botframework - 如何将文件发送给 Teams 频道中的用户?
- python - 看不懂Python的代码行
- java - 将带有想象的java主体导出到带有图像的jar中
- database - 在数据框中查找特定项目
- ajax - 使用 ajax 和 django 进行第二次点击后,Div 显示/隐藏
- c# - 获取两个标签之间所有元素的列表
- r - 使用 dplyr 但至少保持组存在
- ruby - 主机名与服务器证书不匹配 - 使用旧的过期证书