2011-12-06 51 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