我正面临一个问题。
我需要读取大约10MB的.xls文件。我写一个PHP代码,当我读小.xls文件时工作正常。但是当我尝试读取大文件时,浏览器在C:\ wamp \ www \ student \ ExcelRes \ PHPExcel \ Cell.php中显示“致命错误:允许的内存大小为134217728字节耗尽(试图分配1032字节)”在第1126行“
这是我的代码。
<?php
ini_set('memory_limit', '128M');
set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/');
include 'PHPExcel/IOFactory.php';
$inputFileName = 'ru_unit_H_all.xls';
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
echo $sheetData['20007'][ 'K']; //row colomn
?>
答案 0 :(得分:2)
错误信息应该是自我解释:
“致命错误:允许的内存大小为134217728字节耗尽(试图分配1032字节)在C:\ wamp \ www \ student \ ExcelRes \第1126行上的PHPExcel \ Cell.php“
你只是耗尽了为执行一个脚本而保留的内存。
您可以使用memory_limit
增加ini_set()
来解决此问题。
注意:使用128MB
是不够的,因为134217728B = ~128MB
仍然会导致错误。尝试使用512MB
。
我知道没有用于PHP的Excel读取器/写入器的内存有效实现。
答案 1 :(得分:0)
脚本可用的内存已经过了。默认情况下,我相信每个脚本都有8MB的内存限制。您正在尝试读取10MB文件,因此,没有足够的内存来处理请求并且它失败。
您可以尝试使用memory_limit
设置来增加可用内存量。
这可以在php.ini
设置文件中的所有脚本中全局完成,也可以使用
ini_set('memory_limit','16M');
其中16M
是16兆字节的内存。
答案 2 :(得分:0)
除了可能增加内存之外,您还应该查看PHPExcel提供的单元缓存选项以实现此目的,如标题为“单元缓存”(第4.2.1节)的开发人员文档部分所述
修改强>
你使用toArray()也会构建你在PHP内存中请求的数组,增加额外的开销 - 考虑一次一行地迭代工作表而不是将它加载到内存中(一次作为一个PHPExcel对象,一次作为你的数组)
答案 3 :(得分:0)
最后,我使用example12代码解决了我的问题。
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'ExcelRes/');
include 'PHPExcel/IOFactory.php';
$inputFileType = 'Excel5';
$inputFileName = 'ru_unit_H_all.xls';
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0;
private $_endRow = 0;
public function setRows($startRow)
{
$this->_startRow = $startRow;
}
public function readCell($column, $row, $worksheetName = '')
{
if (($row == 1) || ($row >= $this->_startRow ))
{
return true;
}
return false;
}
}
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$chunkFilter = new chunkReadFilter();
$objReader->setReadFilter($chunkFilter);
$chunkFilter->setRows(22000);
$objPHPExcel = $objReader->load($inputFileName);
echo $objPHPExcel->getActiveSheet()->getCell('K22000')->getValue();
}
?>