From fe3ad1f605e0da526cea650c21c3aad2cdc66d00 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Thu, 4 May 2023 22:25:34 -0700 Subject: [PATCH] Not Finding Rels File Fix #3552. Inserting rows or columns can cause page break arrays to be out of order. Sort them in Worksheet functions getBreaks, getRowBreaks, and getColumnBreaks before returning to caller. --- src/PhpSpreadsheet/Worksheet/Worksheet.php | 32 ++++++++++++- .../Reader/Xlsx/Issue3552Test.php | 43 ++++++++++++++++++ tests/data/Reader/XLSX/issue.3552.xlsx | Bin 0 -> 24639 bytes 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3552Test.php create mode 100644 tests/data/Reader/XLSX/issue.3552.xlsx diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index faae434946..06f86cd173 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -1806,9 +1806,15 @@ public function setBreakByColumnAndRow($columnIndex, $row, $break) public function getBreaks() { $breaks = []; + /** @var callable */ + $compareFunction = [self::class, 'compareRowBreaks']; + uksort($this->rowBreaks, $compareFunction); foreach ($this->rowBreaks as $break) { $breaks[$break->getCoordinate()] = self::BREAK_ROW; } + /** @var callable */ + $compareFunction = [self::class, 'compareColumnBreaks']; + uksort($this->columnBreaks, $compareFunction); foreach ($this->columnBreaks as $break) { $breaks[$break->getCoordinate()] = self::BREAK_COLUMN; } @@ -1823,16 +1829,40 @@ public function getBreaks() */ public function getRowBreaks() { + /** @var callable */ + $compareFunction = [self::class, 'compareRowBreaks']; + uksort($this->rowBreaks, $compareFunction); + return $this->rowBreaks; } + protected static function compareRowBreaks(string $coordinate1, string $coordinate2): int + { + $row1 = Coordinate::indexesFromString($coordinate1)[1]; + $row2 = Coordinate::indexesFromString($coordinate2)[1]; + + return $row1 - $row2; + } + + protected static function compareColumnBreaks(string $coordinate1, string $coordinate2): int + { + $column1 = Coordinate::indexesFromString($coordinate1)[0]; + $column2 = Coordinate::indexesFromString($coordinate2)[0]; + + return $column1 - $column2; + } + /** - * Get row breaks. + * Get column breaks. * * @return PageBreak[] */ public function getColumnBreaks() { + /** @var callable */ + $compareFunction = [self::class, 'compareColumnBreaks']; + uksort($this->columnBreaks, $compareFunction); + return $this->columnBreaks; } diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3552Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3552Test.php new file mode 100644 index 0000000000..ee83d33bea --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3552Test.php @@ -0,0 +1,43 @@ +load(self::$testbook); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame(['A92', 'A184', 'A276', 'A368', 'A417', 'A511', 'A554'], array_keys($sheet->getRowBreaks())); + $sheet->insertNewRowBefore(397, 1); + $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx'); + $spreadsheet->disconnectWorksheets(); + $reloadedSheet = $reloadedSpreadsheet->getActiveSheet(); + self::assertSame(['A92', 'A184', 'A276', 'A368', 'A418', 'A512', 'A555'], array_keys($reloadedSheet->getRowBreaks())); + $reloadedSpreadsheet->disconnectWorksheets(); + } + + public function testColumnBreaks(): void + { + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setBreak('Z1', Worksheet::BREAK_COLUMN); + $sheet->setBreak('H1', Worksheet::BREAK_COLUMN); + $sheet->setBreak('P1', Worksheet::BREAK_COLUMN); + self::assertSame(['H1', 'P1', 'Z1'], array_keys($sheet->getColumnBreaks())); + $sheet->insertNewColumnBefore('N', 2); + self::assertSame(['H1', 'R1', 'AB1'], array_keys($sheet->getColumnBreaks())); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.3552.xlsx b/tests/data/Reader/XLSX/issue.3552.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f6cbab5204da23fced9ceb6d50bd5679f26bea8f GIT binary patch literal 24639 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 literal 0 HcmV?d00001