如果使用PHPExcel时无法成功读取或处理大容量Excel文件的情况下,以下是一种可能的表述方式:当使用PHPExcel时,如果无法顺利读取或处理大容量的Excel文件
当尝试使用PHPExcel处理数千或数万行的Excel文件时,可能会输出”Allowed memory size of *** exhausted”的错误信息。在命令行环境下,有时还可能输出”Killed”并强制终止程序运行。
如果原因是超过内存使用量,可以通过以下方式处理。
仅读取必要的数据.
如果不需要装饰,如边框线或背景色,可以通过只加载单元格的值或公式(如SUM)以及只读取特定工作表来节省内存使用量。
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true); //罫線や背景色などの装飾を無視して、セルの値や式(SUMなど)のみを読み込む
$wsList = $objReader->listWorksheetNames($excelFile); //シート名を配列で取得
$objReader->setLoadSheetsOnly($wsList[0]); //シート名を指定して特定のシートのみ読み込む
//$objReader->setLoadSheetsOnly( array($wsList[0], $wsList[1]) );//複数シートを読み込む場合
在循环处理中,每次循环结束后释放内存。
複数のエクセルファイルに対してループで処理を行っている場合などは、ループ回数が増えるたびにメモリ使用量が増加していくので、1回のループが終了するたびに次を実行しメモリを解放する。
$objExcel->disconnectWorksheets();
unset($objExcel);
使用方法如下。
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
foreach($excelFiles as $excelFile){
$objExcel = $objReader->load($excelFile);
/* 何らかの処理 */
$objExcel->disconnectWorksheets();
unset($objExcel);
}
オブジェクトの保存先をメモリ以外にする
PHPExcel_CachedObjectStorageFactory で一時データの保存先をメモリ以外に変更する。
PHPExcel_CachedObjectStorageFactory::cache_in_memory
デフォルト。メモリにセルオブジェクトをそのままメモリに保存 PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized
シリアライズされたオブジェクト配列でメモリ上に保存
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip
cache_in_memory_serializedをさらにgzip圧縮して保存
PHPExcel_CachedObjectStorageFactory::cache_igbinary
igbinary拡張を用いて、メモリに保存
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM
一時ファイルに保存
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp
php://tempに保存
PHPExcel_CachedObjectStorageFactory::cache_to_apc
APCを利用して保存
PHPExcel_CachedObjectStorageFactory::cache_to_memcache
memcacheに保存
PHPExcel_CachedObjectStorageFactory::cache_to_wincache
wincacheに保存
PHPExcel_CachedObjectStorageFactory::cache_to_sqlite
PHPExcel_CachedObjectStorageFactory::cache_to_sqlite3
SQLiteに保存
//php://tempに保存する場合はキャッシュサイズを定義する
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '32MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
//一時ファイルに保存保存する場合は一時ファイルのパスを定義する
//$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
//$cacheSettings = array('dir' => '/tmp');
//PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objExcel = PHPExcel_IOFactory::load($excelFile);
PHPが確保できる最大メモリの値を上げる
可以通过ini_set、.htaccess、php.ini配置memory_limit。