我试图读取不那么大的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
答案 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