PHPExcel chunkReadFilter内存甚至无法使chunksize等于1行

时间:2015-12-24 07:51:58

标签: php memory phpexcel xlsx

我试图读取不那么大的XLSX文件(2Mb,30000行,17列) 我正在使用文档中提到的块读取器

...
require_once dirname(__FILE__) . '/PHPExcel/IOFactory.php';
PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
$filename = TMP . 'app.xlsx';
$sheetname = 'test_sheet'; 

require_once dirname(__FILE__) . '/PHPExcel/Filter.php'; // simple chunkReadFilter class
$chunkFilter = new chunkReadFilter();
$chunkSize = 1;
$startRow = 10;

$objReader = PHPExcel_IOFactory::createReader("Excel2007");
$objReader->setReadDataOnly(true);
$chunkFilter->setRows($startRow, $chunkSize); 
$objReader->setReadFilter($chunkFilter); 
$objReader->setLoadSheetsOnly( $sheetname );

$objPHPExcel = $objReader->load($filename); //memory limit fail
$sheetObj = $objPHPExcel->getActiveSheet();
var_dump($sheetObj);die();

当然我有for循环读取整个文件,但即使在这个测试用例中它也失败了。

Warning: simplexml_load_string() [function.simplexml-load-string]: (null)Entity: line 2: parser error : out of memory error in controllers/PHPExcel/Reader/Excel2007.php on line 652

Warning: simplexml_load_string() [function.simplexml-load-string]: v>579</v></c><c r="B5102" s="2" t="s"><v>688</v></c><c r="C5102" s="2" t="s"><v> in controllers/PHPExcel/Reader/Excel2007.php on line 652

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in controllers/PHPExcel/Reader/Excel2007.php on line 652

我读到了关于Spout的内容,但由于我的托管中的php 5.2.17版本,我无法使用它,我也无法添加像php_zip这样的扩展名。

此外,我的chunkReader总是读取文件的第一行(A1, B1, ...),甚至开始行等于10,我不知道如何处理它。

memory_limit = 256M

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我尝试使用块过滤器,但没有任何效果,所以我尝试使用setLoadSheetsOnly方法加载文件并且它有效,当然您需要在代码中逐页查看。

方法setLoadSheetsOnly可以接收方法getSheetNames($ objXLS-&gt; getSheetNames())返回的工作表的编号或名称

这是我的代码

$Reader = PHPExcel_IOFactory::createReaderForFile($file);
$Reader->setReadDataOnly(true); //optional
$Reader->setLoadSheetsOnly($nameOfSheet);
$objXLS = $Reader->load($file);


////// YOUR STUFF
$sheetObj=$objXLS->getSheetByName($nameOfSheet);
$limit=0;
$startFrom = 23; 
$rowCounter=$startFrom;

foreach($sheetObj->getRowIterator($startFrom, $limit) as $row )
{

    echo "<br>Reading row ".$rowCounter."<br>";

    foreach( $row->getCellIterator() as $cell )
    {
        $value = $cell->getCalculatedValue();
        echo $value."  ---  ";
    }
    $rowCounter++;
}
////// YOUR STUFF