$workbook = new PHPExcel();
$workbook->createSheet()->setTitle('whatt')->setCellValue('A1', 'Another sheet');
$workbook->createSheet()->setTitle('whatt')->setCellValue('A1', 'Another sheet');
$objWriter = new PHPExcel_Writer_Excel2007($workbook);
$objWriter->setOffice2003Compatibility(true);
ob_start();
$objWriter->save("php://output");
$contents = ob_get_contents();
ob_end_clean();
// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
$size = count($contents);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-Type: application/vnd.msexcel; charset=utf-8');
header("Content-Disposition: attachment; filename=\"test.xlsx\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: {$size}");
echo $contents;
exit;
當我下載片可以歸結爲1個字節,用一張紙,其中第一單元是「P」(因爲該文件只包含字母) 如果我註釋掉第二createSheet
線就可以完美運行。任何想法?爲什麼在PHPExcel中連續兩次調用createSheet損壞的文檔?
編輯
我接受低於告訴我這是不是PHPExcel的錯,這是不是問題的答案。 如果我刪除頭並保持輸出緩衝,作爲測試,它仍然有效。
ob_start();
$objWriter->save("php://output");
$contents = ob_get_contents();
ob_end_clean();
file_put_contents("/mypath/uploads/test.xlsx", $contents);
我可以下載文件沒問題。這導致我相信標題正以某種方式搞砸了,這是非常奇怪的,因爲如果我只用了一次createSheet就沒有問題。我想我會在這裏發佈,當我知道了。
....
我想出了爲什麼標題搞砸了。顯然使用count($contents)
添加了一張紙很好,但是添加了兩張紙,它只會返回1
。我將它更改爲strlen($contents)
,它工作。獎勵積分,如果有人可以告訴我爲什麼發生:)
重命名這兩張表不會改變任何內容。我正在緩衝輸出,因此我可以在輸出之前獲取標題大小,並強制下載信息而不先保存到文件系統。我會嘗試刪除輸出緩衝區並保存到文件系統作爲測試。 –
不使用輸出緩衝區肯定使它工作或標題。我不想將它保存到文件系統,但我必須弄清楚爲什麼會打破它。這是一個完整的其他問題,所以如果我無法弄清楚,我會在這裏發帖。無論哪種方式,你會得到這個答案:) –