【问题标题】:PHPExcel Force Download IssuePHPExcel强制下载问题
【发布时间】:2014-12-03 14:20:59
【问题描述】:

我知道这可能已被分几部分提出,但我找不到该问题的确切答案。我正在使用 PHPExcel 生成一个 Excel 文件(显然),并且代码可以生成文件,但是当我包含强制下载的代码时,它会损坏文件。我最新版本的脚本如下所示:

function make_xls_spreadsheet(){

/** Error reporting */
error_reporting(E_ALL);

/* Set the save path */
define('XLSX_SAVE_PATH', 'tmp/');

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');

/** PHPExcel */
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
include 'PHPExcel/Writer/Excel2007.php';


/* Create a new PHPExcel Object */
$objPHPExcel = new PHPExcel();


/* Add some metadata to the file */
$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.");

/* Set active worksheet to first */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Segments');

/* Add some data to the worksheet */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');


/* Write to server */
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

$filename = "tony1.xlsx";

// Works fine up to here

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
//$objWriter->save('php://output');
$objWriter->save(XLSX_SAVE_PATH . $filename);
readfile(XLSX_SAVE_PATH . $filename);


echo "DONE!";

$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);



}

请记住,当我删除强制代码部分时,文件会生成,我可以通过 FTP 将其下载下来。但是,生成和强制文件都会给我一个损坏的文件。通常我可以单击“打开和修复”(Office2011 MacOSX),但显然这是不可取的。

谁能帮我理解:

  1. 为什么它被生成为损坏?以及为什么在我不强制下载时它运行良好。
  2. 保存/强制的正确顺序是什么(使用 PHP 的 header() 函数)
  3. 如果有更好的方法来做到这一点。

非常感谢!!

**** 更新 **** 这是我点击“修复和修复”时的代码:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>Repair Result to tony1 03178.xml</logFileName>
    <summary>Errors were detected in file 'Macintosh HD:Users:tony.diloreto:Downloads:tony1.xlsx'</summary>
    <additionalInfo><info>Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.</info></additionalInfo>
</recoveryLog>

【问题讨论】:

  • 不要将其保存到文件中,而是将其保存到php://output,除非您需要本地副本然后$objWriter-&gt;save('php://output');
  • 谢谢 - 那我需要 readfile() 行吗?如果我这样做会怎样?
  • $objWriter = .. 之后的所有内容替换为$objWriter-&gt;save('php://output');
  • 没有骰子 - 脚本的新底部是:header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter-&gt;save('php://output'); return;
  • 仅供参考“没有骰子”和“关闭但没有雪茄”。对免费帮助有点屈尊

标签: php apache phpexcel xlsx force-download


【解决方案1】:

// 答案实际上属于@Dagon

答案其实很简单,只需要简单的exit(); 调用即可。

最终代码块:

function make_xls_spreadsheet(){

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');

/** PHPExcel */
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
include 'PHPExcel/Writer/Excel2007.php';


/* Create a new PHPExcel Object */
$objPHPExcel = new PHPExcel();

/** Determine filename **/
$filename = "tony1.xlsx";

/** Set header information **/
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');


/* Add some metadata to the file */
$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.");

/* Set active worksheet to first */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Segments');

/* Add some data to the worksheet */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');


header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');

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

exit();

}

【讨论】:

【解决方案2】:

这会将 excel 文件输出到浏览器:

readfile(XLSX_SAVE_PATH . $filename);  

然后你把它吐出来,它成为浏览器下载的excel文件的一部分

echo "DONE!";

基本上你是在发送

[excel data]DONE!

当 Excel 仅预期时

[excel data]

【讨论】:

  • 关闭但没有雪茄。它仍然说某些内容“不可读”,必须修复和修复。还有其他想法吗?
【解决方案3】:

尝试像这样修改 File.php :

受保护的静态 $_useUploadTempDirectory = TRUE;

在文件夹 phpexcel/Classes/PHPExcel/Shared 中(这不是最好的方法,但对我有用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多