使用PHPExcel库,我试图迭代大约1500行,每行有大约25列。
我正在使用此代码(取自PHPExcel runs out of 256, 512 and also 1024MB of RAM):
/** Create a new Reader of the type defined in $inputFileType **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
/** Define how many rows we want to read for each "chunk" **/
$chunkSize = 20;
/** Create a new Instance of our Read Filter **/
$chunkFilter = new chunkReadFilter();
/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/
$objReader->setReadFilter($chunkFilter);
/** Loop to read our worksheet in "chunk size" blocks **/
/** $startRow is set to 2 initially because we always read the headings in row #1 **/
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
/** Tell the Read Filter, the limits on which rows we want to read this iteration **/
$chunkFilter->setRows($startRow,$chunkSize);
/** Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/
$objPHPExcel = $objReader->load($inputFileName);
// Do some processing here
// Free up some of the memory
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
}
我想处理尽可能多的行有数据。我尝试使用Worksheet对象中的方法getHighestRow(),但它只是保持返回A1
我还尝试通过编写这个小函数来检查下一个检索到的行是否为空:
function _emptyRow($row) {
$empty=true;
foreach($row as $r) {
if ($r!='') {
$empty = false;
}
}
return $empty;
}
因此,如果_emptyRow()我将break
退出循环。这对我没用。
有人能建议只检索所有有数据的记录吗?当我运行它时,即使只有大约1500行有数据,它在超时之前达到大约23000(使用set_time_limit(240));
答案 0 :(得分:4)
我通常会这样做:
$objPHPExcel = $objReader->load($inputFileName);
$rows = count($objPHPExcel->getActiveSheet()->toArray());
for ($start_row = 1; $start_row < $rows; $start_row ++)
// ...
$excel->getActiveSheet()->toArray()
只返回数组中的每一行(包含数据)。
答案 1 :(得分:3)
对于1.7.6及更低版本,Christopher Mullins编写了a patch,允许您在阅读整个文件之前阅读工作表信息。此信息包括每个工作表的行数和列数,因此您可以使用此信息在“块读取”实际工作簿数据之前检索行数。
此补丁现已合并到最新的SVN代码中,因此将来它将成为PHPExcel核心的一部分。