2012-06-05 49 views
0
$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),它工作。獎勵積分,如果有人可以告訴我爲什麼發生:)

回答

0

不知道沒有很多調試。擺脫冗餘輸出緩衝,並且工作。這是你的問題的原因,在PHPExcel中沒有。 那麼你在做什麼隨後與$內容?

在一行中調用createSheet()兩次不會破壞任何東西:儘管爲什麼要創建包含兩個具有相同標題的工作表的工作簿呢? PHPExcel實際上將第二個添加的工作表重命名爲whatt2以避免問題。

+0

重命名這兩張表不會改變任何內容。我正在緩衝輸出,因此我可以在輸出之前獲取標題大小,並強制下載信息而不先保存到文件系統。我會嘗試刪除輸出緩衝區並保存到文件系統作爲測試。 –

+0

不使用輸出緩衝區肯定使它工作或標題。我不想將它保存到文件系統,但我必須弄清楚爲什麼會打破它。這是一個完整的其他問題,所以如果我無法弄清楚,我會在這裏發帖。無論哪種方式,你會得到這個答案:) –

相關問題