Skip to content

Commit ff286a6

Browse files
authored
Not Finding Rels File (#3555)
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.
1 parent b3112e4 commit ff286a6

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

src/PhpSpreadsheet/Worksheet/Worksheet.php

+31-1
Original file line numberDiff line numberDiff line change
@@ -1806,9 +1806,15 @@ public function setBreakByColumnAndRow($columnIndex, $row, $break)
18061806
public function getBreaks()
18071807
{
18081808
$breaks = [];
1809+
/** @var callable */
1810+
$compareFunction = [self::class, 'compareRowBreaks'];
1811+
uksort($this->rowBreaks, $compareFunction);
18091812
foreach ($this->rowBreaks as $break) {
18101813
$breaks[$break->getCoordinate()] = self::BREAK_ROW;
18111814
}
1815+
/** @var callable */
1816+
$compareFunction = [self::class, 'compareColumnBreaks'];
1817+
uksort($this->columnBreaks, $compareFunction);
18121818
foreach ($this->columnBreaks as $break) {
18131819
$breaks[$break->getCoordinate()] = self::BREAK_COLUMN;
18141820
}
@@ -1823,16 +1829,40 @@ public function getBreaks()
18231829
*/
18241830
public function getRowBreaks()
18251831
{
1832+
/** @var callable */
1833+
$compareFunction = [self::class, 'compareRowBreaks'];
1834+
uksort($this->rowBreaks, $compareFunction);
1835+
18261836
return $this->rowBreaks;
18271837
}
18281838

1839+
protected static function compareRowBreaks(string $coordinate1, string $coordinate2): int
1840+
{
1841+
$row1 = Coordinate::indexesFromString($coordinate1)[1];
1842+
$row2 = Coordinate::indexesFromString($coordinate2)[1];
1843+
1844+
return $row1 - $row2;
1845+
}
1846+
1847+
protected static function compareColumnBreaks(string $coordinate1, string $coordinate2): int
1848+
{
1849+
$column1 = Coordinate::indexesFromString($coordinate1)[0];
1850+
$column2 = Coordinate::indexesFromString($coordinate2)[0];
1851+
1852+
return $column1 - $column2;
1853+
}
1854+
18291855
/**
1830-
* Get row breaks.
1856+
* Get column breaks.
18311857
*
18321858
* @return PageBreak[]
18331859
*/
18341860
public function getColumnBreaks()
18351861
{
1862+
/** @var callable */
1863+
$compareFunction = [self::class, 'compareColumnBreaks'];
1864+
uksort($this->columnBreaks, $compareFunction);
1865+
18361866
return $this->columnBreaks;
18371867
}
18381868

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
4+
5+
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
6+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
7+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
8+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
9+
10+
class Issue3552Test extends AbstractFunctional
11+
{
12+
/**
13+
* @var string
14+
*/
15+
private static $testbook = 'tests/data/Reader/XLSX/issue.3552.xlsx';
16+
17+
public function testRowBreaks(): void
18+
{
19+
$reader = new Xlsx();
20+
$spreadsheet = $reader->load(self::$testbook);
21+
$sheet = $spreadsheet->getActiveSheet();
22+
self::assertSame(['A92', 'A184', 'A276', 'A368', 'A417', 'A511', 'A554'], array_keys($sheet->getRowBreaks()));
23+
$sheet->insertNewRowBefore(397, 1);
24+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
25+
$spreadsheet->disconnectWorksheets();
26+
$reloadedSheet = $reloadedSpreadsheet->getActiveSheet();
27+
self::assertSame(['A92', 'A184', 'A276', 'A368', 'A418', 'A512', 'A555'], array_keys($reloadedSheet->getRowBreaks()));
28+
$reloadedSpreadsheet->disconnectWorksheets();
29+
}
30+
31+
public function testColumnBreaks(): void
32+
{
33+
$spreadsheet = new Spreadsheet();
34+
$sheet = $spreadsheet->getActiveSheet();
35+
$sheet->setBreak('Z1', Worksheet::BREAK_COLUMN);
36+
$sheet->setBreak('H1', Worksheet::BREAK_COLUMN);
37+
$sheet->setBreak('P1', Worksheet::BREAK_COLUMN);
38+
self::assertSame(['H1', 'P1', 'Z1'], array_keys($sheet->getColumnBreaks()));
39+
$sheet->insertNewColumnBefore('N', 2);
40+
self::assertSame(['H1', 'R1', 'AB1'], array_keys($sheet->getColumnBreaks()));
41+
$spreadsheet->disconnectWorksheets();
42+
}
43+
}
24.1 KB
Binary file not shown.

0 commit comments

Comments
 (0)