我使用PHPExcel在一些大型数据阵列上生成.xlsx,.ods,.pdf和.cvs文件(对于.pdf使用DomPDF)。如果有问题,我会在他们的github页面和stackoverflow帖子上关注这些示例。我设法让.csv导出工作,但其余的不是。
运行.xlsx导出时,我得到一个无法在我的Mac上打开的.xlsx文件,也没有在谷歌文档中打开。所以我注释了php中的所有header()调用,以便查看任何PHP错误消息。事实证明没有,我在浏览器中获得了预期的.xlsx,.pdf或.ods二进制文件,即使我以后无法打开它们。所以我的脚本似乎正在以某种方式生成损坏的二进制文件。
我在这里做错了什么?以下代码用于我的.xlsx导出,.pdf / .ods导出的代码几乎相似。
$excel = new PHPExcel();
// Now set some meta data for that object
// ...
$cellRow = 2;
$cellColumn = "B";
// Add data to the excel file
foreach($entries as $entry) {
// ...
$cellColumn = "B";
$cellRow += 1;
}
// Export
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="export_' . $dateGenerated . '.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header('Expires: ' . gmdate('D, d M Y H:i:s'));
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: cache, must-revalidate');
header('Pragma: public');
$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
saveViaTempFile($writer);
saveViaTempFile()函数取自此stackoverflow帖子:PHPExcel_Writer_Exception with message "Could not close zip file php://output."以避免一些其他问题。
TLDR:我正在生成.xlsx,.ods,.pdf二进制文件,代码应该是正确的。二进制文件在某种程度上已损坏。我究竟做错了什么?谢谢!
编辑:根据要求提供更多信息:
我正在使用PHPExcel 1.8.1。与作曲家一起安装并使用require "vendor/autoload.php";
在我的本地脚本中导入我使用error_reporting(E_ALL);
而不是压抑任何东西。仍然没有显示任何单一的通知/错误。它只是简单地生成.xlsx然后我无法打开。
我正在使用的函数saveVieTempFile()是从上面链接的SO线程直接复制的:
static function saveViaTempFile($objWriter) {
$filePath = "tmp/" . rand(0, getrandmax()) . rand(0, getrandmax()) . ".tmp";
$objWriter->save($filePath);
readfile($filePath);
unlink($filePath);
}
是的,我将CHMOD(777)设置为/ tmp目录。否则我将无法实际接收二进制输出。
我甚至测试过如果只向文件添加非常简单的数据就像这样:
$excel->setActiveSheetIndex(0)->setCellValue("A3", "hello");
$excel->setActiveSheetIndex(0)->setCellValue("A4", "world");
$excel->setActiveSheetIndex(0)->setCellValue("A5", "this");
$excel->setActiveSheetIndex(0)->setCellValue("A6", "isn't");
$excel->setActiveSheetIndex(0)->setCellValue("C1", "working");
$excel->setActiveSheetIndex(0);
事实证明,即使这些简单的数据也未正确导出,我无法在我的Mac上或之后使用谷歌文档打开此文件。
如需了解更多信息,请在评论中提问,我将更新此帖。
答案 0 :(得分:0)
原来我的问题与链接的“可能重复”帖子有些相关。我有一个中心appIndex.php,其中包含了我需要的很多东西。然后,此中心站点包括我当前要执行的站点 - 例如excelExport.php。
因为我的中心页面使用的是ob_start();和ob_end_flush();我的.xlsx和我的.ods导出无效。第二个我删除了ob_start()的使用;我的出口立即奏效了。