检测到你已经读完了行

时间:2014-08-19 07:39:40

标签: php phpexcel

我使用自定义读取过滤器来读取块中的文件:

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: - ?

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

2 个答案:

答案 0 :(得分: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

中记录了这一点。

答案 1 :(得分:0)

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

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