PHPExcel:为.xlsx,.ods和.pdf

时间:2015-12-30 13:27:40

标签: php phpexcel dompdf

我使用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 :(得分:0)

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

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