代码之家  ›  专栏  ›  技术社区  ›  Álvaro González

检测到您已完成读取行

  •  0
  • Álvaro González  · 技术社区  · 10 年前

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

    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 回复  |  直到 10 年前
        1
  •  1
  •   Mark Baker    10 年前

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

    每个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

        2
  •  0
  •   elboletaire    10 年前

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

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