Мне нужно прочитать очень большой лист 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*************************************