Skip to content

Commit 8d3a959

Browse files
committed
Support Multiple Ranges After All
1 parent 5e02e28 commit 8d3a959

File tree

1 file changed

+33
-24
lines changed

1 file changed

+33
-24
lines changed

src/PhpSpreadsheet/ReferenceHelper.php

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ public function insertNewBefore(
558558
$worksheet->freezePane($splitCell, $topLeftCell);
559559
}
560560

561-
$this->updatePrintArea($worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
561+
$this->updatePrintAreas($worksheet, $beforeCellAddress, $numberOfColumns, $numberOfRows);
562562

563563
// Update worksheet: drawings
564564
$aDrawings = $worksheet->getDrawingCollection();
@@ -584,13 +584,30 @@ public function insertNewBefore(
584584
$worksheet->garbageCollect();
585585
}
586586

587-
private function updatePrintArea(Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
587+
private function updatePrintAreas(Worksheet $worksheet, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): void
588588
{
589589
$pageSetup = $worksheet->getPageSetup();
590590
if (!$pageSetup->isPrintAreaSet()) {
591591
return;
592592
}
593-
$printArea = $pageSetup->getPrintArea();
593+
$printAreas = explode(',', $pageSetup->getPrintArea());
594+
$newPrintAreas = [];
595+
foreach ($printAreas as $printArea) {
596+
$result = $this->updatePrintArea($printArea, $beforeCellAddress, $numberOfColumns, $numberOfRows);
597+
if ($result !== '') {
598+
$newPrintAreas[] = $result;
599+
}
600+
}
601+
$result = implode(',', $newPrintAreas);
602+
if ($result === '') {
603+
$pageSetup->clearPrintArea();
604+
} else {
605+
$pageSetup->setPrintArea($result);
606+
}
607+
}
608+
609+
private function updatePrintArea(string $printArea, string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): string
610+
{
594611
$coordinates = Coordinate::indexesFromString($beforeCellAddress);
595612
if (preg_match('/^([A-Z]{1,3})(\d{1,7}):([A-Z]{1,3})(\d{1,7})$/i', $printArea, $matches) === 1) {
596613
$firstRow = (int) $matches[2];
@@ -603,63 +620,55 @@ private function updatePrintArea(Worksheet $worksheet, string $beforeCellAddress
603620
if ($affectedRow >= $firstRow && $affectedRow <= $lastRow) {
604621
$newLastRow = max($affectedRow, $lastRow + $numberOfRows);
605622
if ($newLastRow >= $firstRow) {
606-
$pageSetup->setPrintArea($matches[1] . $matches[2] . ':' . $matches[3] . $newLastRow);
607-
} else {
608-
$pageSetup->clearPrintArea();
623+
return $matches[1] . $matches[2] . ':' . $matches[3] . $newLastRow;
609624
}
610625

611-
return;
626+
return '';
612627
}
613628
if ($lastAffectedRow >= $firstRow && $affectedRow <= $lastRow) {
614629
$newFirstRow = $affectedRow + 1;
615630
$newLastRow = $lastRow + $numberOfRows;
616631
if ($newFirstRow >= 1 && $newLastRow >= $newFirstRow) {
617-
$pageSetup->setPrintArea($matches[1] . $newFirstRow . ':' . $matches[3] . $newLastRow);
618-
} else {
619-
$pageSetup->clearPrintArea();
632+
return $matches[1] . $newFirstRow . ':' . $matches[3] . $newLastRow;
620633
}
621634

622-
return;
635+
return '';
623636
}
624637
}
625638
if ($numberOfColumns < 0) {
626639
$firstColumnInt = Coordinate::columnIndexFromString($firstColumnString);
627640
$lastColumnInt = Coordinate::columnIndexFromString($lastColumnString);
628641
$affectedColumn = $coordinates[0] + $numberOfColumns - 1;
629642
$lastAffectedColumn = $coordinates[0] - 1;
630-
//var_dump($affectedColumn, $lastAffectedColumn, $firstColumnInt, $lastColumnInt);
631643
if ($affectedColumn >= $firstColumnInt && $affectedColumn <= $lastColumnInt) {
632644
$newLastColumnInt = max($affectedColumn, $lastColumnInt + $numberOfColumns);
633645
if ($newLastColumnInt >= $firstColumnInt) {
634646
$newLastColumnString = Coordinate::stringFromColumnIndex($newLastColumnInt);
635-
$pageSetup->setPrintArea($matches[1] . $matches[2] . ':' . $newLastColumnString . $matches[4]);
636-
} else {
637-
$pageSetup->clearPrintArea();
647+
648+
return $matches[1] . $matches[2] . ':' . $newLastColumnString . $matches[4];
638649
}
639650

640-
return;
651+
return '';
641652
}
642653
if ($affectedColumn < $firstColumnInt && $lastAffectedColumn > $lastColumnInt) {
643-
$pageSetup->clearPrintArea();
644-
645-
return;
654+
return '';
646655
}
647656
if ($lastAffectedColumn >= $firstColumnInt && $lastAffectedColumn <= $lastColumnInt) {
648657
$newFirstColumn = $affectedColumn + 1;
649658
$newLastColumn = $lastColumnInt + $numberOfColumns;
650659
if ($newFirstColumn >= 1 && $newLastColumn >= $newFirstColumn) {
651660
$firstString = Coordinate::stringFromColumnIndex($newFirstColumn);
652661
$lastString = Coordinate::stringFromColumnIndex($newLastColumn);
653-
$pageSetup->setPrintArea($firstString . $matches[2] . ':' . $lastString . $matches[4]);
654-
} else {
655-
$pageSetup->clearPrintArea();
662+
663+
return $firstString . $matches[2] . ':' . $lastString . $matches[4];
656664
}
657665

658-
return;
666+
return '';
659667
}
660668
}
661669
}
662-
$pageSetup->setPrintArea($this->updateCellReference($printArea));
670+
671+
return $this->updateCellReference($printArea);
663672
}
664673

665674
private static function matchSheetName(?string $match, string $worksheetName): bool

0 commit comments

Comments
 (0)