如何在块循环中使用PHPExcel库确定文件的结尾?

时间:2012-04-02 07:29:04

标签: php phpexcel

使用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));

2 个答案:

答案 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核心的一部分。