创建Excel文件,然后使用phpmailer作为附件发送

时间:2018-09-05 12:48:22

标签: php excel phpmailer phpspreadsheet

我已经针对这个问题浏览了多个文档,并采用了这些步骤,但到目前为止都是徒劳的。我已经为excel文件编写了代码,但是我想在同一文件中获取其内容,并使用PHPMailer函数将它们用作excel文件的附件。

下面是创建excel文件后使用的代码:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 
$objWriter->save('php://output');

$data = ob_get_contents();

$email->SetFrom('sample@gmail.com', 'Talal Haider'); //Name is optional
$email->Subject   = 'Test Mail';
$email->Body      = 'Simple Test Email';
$email->AddAddress( 'sample@gmail.com' );
//$email->AddAddress( 'rimsha.cheema@gmail.com' );

$email->AddAttachment($data, 'Inspection_Report.xls' );

if($email->Send()){
    echo "Mail Sent";
} else{
    echo "Mail Failed";
}

请以正确的方向引导我。非常感谢

1 个答案:

答案 0 :(得分:1)

这是输出缓冲问题,而不是电子邮件问题。您正在执行此操作:

$objWriter->save('php://output');
$data = ob_get_contents();

表示“将生成的Excel文件直接输出到浏览器”,然后“获取输出缓冲区的内容”。但是到第二步发生时,已经太晚了,因为该文件已经发送到浏览器,这就是您看到它的原因。

如果要使用输出缓冲,则需要告诉PHP开始在输出任何内容之前 捕获输出。 the PHP docs for this function对此进行了介绍-应该是查找此类问题的第一位。将您的代码更改为此:

ob_start();
$objWriter->save('php://output');
$data = ob_get_contents();
ob_end_clean();

现在您已经在字符串中包含了Excel数据,您可以将其传递给PHPMailer。在您的代码中,您为此使用了错误的函数。 addAttachment期望第一个参数是文件as the documentation says的路径,但是您正在为其提供文件的内容,这将不起作用。您需要的方法是addStringAttachment(),它非常相似,但是expects binary data as the first param像这样:

$email->addStringAttachment($data, 'Inspection_Report.xls');

我还要注意,您正在使用phpExcel,它已经过时了,不再受支持;它已被phpSpreadsheet取代。

这里要吸取的教训是,阅读文档要比编写这样的问题并等待有人回答要快得多。