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

Dev*_*Dev 7 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";
}
Run Code Online (Sandbox Code Playgroud)

请引导我走向正确的方向。多谢

Syn*_*hro 8

这是输出缓冲问题,而不是电子邮件问题。你正在这样做:

$objWriter->save('php://output');
$data = ob_get_contents();
Run Code Online (Sandbox Code Playgroud)

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

如果要使用输出缓冲,则需要告诉 PHP在输出任何内容之前开始捕获输出。该函数的 PHP 文档对此进行了介绍- 这应该是您查找此类问题的第一个地方。将您的代码更改为:

ob_start();
$objWriter->save('php://output');
$data = ob_get_contents();
ob_end_clean();
Run Code Online (Sandbox Code Playgroud)

现在您已将 Excel 数据存储在字符串中,您可以将其传递给 PHPMailer。在您的代码中,您为此使用了错误的函数。正如文档所述,addAttachment期望第一个参数是文件的路径,但是您给它的是文件的内容,这是行不通的。您需要的方法是,它非常相似,但需要二进制数据作为第一个参数,如下所示:addStringAttachment()

$email->addStringAttachment($data, 'Inspection_Report.xls');
Run Code Online (Sandbox Code Playgroud)

我还要指出,您正在使用 phpExcel,它已过时且不再受支持;它已被phpSpreadsheet取代。

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

  • 您必须添加 `ob_end_clean()` 才能获得 php 脚本的干净输出,而不是获得 xls (2认同)