PHPExcel保存时出错。

3

我正在使用PHPExcel导出报告。

当我在互联网上运行它时(使用PHP 5.6),它给了我一个错误。

但是,当我在本地主机上测试时,它很好。 完美地工作(使用PHP 5.4.31)

这是我的代码:

function downloadExcelBrand($brand,$tglAwal,$tglAkhir)
{

    $this->load->library('php_excel');

    $objPHPExcel = new PHPExcel(); 
    // print_r($objPHPExcel);die();
    $objPHPExcel->setActiveSheetIndex(0);

    $objPHPExcel->getActiveSheet()->SetCellValue('A1', "Concept");
    $objPHPExcel->getActiveSheet()->SetCellValue('B1', $brand);

    $objPHPExcel->getActiveSheet()->SetCellValue('A2', "Period");
    $objPHPExcel->getActiveSheet()->SetCellValue('B2', $tglAwal." to ".$tglAkhir);

    $objPHPExcel->getActiveSheet()->SetCellValue('A5', "Boutique");
    $objPHPExcel->getActiveSheet()->SetCellValue('B5', "Q1");
    $objPHPExcel->getActiveSheet()->SetCellValue('C5', "Q2");
    $objPHPExcel->getActiveSheet()->SetCellValue('D5', "Q3");
    $objPHPExcel->getActiveSheet()->SetCellValue('E5', "Q4");
    $objPHPExcel->getActiveSheet()->SetCellValue('F5', "BBC Score");

    $data = $this->surveymodel->getDataLaporanBrand($brand,$tglAwal,$tglAkhir);
    // print_r($data);die();
    $i = 5;
    foreach ($data as $index=>$value) {
        // print_r($data[$index+1]);die();
        if( $index%4 == 0){
            $i++;
            // print_r($value["Score"]);print_r($value['TotalData']);die();
            $AvgQ1 = $value["Score"] / $value['TotalData'];
            // print_r($AvgQ1);die();
            $AvgQ2 = $data[$index+1]["Score"]/$data[$index+1]['TotalData'];
            $AVGQ3 = $data[$index+2]["Score"]/$data[$index+2]['TotalData'];
            $AvgQ4 = $data[$index+3]["Score"]/$data[$index+3]['TotalData'];
            $BSC = $AvgQ1+$AvgQ2+$AVGQ3+$AvgQ4;

            $objPHPExcel->getActiveSheet()->SetCellValue('A'.$i, $value["boutiqueID"]);
            $objPHPExcel->getActiveSheet()->SetCellValue('B'.$i, $AvgQ1);
            $objPHPExcel->getActiveSheet()->SetCellValue('C'.$i, $AvgQ2);
            $objPHPExcel->getActiveSheet()->SetCellValue('D'.$i, $AVGQ3);
            $objPHPExcel->getActiveSheet()->SetCellValue('E'.$i, $AvgQ4);
            $objPHPExcel->getActiveSheet()->SetCellValue('F'.$i, $BSC);
        }
    }

    // Instantiate a Writer to create an OfficeOpenXML Excel .xlsx file
    $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
    // Write the Excel file to filename some_excel_file.xlsx in the current directory
    header('Content-type: application/vnd.ms-excel');
    // It will be called file.xls
    header('Content-Disposition: attachment; filename="Report_By_Brand.xlsx"');
    // Write file to the browser
    $objWriter->save('php://output');
}

当我删除$objWriter->save('php://output');代码时,奇怪的事情发生了。它要求保存Excel文件,但是Excel文件无法打开,因为它已经损坏了。
*编辑
错误信息为:

无法访问此网站 可能该网页http://my-link-in-here暂时无法正常运行,或者已永久移动到新网址。 ERR_INVALID_RESPONSE

