Skip to content

Commit d4f6e78

Browse files
authored
Merge branch 'master' into Performance-Ods-Writer
2 parents f9d941a + ea165dc commit d4f6e78

File tree

4 files changed

+41
-26
lines changed

4 files changed

+41
-26
lines changed

src/PhpSpreadsheet/Worksheet/CellIterator.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Iterator;
66
use PhpOffice\PhpSpreadsheet\Cell\Cell;
7+
use PhpOffice\PhpSpreadsheet\Collection\Cells;
78

89
/**
910
* @template TKey
@@ -18,6 +19,13 @@ abstract class CellIterator implements Iterator
1819
*/
1920
protected $worksheet;
2021

22+
/**
23+
* Cell Collection to iterate.
24+
*
25+
* @var Cells
26+
*/
27+
protected $cellCollection;
28+
2129
/**
2230
* Iterate only existing cells.
2331
*
@@ -31,7 +39,7 @@ abstract class CellIterator implements Iterator
3139
public function __destruct()
3240
{
3341
// @phpstan-ignore-next-line
34-
$this->worksheet = null;
42+
$this->worksheet = $this->cellCollection = null;
3543
}
3644

3745
/**

src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@ class ColumnCellIterator extends CellIterator
4242
/**
4343
* Create a new row iterator.
4444
*
45-
* @param Worksheet $subject The worksheet to iterate over
45+
* @param Worksheet $worksheet The worksheet to iterate over
4646
* @param string $columnIndex The column that we want to iterate
4747
* @param int $startRow The row number at which to start iterating
4848
* @param int $endRow Optionally, the row number at which to stop iterating
4949
*/
50-
public function __construct(Worksheet $subject, $columnIndex = 'A', $startRow = 1, $endRow = null)
50+
public function __construct(Worksheet $worksheet, $columnIndex = 'A', $startRow = 1, $endRow = null)
5151
{
5252
// Set subject
53-
$this->worksheet = $subject;
53+
$this->worksheet = $worksheet;
54+
$this->cellCollection = $worksheet->getCellCollection();
5455
$this->columnIndex = Coordinate::columnIndexFromString($columnIndex);
5556
$this->resetEnd($endRow);
5657
$this->resetStart($startRow);
@@ -96,7 +97,10 @@ public function resetEnd($endRow = null)
9697
*/
9798
public function seek(int $row = 1)
9899
{
99-
if ($this->onlyExistingCells && !($this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $row))) {
100+
if (
101+
$this->onlyExistingCells &&
102+
(!$this->cellCollection->has(Coordinate::stringFromColumnIndex($this->columnIndex) . $row))
103+
) {
100104
throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist');
101105
}
102106
if (($row < $this->startRow) || ($row > $this->endRow)) {
@@ -122,8 +126,8 @@ public function current(): ?Cell
122126
{
123127
$cellAddress = Coordinate::stringFromColumnIndex($this->columnIndex) . $this->currentRow;
124128

125-
return $this->worksheet->getCellCollection()->has($cellAddress)
126-
? $this->worksheet->getCellCollection()->get($cellAddress)
129+
return $this->cellCollection->has($cellAddress)
130+
? $this->cellCollection->get($cellAddress)
127131
: $this->worksheet->createNewCell($cellAddress);
128132
}
129133

@@ -140,12 +144,13 @@ public function key(): int
140144
*/
141145
public function next(): void
142146
{
147+
$columnAddress = Coordinate::stringFromColumnIndex($this->columnIndex);
143148
do {
144149
++$this->currentRow;
145150
} while (
146151
($this->onlyExistingCells) &&
147-
(!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->currentRow)) &&
148-
($this->currentRow <= $this->endRow)
152+
($this->currentRow <= $this->endRow) &&
153+
(!$this->cellCollection->has($columnAddress . $this->currentRow))
149154
);
150155
}
151156

@@ -154,12 +159,13 @@ public function next(): void
154159
*/
155160
public function prev(): void
156161
{
162+
$columnAddress = Coordinate::stringFromColumnIndex($this->columnIndex);
157163
do {
158164
--$this->currentRow;
159165
} while (
160166
($this->onlyExistingCells) &&
161-
(!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->currentRow)) &&
162-
($this->currentRow >= $this->startRow)
167+
($this->currentRow >= $this->startRow) &&
168+
(!$this->cellCollection->has($columnAddress . $this->currentRow))
163169
);
164170
}
165171

@@ -177,14 +183,15 @@ public function valid(): bool
177183
protected function adjustForExistingOnlyRange(): void
178184
{
179185
if ($this->onlyExistingCells) {
186+
$columnAddress = Coordinate::stringFromColumnIndex($this->columnIndex);
180187
while (
181-
(!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->startRow)) &&
188+
(!$this->cellCollection->has($columnAddress . $this->startRow)) &&
182189
($this->startRow <= $this->endRow)
183190
) {
184191
++$this->startRow;
185192
}
186193
while (
187-
(!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->endRow)) &&
194+
(!$this->cellCollection->has($columnAddress . $this->endRow)) &&
188195
($this->endRow >= $this->startRow)
189196
) {
190197
--$this->endRow;

src/PhpSpreadsheet/Worksheet/RowCellIterator.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public function __construct(Worksheet $worksheet, $rowIndex = 1, $startColumn =
5151
{
5252
// Set subject and row index
5353
$this->worksheet = $worksheet;
54+
$this->cellCollection = $worksheet->getCellCollection();
5455
$this->rowIndex = $rowIndex;
5556
$this->resetEnd($endColumn);
5657
$this->resetStart($startColumn);
@@ -97,15 +98,14 @@ public function resetEnd($endColumn = null)
9798
*/
9899
public function seek(string $column = 'A')
99100
{
100-
$columnx = $column;
101-
$column = Coordinate::columnIndexFromString($column);
102-
if ($this->onlyExistingCells && !($this->worksheet->cellExistsByColumnAndRow($column, $this->rowIndex))) {
101+
$columnId = Coordinate::columnIndexFromString($column);
102+
if ($this->onlyExistingCells && !($this->cellCollection->has($column . $this->rowIndex))) {
103103
throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist');
104104
}
105-
if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) {
106-
throw new PhpSpreadsheetException("Column $columnx is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})");
105+
if (($columnId < $this->startColumnIndex) || ($columnId > $this->endColumnIndex)) {
106+
throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})");
107107
}
108-
$this->currentColumnIndex = $column;
108+
$this->currentColumnIndex = $columnId;
109109

110110
return $this;
111111
}
@@ -125,8 +125,8 @@ public function current(): ?Cell
125125
{
126126
$cellAddress = Coordinate::stringFromColumnIndex($this->currentColumnIndex) . $this->rowIndex;
127127

128-
return $this->worksheet->getCellCollection()->has($cellAddress)
129-
? $this->worksheet->getCellCollection()->get($cellAddress)
128+
return $this->cellCollection->has($cellAddress)
129+
? $this->cellCollection->get($cellAddress)
130130
: $this->worksheet->createNewCell($cellAddress);
131131
}
132132

@@ -145,7 +145,7 @@ public function next(): void
145145
{
146146
do {
147147
++$this->currentColumnIndex;
148-
} while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex <= $this->endColumnIndex));
148+
} while (($this->onlyExistingCells) && (!$this->cellCollection->has(Coordinate::stringFromColumnIndex($this->currentColumnIndex) . $this->rowIndex)) && ($this->currentColumnIndex <= $this->endColumnIndex));
149149
}
150150

