Yii2中用PhpSpreadsheet生成Excel后直接传至邮件发送函数
问题:如何将PhpSpreadsheet生成的Excel转为附件传给邮件发送函数
我正在基于Yii2框架开发,使用PhpSpreadsheet生成Excel文件,当前实现的是在浏览器中直接下载该文件。现在希望不触发下载,而是将生成的Excel文件返回,传递给已配置好的sendEmail($filename)函数作为附件发送。现有代码如下:
// Created 2 worksheet in one excel file successfully $filename = 'Meter Breakdown List '.date('d-m-y').'.xlsx'; //save our workbook as this file name // Redirect output to a client’s web browser (Xlsx) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); // If you're serving to IE 9, then the following may be needed header('Cache-Control: max-age=1'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output');请问该如何实现这一需求?我已参考过Stack Overflow上的相关问题。
其实很简单,咱们只需要把原来输出到浏览器的Excel内容转存为可被邮件函数调用的形式就行,这里给你两种实用的实现方案:
方案一:保存到临时文件(适合仅接受文件路径的sendEmail函数)
如果你的sendEmail($filename)只认文件路径,那可以先把Excel保存到服务器临时目录,用完再删掉避免冗余:
// Created 2 worksheet in one excel file successfully $filename = 'Meter Breakdown List '.date('d-m-y').'.xlsx'; // 获取系统临时目录,避免权限问题 $tempFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $filename; // 移除所有浏览器下载相关的header代码,这些现在没用了 $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); // 保存Excel到临时文件 $writer->save($tempFilePath); // 调用邮件发送函数,传入临时文件路径 sendEmail($tempFilePath); // 发送完成后删除临时文件,释放空间 unlink($tempFilePath);
方案二:直接输出到内存(无需生成物理文件)
如果你的邮件函数支持直接传入文件内容,或者你不想生成物理文件,可以用输出缓冲捕获Excel内容:
// Created 2 worksheet in one excel file successfully $filename = 'Meter Breakdown List '.date('d-m-y').'.xlsx'; // 开启输出缓冲 ob_start(); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output'); // 捕获缓冲内容并关闭缓冲 $excelContent = ob_get_clean(); // 这里根据你的sendEmail函数调整参数,比如如果它支持传入文件名和内容: // sendEmail($filename, $excelContent); // 如果你用Yii2自带的邮件组件,还可以这样直接添加附件: Yii::$app->mailer->compose() ->setTo('收件人邮箱') ->setSubject('Meter Breakdown List') ->attachContent($excelContent, ['fileName' => $filename]) ->send();
注意事项
- 确保服务器临时目录有写入权限(方案一)
- 如果你的
sendEmail函数只接受文件路径,优先用方案一 - 用完临时文件记得删除,避免服务器磁盘被占满
内容的提问来源于stack exchange,提问作者Moeez
相关产品推荐
相关产品推荐