*更新
  • 我尝试在 $objWriter->save('php://output'); 之前加入 ob_end_clean();ob_clean();,虽然能成功保存 Excel 文件,但是无法打开,Excel 显示“文件格式或扩展名不正确”。

  • 我尝试将 filename 属性中的 xlsx 扩展名更改为 xls,现在可以打开 Excel 文件了。但是出现了 PHP 错误 Message: ob_end_clean(): failed to delete buffer. No buffer to delete

  • 我尝试保留扩展名但删除了 ob_end_clean();,错误再次出现。

*解决方案:

  • I changed the code to be Excel5 like this

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="userList.xls"');
    

    And it works like champion. Anyone can make a explanation ? I will give the solution to the one who can make the explanation


错误信息是什么? - Beginner
这里是错误 @初学者 无法访问此网站。可能是该网页暂时不可用或已永久移至新的网址。 ERR_INVALID_RESPONSE - M Argus Chopin Gyver
我无法提供解释:但也许如果您查看日志文件,或者在文本编辑器中打开生成的文件以查看是否包含任何错误消息,它可能会为您提供解释。 - Mark Baker
你是指 @MarkBaker 的归档 zip 扩展吗? - M Argus Chopin Gyver
OfficeOpenXML格式是一组包含在zip归档中的XML文件,因此需要具备zip扩展的PHP。 - Mark Baker
显示剩余8条评论
5个回答

5
尝试安装ZipArchive类,例如 sudo apt-get install php7.0-zip。这可能是新服务器的问题。(对我来说就是这样)

那应该是一条注释。 - wayneOS
1
这是对@wayneOS问题的答案。 - Hermit
可以确认这个在7.4上可行。值得注意的是,根据其中一位维护者自己的评论,官方不支持>=7.1。 - joeljpa

4
我找到了一个解决方法,前往Classes/PHPExcel/Writer/Excel2007.php,注释掉以下代码行。由于PHP 7返回日期类型有点奇怪,所以这样做可以让PHPExcel在PHP 7中立即工作。无论如何。
$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);

to

//$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
//PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
//PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);

这对我很有帮助。


谢谢,这对我有用。我使用的是php7,可能在以下版本中ob_end_clean会起作用。 - narasimharaosp
谢谢,你救了我的夜晚 :-) 顺便说一下,我正在使用php7.2。 - lemk0

2

$writer输出保存到文件并重定向到该文件解决了我的问题。

我还将时间限制和内存限制设置得很高,以免引起任何问题。

代码:

        $writer = new PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); // instantiate Xlsx
        $writer->setPreCalculateFormulas(false);
        //ob_end_clean();
        set_time_limit(500);
        ini_set('memory_limit', '-1');
        $writer->save($filename . ".xlsx"); // save the file to root of project
        redirect('/' . $filename . ".xlsx"); // redirect the user to the file

1
我曾经遇到4000多行的同样问题。增加内存限制和时间限制解决了这个问题。
造成ERR_INVALID_RESPONSE行为的原因是您发送了xls/x标头,但由于内存或时间不足而出现http错误500。
set_time_limit(120);
ini_set('memory_limit', '256M');
...
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
$objWriter->save('php://output');
exit;

1

Add ob_end_clean()

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="Filename.xlsx"');
    header('Cache-Control: max-age=0');
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
    ob_end_clean();
    $objWriter->save('php://output');
    exit;

添加 ob_end_clean() 可以消除错误并允许文件下载。但是下载的文件仍然无法打开。它说,格式或文件扩展名无效。 - M Argus Chopin Gyver
如果您将 header('Content-type: application/vnd.ms-excel'); 更改为 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 会发生什么? - Jordan Sipahutar
仍然无法打开文件。它仍然显示相同的错误@Jordan Sipahutar http://imgur.com/a/ehsT6 - M Argus Chopin Gyver
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mark Baker
我写在头部属性中的代码有任何错误吗?@MarkBaker??我不明白为什么这在托管上会出错。因为在我的本地主机上它能够完美地工作。 - M Argus Chopin Gyver
我更新了问题。我对代码所做的任何更改都产生了不同的影响。但是它们都不是我的解决方案@MarkBaker - M Argus Chopin Gyver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接