首页 文章

PHPExcel:为.xlsx,.ods和.pdf生成错误的二进制文件

提问于
浏览
2

我使用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上打开此文件或之后使用谷歌文档 .

有关更多信息,请在评论中提问,我将更新此帖子 .

1 回答

  • 0

    事实证明我的问题与链接的“可能重复”有些相关 . 我有一个中心的appIndex.php,其中包含了我需要的很多东西 . 然后,此中心站点包括我当前要执行的站点 - 例如excelExport.php .

    因为我的中心页面使用的是ob_start();和ob_end_flush();我的.xlsx和我的.ods导出无效 . 第二个我删除了ob_start()的使用;我的出口立即奏效 .

相关问题