检测您已完成读取行


Detect you're done reading rows

我使用一个自定义读取过滤器读取文件块:

class chunkReadFilter implements PHPExcel_Reader_IReadFilter{
    private $start_row, $end_row, $chunk_size;
    public function __construct($chunk_size, $start_row=1){
        $this->chunk_size = $chunk_size;
        $this->start_row = $start_row;
        $this->end_row = $start_row+$chunk_size-1;
    }
    public function moveCursor(){
        $this->start_row += $this->chunk_size;
        $this->end_row += $this->chunk_size;
    }
    public function readCell($column, $row, $worksheetName = ''){
        return $row>=$this->start_row && $row<=$this->end_row;
    }
}

我的问题是我不确定知道如何检测我已经完成了。示例和文档总是硬编码最大行:

for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) { 
} 

PHPExcel_Worksheet::getHighestRow()PHPExcel_Worksheet::getHighestDataRow()方法似乎对过滤数据(某种程度上)有效。例如,在一个200行的文件中:

  • 如果我读取从100到120行,我得到120
  • 如果我试图读取从300到320的行,我得到1:-?

停止循环的最好方法是什么?

停止循环的最好方法是首先知道应该读取多少行。

在每个Reader中都有一个辅助方法,它将提供有关文件的一些基本元数据,而无需加载所有元数据。

循环开始前:

$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$worksheetData = $objReader->listWorksheetInfo($inputFileName);
echo '<h3>Worksheet Information</h3>';
echo '<ol>';
foreach ($worksheetData as $worksheet) {
    echo '<li>', $worksheet['worksheetName'], '<br />';
    echo 'Rows: ', $worksheet['totalRows'], 
        ' Columns: ', $worksheet['totalColumns'], '<br />';
    echo 'Cell Range: A1:', 
        $worksheet['lastColumnLetter'], $worksheet['totalRows'];
    echo '</li>';
}
echo '</ol>';

这在阅读电子表格文件的用户文档的第7节和Examples/Reader/exampleReader19.php

中有记录

循环遍历单元格的最佳方法是使用getRowIteratorgetCellIterator:

$rows  = $sheet->getRowIterator();
foreach ($rows as $r => $row) {
    $cells = $row->getCellIterator();
    foreach ($cells as $c => $cell) {
         $value = $cell->getValue();
    }
}