2017-02-11 44 views
0

當我嘗試生成PHPExcel大文件,我得到這個錯誤:PHPExcel寫XLSX文件,允許內存大小

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配置以提供更多內存。解決方案不應該依賴於內存。

+0

php只能根據內存分配做很多事情。你試圖生成的文件超過了128MB(猜測你的當前限制),因此它不能這樣做。你不能提高你的內存限制在PHP?大多數(甚至共享)託管允許自定義php.ini,如果你沒有訪問服務器... –

+0

128 MB是相當糟糕的主機限制。你可以通過PHP來改變它嗎? '的ini_set( 'memory_limit的', '256M');'? – jtheman

回答

0

默認情況下,PHPExcel使用內存進行緩存,然後將結果保存到文件或php://輸出中。 您可以切換到使用php_temp,這是較慢,但在內存方面更便宜。

確保創建PHPExcel的實例之前設置的設置:

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

    $excelObject = new \PHPExcel(); 

Threre也可用於其他cacheMethod值,如內存緩存,APC,ISAM,雖然我還沒有嘗試過。你可以在\ PHPExcel_CachedObjectStorageFactory的文檔中看到它們。

希望它有幫助。祝你好運!