使用PHPExcel将大文件导出到Excel

4
我将尝试使用PHPExcel库在PHP(Laravel4)中导出大约40,000行的Mysql数据。 以下是我的代码:
($patList是结果列的数组)
set_time_limit ( 3000 );

$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;

$cacheSettings = array( 'memoryCacheSize' => -1);

PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

$objPHPExcel = new PHPExcel();
$i = 1;
$patList = $result[0];

for ($r = 0; $r < count($patList); $r++) {

    $objPHPExcel->setActiveSheetIndex(0)

         ->setCellValue("A$i", $patList[$r][0])
         ->setCellValue("B$i", $patList[$r][1])
         ->setCellValue("C$i", $patList[$r][2])
         ->setCellValue("D$i", $patList[$r][1])
         ->setCellValue("E$i", $patList[$r][2])
         ->setCellValue("F$i", $patList[$r][1])
         ->setCellValue("G$i", $patList[$r][2])
         ->setCellValue("H$i", $patList[$r][2])
         ->setCellValue("I$i", $patList[$r][1])
         ->setCellValue("J$i", $patList[$r][2])
         ->setCellValue("K$i", $patList[$r][5]);
     $i++;
}

$objPHPExcel->getActiveSheet()->setTitle('Name of Sheet 1');

header('Content-Type: application/vnd.ms-excel'); 

header('Content-Disposition: attachment;filename="result.xls"');

header('Cache-Control: max-age=0');

ob_clean();

flush();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

$objWriter->save('php://output');

如果Excel表格中有3-4列,且有15000行,则以上代码可以正常运行。但是,如果行数增加到30000或列数增加到10,则无法生成Excel文件。


2
你是否遇到了任何错误?错误报告是否已启用?请确保你的脚本不会因为在内存中保存了非常大的变量而耗尽内存。 - Bogdan
1
尝试设置 ini_set('memory_limit', '1024M'); 或者您认为足够脚本使用的内存大小。 - Bogdan
1
是的,现在可以工作了!它消耗了228 MB的内存,这就是为什么它失败的原因。非常感谢:) - pallavi-Mindfire Solutions
1个回答

1
$cacheSettings = array( 'memoryCacheSize' => -1);

这样做不太明智...我甚至不知道使用-1的值是否有效;但如果有效,那就意味着你将所有数据都存储在内存中,而没有存储在php://temp中。

memoryCacheSize的值告诉缓存流在将数据切换到php://temp之前应该在内存中存储多少数据;因此,

$cacheSettings = array( 'memoryCacheSize' => '8MB');

会告诉缓存流使用8MB的内存,如果需要存储额外数据,则使用php://temp。


哦,这很有帮助。我已经将缓存大小增加到500M,但仍然失败了。因为内存限制本身不足。所以,现在在我将memory_limit设置为500M或1024M后,它可以工作! - pallavi-Mindfire Solutions

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