文件大小不在使用PHPExcel時對於工作簿文件來說是一個很好的方法。行數和列數(即單元格)更重要。
PHPExcel代碼本身的佔用空間爲10到25MB,具體取決於正在訪問的組件。
目前,工作簿中的每個單元平均需要1k的內存(沒有任何緩存)或1.6k的64位PHP--我暫時假設32位PHP--因此(例如)a 8000行31列(248,000個單元)的工作表大約242MB。使用單元格緩存(例如php:// temp或DiskISAM)可以減少約三分之一,因此8000行×31列將需要大約80MB。
有許多可用來幫助您減少內存使用選項:
是否使用電池緩存與PHPExcel?
require_once './Classes/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array(' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load("test.xlsx");
如果你只需要訪問您的工作表數據,並且不需要訪問單元格格式,則可以禁用閱讀從工作簿中的格式信息:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
如果您只需要訪問一些,但不是所有工作簿中的工作表,您可以加載只有那些工作表:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly(array("Worksheet1", "Worksheet2"));
$objPHPExcel = $objReader->load("test.xlsx");
,如果你只想工作表中讀取某些細胞,你ç添加一個過濾器:
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
public function readCell($column, $row, $worksheetName = '') {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadFilter(new MyReadFilter());
$objPHPExcel = $objReader->load("test.xlsx");
所有這些技術都可以顯着減少內存需求。
找出在Excel中使用這麼多的內存,然後修復它..... – SoapBox 2010-08-21 12:27:24
@SoapBox:總之,PHPExcel - 它是一個真正的內存豬:(而且,它是一種複雜的庫,所以發現(更不用說修復)一個錯誤是非常重要的,在最壞的情況下,迴避這個問題並找到一些替代庫可能會更容易 – Piskvor 2010-08-21 15:01:37
成爲微軟認證的,它只需要知道如何重啓機器。將釋放被泄漏軟件使用的內存 – 2010-08-21 16:46:15