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.
This commit is contained in:
oleibman
2023-05-10 18:57:16 -07:00
committed by GitHub
parent b3112e4b43
commit ff286a6a13
3 changed files with 74 additions and 1 deletions
+31 -1
View File
@@ -1806,9 +1806,15 @@ class Worksheet implements IComparable
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 @@ class Worksheet implements IComparable
*/
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;
}
@@ -0,0 +1,43 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class Issue3552Test extends AbstractFunctional
{
/**
* @var string
*/
private static $testbook = 'tests/data/Reader/XLSX/issue.3552.xlsx';
public function testRowBreaks(): void
{
$reader = new Xlsx();
$spreadsheet = $reader->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();
}
}
Binary file not shown.