151151
/**
@@ -155,7 +155,7 @@ public function prev(): void
155155
{
156156
do {
157157
--$this->currentColumnIndex;
158-
} while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex >= $this->startColumnIndex));
158+
} while (($this->onlyExistingCells) && (!$this->cellCollection->has(Coordinate::stringFromColumnIndex($this->currentColumnIndex) . $this->rowIndex)) && ($this->currentColumnIndex >= $this->startColumnIndex));
159159
}
160160

161161
/**
@@ -180,10 +180,10 @@ public function getCurrentColumnIndex(): int
180180
protected function adjustForExistingOnlyRange(): void
181181
{
182182
if ($this->onlyExistingCells) {
183-
while ((!$this->worksheet->cellExistsByColumnAndRow($this->startColumnIndex, $this->rowIndex)) && ($this->startColumnIndex <= $this->endColumnIndex)) {
183+
while ((!$this->cellCollection->has(Coordinate::stringFromColumnIndex($this->startColumnIndex) . $this->rowIndex)) && ($this->startColumnIndex <= $this->endColumnIndex)) {
184184
++$this->startColumnIndex;
185185
}
186-
while ((!$this->worksheet->cellExistsByColumnAndRow($this->endColumnIndex, $this->rowIndex)) && ($this->endColumnIndex >= $this->startColumnIndex)) {
186+
while ((!$this->cellCollection->has(Coordinate::stringFromColumnIndex($this->endColumnIndex) . $this->rowIndex)) && ($this->endColumnIndex >= $this->startColumnIndex)) {
187187
--$this->endColumnIndex;
188188
}
189189
}

tests/PhpSpreadsheetTests/Worksheet/ColumnCellIteratorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public function testSeekNotExisting(): void
112112
$iterator->seek(2);
113113
}
114114

115-
public function xtestPrevOutOfRange(): void
115+
public function testPrevOutOfRange(): void
116116
{
117117
$spreadsheet = new Spreadsheet();
118118
$sheet = self::getPopulatedSheet($spreadsheet);

0 commit comments

Comments
 (0)