@@ -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 )) {
@@ -120,7 +124,11 @@ public function rewind(): void
120124 */
121125 public function current (): ?Cell
122126 {
123- return $ this ->worksheet ->getCellByColumnAndRow ($ this ->columnIndex , $ this ->currentRow );
127+ $ cellAddress = Coordinate::stringFromColumnIndex ($ this ->columnIndex ) . $ this ->currentRow ;
128+
129+ return $ this ->cellCollection ->has ($ cellAddress )
130+ ? $ this ->cellCollection ->get ($ cellAddress )
131+ : $ this ->worksheet ->createNewCell ($ cellAddress );
124132 }
125133
126134 /**
@@ -136,12 +144,13 @@ public function key(): int
136144 */
137145 public function next (): void
138146 {
147+ $ columnAddress = Coordinate::stringFromColumnIndex ($ this ->columnIndex );
139148 do {
140149 ++$ this ->currentRow ;
141150 } while (
142151 ($ this ->onlyExistingCells ) &&
143- (! $ this ->worksheet -> cellExistsByColumnAndRow ( $ this -> columnIndex , $ this ->currentRow ) ) &&
144- ($ this ->currentRow <= $ this ->endRow )
152+ ($ this ->currentRow <= $ this ->endRow ) &&
153+ (! $ this ->cellCollection -> has ( $ columnAddress . $ this ->currentRow ) )
145154 );
146155 }
147156
@@ -150,12 +159,13 @@ public function next(): void
150159 */
151160 public function prev (): void
152161 {
162+ $ columnAddress = Coordinate::stringFromColumnIndex ($ this ->columnIndex );
153163 do {
154164 --$ this ->currentRow ;
155165 } while (
156166 ($ this ->onlyExistingCells ) &&
157- (! $ this ->worksheet -> cellExistsByColumnAndRow ( $ this -> columnIndex , $ this ->currentRow ) ) &&
158- ($ this ->currentRow >= $ this ->startRow )
167+ ($ this ->currentRow >= $ this ->startRow ) &&
168+ (! $ this ->cellCollection -> has ( $ columnAddress . $ this ->currentRow ) )
159169 );
160170 }
161171
@@ -173,14 +183,15 @@ public function valid(): bool
173183 protected function adjustForExistingOnlyRange (): void
174184 {
175185 if ($ this ->onlyExistingCells ) {
186+ $ columnAddress = Coordinate::stringFromColumnIndex ($ this ->columnIndex );
176187 while (
177- (!$ this ->worksheet -> cellExistsByColumnAndRow ( $ this -> columnIndex , $ this ->startRow )) &&
188+ (!$ this ->cellCollection -> has ( $ columnAddress . $ this ->startRow )) &&
178189 ($ this ->startRow <= $ this ->endRow )
179190 ) {
180191 ++$ this ->startRow ;
181192 }
182193 while (
183- (!$ this ->worksheet -> cellExistsByColumnAndRow ( $ this -> columnIndex , $ this ->endRow )) &&
194+ (!$ this ->cellCollection -> has ( $ columnAddress . $ this ->endRow )) &&
184195 ($ this ->endRow >= $ this ->startRow )
185196 ) {
186197 --$ this ->endRow ;
0 commit comments