【发布时间】: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),但显然这是不可取的。
谁能帮我理解:
- 为什么它被生成为损坏?以及为什么在我不强制下载时它运行良好。
- 保存/强制的正确顺序是什么(使用 PHP 的 header() 函数)
- 如果有更好的方法来做到这一点。
非常感谢!!
**** 更新 **** 这是我点击“修复和修复”时的代码:
<?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->save('php://output'); -
谢谢 - 那我需要 readfile() 行吗?如果我这样做会怎样?
-
将
$objWriter =.. 之后的所有内容替换为$objWriter->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->save('php://output'); return; -
仅供参考“没有骰子”和“关闭但没有雪茄”。对免费帮助有点屈尊
标签: php apache phpexcel xlsx force-download