PHPExcel写xlsx文件,允许内存大小

时间:2017-02-11 03:22:11

标签: php file codeigniter phpexcel xls

当我尝试使用PHPExcel生成大文件时,我收到此错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 67 bytes)

这是导致此问题的示例代码:

$CI = & get_instance ();
        $CI->load->library ( 'export/PHPExcel' );

        $objPHPExcel = new PHPExcel ();
        $objPHPExcel->setActiveSheetIndex ( 0 );

        $rowCount = 1; 
        $objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
        $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
        $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
    $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
    $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
    $objPHPExcel->getActiveSheet()->SetCellValue('A'.$rowCount,'title'.$rowCount);
    $objPHPExcel->getActiveSheet()->SetCellValue('B'.$rowCount,'title'.$rowCount);
    $objPHPExcel->getActiveSheet()->SetCellValue('C'.$rowCount,'title'.$rowCount);
    $objPHPExcel->getActiveSheet()->SetCellValue('D'.$rowCount,'title'.$rowCount);
    $objPHPExcel->getActiveSheet()->SetCellValue('E'.$rowCount,'title'.$rowCount);
    $objPHPExcel->getActiveSheet()->SetCellValue('F'.$rowCount,'title'.$rowCount);

    for($i=0; $i<1000000; $i++){ 
        $rowCount++;
        $objPHPExcel->getActiveSheet()->SetCellValue('A'.$rowCount, "xyz".$rowCount);
        $objPHPExcel->getActiveSheet()->SetCellValue('B'.$rowCount, "xyz".$rowCount);
        $objPHPExcel->getActiveSheet()->SetCellValue('C'.$rowCount, "xyz".$rowCount);
        $objPHPExcel->getActiveSheet()->SetCellValue('D'.$rowCount, "xyz".$rowCount);
        $objPHPExcel->getActiveSheet()->SetCellValue('E'.$rowCount, "xyz".$rowCount);
        $objPHPExcel->getActiveSheet()->SetCellValue('F'.$rowCount, "xyz".$rowCount);
    } 


    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="your_name.xls"');
    header('Cache-Control: max-age=0');  
    $objWriter = new PHPExcel_Writer_Excel2007 ( $objPHPExcel );
    $objWriter->save ( 'php://output' );

现在我的问题是当我想用PHPExcel生成大的xlsx文件时如何避免这个问题?或许你知道更好的那个?我无法更改apache / php配置以获得更多内存。解决方案不应该依赖于内存。

1 个答案:

答案 0 :(得分:0)

默认情况下,在将结果保存到文件或php://输出之前,PHPExcel使用内存进行缓存。 你可以切换到使用php_temp,这个速度较慢,但​​就RAM而言更便宜。

确保在创建PHPExcel实例之前设置设置:

    $cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
    $cacheSettings = ['memoryCacheSize' => '128MB'];
    \PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

    $excelObject = new \PHPExcel();

Threre也是cacheMethod可用的其他值,例如MemCache,APC,ISAM,尽管我还没有尝试过。您可以在\ PHPExcel_CachedObjectStorageFactory。

的文档中看到它们

希望它有所帮助。祝你好运!