文件大小不在使用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