2011-12-06 77 views
4

我在使用PHPExcel類在PHP中導出數據從MySQL表。 PHP頁面簡單地像一個循環寫入Excel數據:PHP導出巨大的Excel文件

$objPHPExcel = new PHPExcel(); 
# Query result goes to array $result 
# ... 
$i = 1; 
for ($r = 0; $r < count($result); $r++) { 
     # Set $value1, $value2, $value3 from $result 
     $objPHPExcel->setActiveSheetIndex(0) 
      ->setCellValue("A$i", $value1) 
      ->setCellValue("B$i", $value2) 
      ->setCellValue("C$i", $value3); 
     $i++; 
} 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
$objWriter->save("/path/to/exported_file.xlsx"); 

此代碼工作正常時,導出的文件不是很大。我能夠輸出大約10,000條記錄。但是,當文件變大(從查詢返回更多記錄)時,出現以下錯誤。

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 71 bytes) 

/etc/php5/apache2/php.ini增加內存限制1024M。即使增加後,我仍然得到這個錯誤。

我試圖通過在SELECT聲明中追加LIMIT來限制查詢結果,而不是通過限制查詢結果來創建多個excel文件,但這也沒有解決問題。

任何想法如何解決這個問題?

我在ubuntu服務器上運行php-5.2.4和apache-2.2.8。

+0

您需要創建Excel文件的哪些功能? csv會不夠嗎?其次「xlsx」文件往往是最大的 - 你可以使用二進制文件(xls或xlsb)嗎? – Juliusz

回答

3
  1. 使用PHPExcel的細胞緩存(如果你沒有的話)
  2. 不要通過數據庫查詢結果集循環數組填充 ,然後 填入PHPExcel循環訪問該數組;直接通過循環訪問PHPExcel 查詢結果集
+0

我使用了第二點並將文件導出爲csv。它在服務器上輕得多。 – Khaled