我已经针对这个问题浏览了多个文档,并采用了这些步骤,但到目前为止都是徒劳的。我已经为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";
}
请以正确的方向引导我。非常感谢
答案 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取代。
这里要吸取的教训是,阅读文档要比编写这样的问题并等待有人回答要快得多。