From 7201ddd088f9ebef1bebd4390ee1beea25901013 Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Thu, 5 May 2022 16:53:56 +0200 Subject: [PATCH 1/3] Update get cell logic in Cell Iterators --- src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php | 6 +++++- src/PhpSpreadsheet/Worksheet/RowCellIterator.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php b/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php index 9d0be5bd..2db4da37 100644 --- a/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php +++ b/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php @@ -120,7 +120,11 @@ class ColumnCellIterator extends CellIterator */ public function current(): ?Cell { - return $this->worksheet->getCellByColumnAndRow($this->columnIndex, $this->currentRow); + $cellAddress = Coordinate::stringFromColumnIndex($this->columnIndex) . $this->currentRow; + + return $this->worksheet->getCellCollection()->has($cellAddress) + ? $this->worksheet->getCellCollection()->get($cellAddress) + : $this->worksheet->createNewCell($cellAddress); } /** diff --git a/src/PhpSpreadsheet/Worksheet/RowCellIterator.php b/src/PhpSpreadsheet/Worksheet/RowCellIterator.php index a78765bd..72c0c9c1 100644 --- a/src/PhpSpreadsheet/Worksheet/RowCellIterator.php +++ b/src/PhpSpreadsheet/Worksheet/RowCellIterator.php @@ -123,7 +123,11 @@ class RowCellIterator extends CellIterator */ public function current(): ?Cell { - return $this->worksheet->getCellByColumnAndRow($this->currentColumnIndex, $this->rowIndex); + $cellAddress = Coordinate::stringFromColumnIndex($this->currentColumnIndex) . $this->rowIndex; + + return $this->worksheet->getCellCollection()->has($cellAddress) + ? $this->worksheet->getCellCollection()->get($cellAddress) + : $this->worksheet->createNewCell($cellAddress); } /** From 0dc1e9b07a12b101ed0df1629497b8de2ef3d456 Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Fri, 6 May 2022 11:43:10 +0200 Subject: [PATCH 2/3] Switch iterators to use foreach structure --- src/PhpSpreadsheet/Writer/Ods/Content.php | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/PhpSpreadsheet/Writer/Ods/Content.php b/src/PhpSpreadsheet/Writer/Ods/Content.php index 5d227c84..7e02fc51 100644 --- a/src/PhpSpreadsheet/Writer/Ods/Content.php +++ b/src/PhpSpreadsheet/Writer/Ods/Content.php @@ -8,6 +8,7 @@ use PhpOffice\PhpSpreadsheet\Cell\DataType; use PhpOffice\PhpSpreadsheet\Shared\XMLWriter; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Row; +use PhpOffice\PhpSpreadsheet\Worksheet\RowCellIterator; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Writer\Exception; use PhpOffice\PhpSpreadsheet\Writer\Ods; @@ -146,10 +147,10 @@ class Content extends WriterPart $numberRowsRepeated = self::NUMBER_ROWS_REPEATED_MAX; $span_row = 0; $rows = $sheet->getRowIterator(); - while ($rows->valid()) { + foreach ($rows as $row) { + $cellIterator = $row->getCellIterator(); --$numberRowsRepeated; - $row = $rows->current(); - if ($row->getCellIterator()->valid()) { + if ($cellIterator->valid()) { if ($span_row) { $objWriter->startElement('table:table-row'); if ($span_row > 1) { @@ -168,26 +169,23 @@ class Content extends WriterPart $span_row = 0; } $objWriter->startElement('table:table-row'); - $this->writeCells($objWriter, $row); + $this->writeCells($objWriter, $cellIterator); $objWriter->endElement(); } else { ++$span_row; } - $rows->next(); } } /** * Write cells of the specified row. */ - private function writeCells(XMLWriter $objWriter, Row $row): void + private function writeCells(XMLWriter $objWriter, RowCellIterator $cells): void { $numberColsRepeated = self::NUMBER_COLS_REPEATED_MAX; $prevColumn = -1; - $cells = $row->getCellIterator(); - while ($cells->valid()) { + foreach ($cells as $cell) { /** @var \PhpOffice\PhpSpreadsheet\Cell\Cell $cell */ - $cell = $cells->current(); $column = Coordinate::columnIndexFromString($cell->getColumn()) - 1; $this->writeCellSpan($objWriter, $column, $prevColumn); @@ -250,8 +248,8 @@ class Content extends WriterPart Comment::write($objWriter, $cell); $objWriter->endElement(); $prevColumn = $column; - $cells->next(); } + $numberColsRepeated = $numberColsRepeated - $prevColumn - 1; if ($numberColsRepeated > 0) { if ($numberColsRepeated > 1) { From f9d941a3af7253dcedaab44ef78a62270b0dfb7f Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Fri, 6 May 2022 12:08:26 +0200 Subject: [PATCH 3/3] Tweaks to HTML generation, accessing cells directly from the collection --- src/PhpSpreadsheet/Writer/Html.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/PhpSpreadsheet/Writer/Html.php b/src/PhpSpreadsheet/Writer/Html.php index 629e3c0c..555f4dc7 100644 --- a/src/PhpSpreadsheet/Writer/Html.php +++ b/src/PhpSpreadsheet/Writer/Html.php @@ -477,12 +477,8 @@ class Html extends BaseWriter $column = $minCol; while ($column <= $maxCol) { // Cell exists? - if ($sheet->cellExistsByColumnAndRow($column, $row)) { - $rowData[$column] = Coordinate::stringFromColumnIndex($column) . $row; - } else { - $rowData[$column] = ''; - } - ++$column; + $cellAddress = Coordinate::stringFromColumnIndex($column) . $row; + $rowData[$column++] = ($sheet->getCellCollection()->has($cellAddress)) ? $cellAddress : ''; } $html .= $this->generateRow($sheet, $rowData, $row - 1, $cellType); } @@ -1232,7 +1228,7 @@ class Html extends BaseWriter private function generateRowCellCss(Worksheet $worksheet, $cellAddress, $row, $columnNumber) { - $cell = ($cellAddress > '') ? $worksheet->getCell($cellAddress) : ''; + $cell = ($cellAddress > '') ? $worksheet->getCellCollection()->get($cellAddress) : ''; $coordinate = Coordinate::stringFromColumnIndex($columnNumber + 1) . ($row + 1); if (!$this->useInlineCss) { $cssClass = 'column' . $columnNumber;