phpExcel導出大量數據出現內存溢出錯誤的解決方法

咱們常常會使用phpExcel導入或導入xls文件,可是若是一次導出數據比較大就會出現內存溢出錯誤,下面我來總結解決辦法php


phpExcel將讀取的單元格信息保存在內存中,咱們能夠經過ajax

複製代碼代碼以下:數據庫


PHPExcel_Settings::setCacheStorageMethod()
json

來設置不一樣的緩存方式,已達到下降內存消耗的目的!緩存

一、將單元格數據序列化後保存在內存中app

複製代碼代碼以下:url


PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized; 
spa

二、將單元格序列化後再進行Gzip壓縮,而後保存在內存中excel

複製代碼代碼以下:code


PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 

三、緩存在臨時的磁盤文件中,速度可能會慢一些

複製代碼代碼以下:


PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

四、保存在php://temp

複製代碼代碼以下:


PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp; 

五、保存在memcache中

複製代碼代碼以下:


PHPExcel_CachedObjectStorageFactory::cache_to_memcache

舉例:

第4中方式:

 

複製代碼代碼以下:


$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;  
$cacheSettings = array( ' memoryCacheSize '  => '8MB'  
                );  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

第5種:

 

複製代碼代碼以下:


$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;  
$cacheSettings = array( 'memcacheServer'  => 'localhost',  
                        'memcachePort'    => 11211,  
                        'cacheTime'       => 600  
                      );  
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

其它的方法

第一個方法,你能夠考慮生成多個sheet的方式,不須要生成多個excel文件,根據你數據總量計算每一個sheet導出多少行, 下面是PHPExcel生成多個sheet方法:

面是PHPExcel生成多個sheet方法:

複製代碼代碼以下:


$sheet = $objPHPExcel->getActiveSheet(); 
$sheet->setCellValue('A1',$x);  
$sheet->setCellValue('B1',$y);

第二個方法,你能夠考慮ajax來分批導出,不用每次刷新頁面。

 

複製代碼代碼以下:


<a href="#" id="export">export to Excel</a> 
$('#export').click(function() {  
    $.ajax({  
        url: "export.php",   
        data: getData(),  //這個地方你也能夠在php裏獲取,通常讀數據庫  
        success: function(response){  
            window.location.href = response.url;  
        }  
    })  
});

複製代碼代碼以下:


<?php 
//export.php 
$data = $_POST['data'];
$xls = new PHPExcel(); 
$xls->loadData($formattedData);
$xls->exportToFile('excel.xls');
$response = array( 
'success' => true, 
'url' => $url 
); 
header('Content-type: application/json'); 
echo json_encode($response); 
?>

數據量很大的話,建議採用第二種方法,ajax來導出數據,上面方法簡單給了個流程,具體你本身補充!

相關文章
相關標籤/搜索