Блок PhpOffice / PHPSpreadsheet возвращает слишком много строк - PullRequest
1 голос
/ 05 февраля 2020

Мне нужно прочитать очень большой лист Excel, и я пытаюсь использовать метод chunk в PHPOffice / PHPSpreadsheet.

Проблема, с которой я сталкиваюсь, заключается в том, что загрузчик возвращает непрерывно большее количество строк с каждым кусок. Я ожидаю получить только количество строк в chunkSize.

Вот соответствующий код

class chunkReadFilter implements IReadFilter
{
    private $_startRow = 0;

    private $_endRow = 0;

    public function setRows($startRow, $chunkSize)
    {
        $this->_startRow    = $startRow;
        $this->_endRow      = $startRow + $chunkSize;
        Log::info("_startRow: " . $this->_startRow . " _endRow: " . $this->_endRow);
    }

    public function readCell($column, $row, $worksheetName = '')
    {
        if (($row >= $this->_startRow && $row < $this->_endRow)) {
            return true;
        }
        return false;
    }
}


.....
$reader = IOFactory::createReaderForFile($filePath);
$chunkSize = 30;
$chunkFilter = new ChunkReadFilter();
$reader->setReadFilter($chunkFilter);
$reader->setReadDataOnly(true);


Log::info( ' ----- rows of data ' . $highestRow);
for ($startRow = 2; $startRow <= $highestRow; $startRow += $chunkSize) {

 Log::info('Loading WorkSheet using configurable filter for headings row 1 and for rows ' . $startRow . ' to ' . ($startRow + $chunkSize - 1));

 Log::info('reading chunk starting at row ' . $startRow . '-- chunk size ' . $chunkSize);

  $chunkFilter->setRows($startRow, $chunkSize);
  $spreadsheet = $reader->load($filePath);
  $spreadsheet->setActiveSheetIndexByName(ucfirst($which) . " Data");
  $records = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);

  Log::info("records count: " . count($records));

  foreach($records as $key => $record) {

    # code...

   }

  }
.....

Вывод журнала выглядит следующим образом. Как видите, records count увеличивается на chunkSize с каждой итерацией. Я получаю chunkSize строки данных и chunkSize * i пустых строк.

Где я ошибся? Почему я получаю все эти пустые строки?

[2020-02-04 15:35:25] local.INFO: Analysis file upload started 
[2020-02-04 15:35:26] local.INFO:  ----- rows of data 101  
[2020-02-04 15:35:26] local.INFO: Loading WorkSheet using configurable filter for headings row 1 and for rows 2 to 31  
[2020-02-04 15:35:26] local.INFO: reading chunk starting at row 2-- chunk size 30  
[2020-02-04 15:35:26] local.INFO: _startRow: 2 _endRow: 32  
[2020-02-04 15:35:26] local.INFO: records count: 30  
[2020-02-04 15:35:28] local.INFO: Loading WorkSheet using configurable filter for headings row 1 and for rows 32 to 61  
[2020-02-04 15:35:28] local.INFO: reading chunk starting at row 32-- chunk size 30  
[2020-02-04 15:35:28] local.INFO: _startRow: 32 _endRow: 62  
[2020-02-04 15:35:28] local.INFO: records count: 60  
[2020-02-04 15:35:32] local.INFO: Loading WorkSheet using configurable filter for headings row 1 and for rows 62 to 91  
[2020-02-04 15:35:32] local.INFO: reading chunk starting at row 62-- chunk size 30  
[2020-02-04 15:35:32] local.INFO: _startRow: 62 _endRow: 92  
[2020-02-04 15:35:32] local.INFO: records count: 90  
[2020-02-04 15:35:38] local.INFO: Loading WorkSheet using configurable filter for headings row 1 and for rows 92 to 121  
[2020-02-04 15:35:38] local.INFO: reading chunk starting at row 92-- chunk size 30  
[2020-02-04 15:35:38] local.INFO: _startRow: 92 _endRow: 122  
[2020-02-04 15:35:38] local.INFO: records count: 100  
[2020-02-04 15:35:45] local.INFO: DONE*************************************  

1 Ответ

1 голос
/ 05 февраля 2020

Чтение чанка не заполняет строки, но оставляет их пустыми.
Попробуйте установить $reader->setReadEmptyCells(false);

...