发送 Excel 个文件而不在服务器上保存
Send Excel file without saving on server
我需要在创建后通过电子邮件发送一个excel文件,但不幸的是php没有在服务器中写入的权限,所以我需要在不保存文件的情况下发送它。通过浏览器是不可能的,因为你需要等待 excell 的创建并且数据库检索非常慢,所以我想知道是否有办法通过电子邮件直接发送它。我已经谷歌了一段时间但没有找到解决方案,非常感谢!
编辑以添加代码:
<?php
/** Include path **/
ini_set('include_path', ini_get('include_path').';../Classes/');
/** PHPExcel */
include (dirname(__FILE__)."/../../lib/PHPExcel.php");
/** PHPExcel_Writer_Excel2007 */
include (dirname(__FILE__)."/../../lib/PHPExcel/Writer/Excel2007.php");
/** Php Mailer */
require (dirname(__FILE__).'/../PHPMailer/class.phpmailer.php');
require '../mysqlvars.php';
require '../lib/db.php';
require '../lib/form_functions.php';
require 'includes/session.php';
require("classes.php");
$dbConn = connectDB($dbHost, $dbUser, $dbPass, $dbDB);
if (!$dbConn) {
die ('Cannot connect to database');
}
require 'includes/session.php';
require '../init.php';
require '../licence.php';
require("classes.php");
// Create new PHPExcel object
echo date('H:i:s') . " Create new PHPExcel object\n";
$objPHPExcel = new PHPExcel();
// Set properties
echo date('H:i:s') . " Set properties\n";
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
// Add some data
echo date('H:i:s') . " Add some data\n";
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');
// Rename sheet
echo date('H:i:s') . " Rename sheet\n";
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Save Excel 2007 file
echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save();
print_r('ok');die; //never prints nothing
?>
基于PHP_Excel on Github中的代码,您可以使用php://stdout
将文件写入标准输出。
因此理论上您可以使用输出缓冲将输出文件捕获到缓冲区中。
例如
ob_start();
$objWriter->save('php://stdout');
$excelFileContents = ob_get_clean();
请注意,进一步在 save() 方法中,它似乎对文件的压缩部分使用了文件系统方法。这是未经测试的。
然后您可以使用正确的 headers 将其输出到浏览器。根据 [MSDN 的 MIME 参考] (http://blogs.msdn.com/b/vsofficedeveloper/archive/2008/05/08/office-2007-open-xml-mime-types.aspx) for Office 2007,该代码可能如下所示:
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
echo $excelFileContents;
exit; // Exit here to prevent trailing echo/debug output from being appended to the file.
如果您使用这种方法,您将受到运行内存限制的限制,因此对于较大的文件这可能是个问题。
编辑:因为您要添加到电子邮件,所以您不需要直接回显文件,而是需要以类似的方式使用 phpmailer 将文件内容附加为multipart/mixed 电子邮件。
由于您没有在此处提供完整的代码片段,我的猜测是:
1st 你应该保存文件 as/into 变量,这里是一个例子:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_start();
$objWriter->save('php://output');
$excelOutput = ob_get_clean();
之后您应该将该文件附加为 BASE64 编码字符串:
我需要在创建后通过电子邮件发送一个excel文件,但不幸的是php没有在服务器中写入的权限,所以我需要在不保存文件的情况下发送它。通过浏览器是不可能的,因为你需要等待 excell 的创建并且数据库检索非常慢,所以我想知道是否有办法通过电子邮件直接发送它。我已经谷歌了一段时间但没有找到解决方案,非常感谢!
编辑以添加代码:
<?php
/** Include path **/
ini_set('include_path', ini_get('include_path').';../Classes/');
/** PHPExcel */
include (dirname(__FILE__)."/../../lib/PHPExcel.php");
/** PHPExcel_Writer_Excel2007 */
include (dirname(__FILE__)."/../../lib/PHPExcel/Writer/Excel2007.php");
/** Php Mailer */
require (dirname(__FILE__).'/../PHPMailer/class.phpmailer.php');
require '../mysqlvars.php';
require '../lib/db.php';
require '../lib/form_functions.php';
require 'includes/session.php';
require("classes.php");
$dbConn = connectDB($dbHost, $dbUser, $dbPass, $dbDB);
if (!$dbConn) {
die ('Cannot connect to database');
}
require 'includes/session.php';
require '../init.php';
require '../licence.php';
require("classes.php");
// Create new PHPExcel object
echo date('H:i:s') . " Create new PHPExcel object\n";
$objPHPExcel = new PHPExcel();
// Set properties
echo date('H:i:s') . " Set properties\n";
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
// Add some data
echo date('H:i:s') . " Add some data\n";
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');
// Rename sheet
echo date('H:i:s') . " Rename sheet\n";
$objPHPExcel->getActiveSheet()->setTitle('Simple');
// Save Excel 2007 file
echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save();
print_r('ok');die; //never prints nothing
?>
基于PHP_Excel on Github中的代码,您可以使用php://stdout
将文件写入标准输出。
因此理论上您可以使用输出缓冲将输出文件捕获到缓冲区中。
例如
ob_start();
$objWriter->save('php://stdout');
$excelFileContents = ob_get_clean();
请注意,进一步在 save() 方法中,它似乎对文件的压缩部分使用了文件系统方法。这是未经测试的。
然后您可以使用正确的 headers 将其输出到浏览器。根据 [MSDN 的 MIME 参考] (http://blogs.msdn.com/b/vsofficedeveloper/archive/2008/05/08/office-2007-open-xml-mime-types.aspx) for Office 2007,该代码可能如下所示:
header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
echo $excelFileContents;
exit; // Exit here to prevent trailing echo/debug output from being appended to the file.
如果您使用这种方法,您将受到运行内存限制的限制,因此对于较大的文件这可能是个问题。
编辑:因为您要添加到电子邮件,所以您不需要直接回显文件,而是需要以类似的方式使用 phpmailer 将文件内容附加为multipart/mixed 电子邮件。
由于您没有在此处提供完整的代码片段,我的猜测是:
1st 你应该保存文件 as/into 变量,这里是一个例子:
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_start();
$objWriter->save('php://output');
$excelOutput = ob_get_clean();
之后您应该将该文件附加为 BASE64 编码字符串: