From 4bc3ed9cc1bb604cd85132477b4d5b0c7f3ad83e Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Wed, 16 Mar 2022 19:14:50 +0100 Subject: [PATCH] Provide $includeAbsoluteReferences option for the CellReferenceHelper when updating cell addresses --- src/PhpSpreadsheet/CellReferenceHelper.php | 21 +- .../CellReferenceHelperTest.php | 193 ++++++++++++++++++ 2 files changed, 209 insertions(+), 5 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/CellReferenceHelperTest.php diff --git a/src/PhpSpreadsheet/CellReferenceHelper.php b/src/PhpSpreadsheet/CellReferenceHelper.php index 24021109..6c54dafc 100644 --- a/src/PhpSpreadsheet/CellReferenceHelper.php +++ b/src/PhpSpreadsheet/CellReferenceHelper.php @@ -50,7 +50,7 @@ class CellReferenceHelper $this->numberOfRows !== $numberOfRows; } - public function updateCellReference(string $cellReference = 'A1'): string + public function updateCellReference(string $cellReference = 'A1', bool $includeAbsoluteReferences = false): string { if (Coordinate::coordinateIsRange($cellReference)) { throw new Exception('Only single cell references may be passed to this method.'); @@ -61,18 +61,29 @@ class CellReferenceHelper $newColumnIndex = (int) Coordinate::columnIndexFromString(str_replace('$', '', $newColumn)); $newRowIndex = (int) str_replace('$', '', $newRow); + $absoluteColumn = $newColumn[0] === '$' ? '$' : ''; + $absoluteRow = $newRow[0] === '$' ? '$' : ''; // Verify which parts should be updated - $updateColumn = (($newColumn[0] !== '$') && $newColumnIndex >= $this->beforeColumn); - $updateRow = (($newRow[0] !== '$') && $newRow >= $this->beforeRow); + if ($includeAbsoluteReferences === false) { + $updateColumn = (($absoluteColumn !== '$') && $newColumnIndex >= $this->beforeColumn); + $updateRow = (($absoluteRow !== '$') && $newRowIndex >= $this->beforeRow); + } else { + $updateColumn = ($newColumnIndex >= $this->beforeColumn); + $updateRow = ($newRowIndex >= $this->beforeRow); + } // Create new column reference if ($updateColumn) { - $newColumn = Coordinate::stringFromColumnIndex($newColumnIndex + $this->numberOfColumns); + $newColumn = ($includeAbsoluteReferences === false) + ? Coordinate::stringFromColumnIndex($newColumnIndex + $this->numberOfColumns) + : $absoluteColumn . Coordinate::stringFromColumnIndex($newColumnIndex + $this->numberOfColumns); } // Create new row reference if ($updateRow) { - $newRow = $newRowIndex + $this->numberOfRows; + $newRow = ($includeAbsoluteReferences === false) + ? $newRowIndex + $this->numberOfRows + : $absoluteRow . (string) ($newRowIndex + $this->numberOfRows); } // Return new reference diff --git a/tests/PhpSpreadsheetTests/CellReferenceHelperTest.php b/tests/PhpSpreadsheetTests/CellReferenceHelperTest.php new file mode 100644 index 00000000..35352afd --- /dev/null +++ b/tests/PhpSpreadsheetTests/CellReferenceHelperTest.php @@ -0,0 +1,193 @@ +updateCellReference($cellAddress); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperInsertColumnsProvider(): array + { + return [ + ['A1', 'A1'], + ['D5', 'D5'], + ['G5', 'E5'], + ['$E5', '$E5'], + ['G$5', 'E$5'], + ['I5', 'G5'], + ['$G$5', '$G$5'], + ]; + } + + /** + * @dataProvider cellReferenceHelperDeleteColumnsProvider + */ + public function testCellReferenceHelperDeleteColumns(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', -2, 0); + $result = $cellReferenceHelper->updateCellReference($cellAddress); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperDeleteColumnsProvider(): array + { + return [ + ['A1', 'A1'], + ['D5', 'D5'], + ['C5', 'E5'], + ['$E5', '$E5'], + ['C$5', 'E$5'], + ['E5', 'G5'], + ['$G$5', '$G$5'], + ]; + } + + /** + * @dataProvider cellReferenceHelperInsertRowsProvider + */ + public function testCellReferenceHelperInsertRows(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', 0, 2); + $result = $cellReferenceHelper->updateCellReference($cellAddress); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperInsertRowsProvider(): array + { + return [ + ['A1', 'A1'], + ['E4', 'E4'], + ['E7', 'E5'], + ['E$5', 'E$5'], + ['$E7', '$E5'], + ['E11', 'E9'], + ['$E$9', '$E$9'], + ]; + } + + /** + * @dataProvider cellReferenceHelperDeleteRowsProvider + */ + public function testCellReferenceHelperDeleteRows(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', 0, -2); + $result = $cellReferenceHelper->updateCellReference($cellAddress); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperDeleteRowsProvider(): array + { + return [ + ['A1', 'A1'], + ['E4', 'E4'], + ['E3', 'E5'], + ['E$5', 'E$5'], + ['$E3', '$E5'], + ['E7', 'E9'], + ['$E$9', '$E$9'], + ]; + } + + /** + * @dataProvider cellReferenceHelperInsertColumnsAbsoluteProvider + */ + public function testCellReferenceHelperInsertColumnsAbsolute(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', 2, 0); + $result = $cellReferenceHelper->updateCellReference($cellAddress, true); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperInsertColumnsAbsoluteProvider(): array + { + return [ + ['A1', 'A1'], + ['D5', 'D5'], + ['G5', 'E5'], + ['$G5', '$E5'], + ['G$5', 'E$5'], + ['I5', 'G5'], + ['$I$5', '$G$5'], + ]; + } + + /** + * @dataProvider cellReferenceHelperDeleteColumnsAbsoluteProvider + */ + public function testCellReferenceHelperDeleteColumnsAbsolute(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', -2, 0); + $result = $cellReferenceHelper->updateCellReference($cellAddress, true); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperDeleteColumnsAbsoluteProvider(): array + { + return [ + ['A1', 'A1'], + ['D5', 'D5'], + ['C5', 'E5'], + ['$C5', '$E5'], + ['C$5', 'E$5'], + ['E5', 'G5'], + ['$E$5', '$G$5'], + ]; + } + + /** + * @dataProvider cellReferenceHelperInsertRowsAbsoluteProvider + */ + public function testCellReferenceHelperInsertRowsAbsolute(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', 0, 2); + $result = $cellReferenceHelper->updateCellReference($cellAddress, true); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperInsertRowsAbsoluteProvider(): array + { + return [ + ['A1', 'A1'], + ['E4', 'E4'], + ['E7', 'E5'], + ['E$7', 'E$5'], + ['$E7', '$E5'], + ['E11', 'E9'], + ['$E$11', '$E$9'], + ]; + } + + /** + * @dataProvider cellReferenceHelperDeleteRowsAbsoluteProvider + */ + public function testCellReferenceHelperDeleteRowsAbsolute(string $expectedResult, string $cellAddress): void + { + $cellReferenceHelper = new CellReferenceHelper('E5', 0, -2); + $result = $cellReferenceHelper->updateCellReference($cellAddress, true); + self::assertSame($expectedResult, $result); + } + + public function cellReferenceHelperDeleteRowsAbsoluteProvider(): array + { + return [ + ['A1', 'A1'], + ['E4', 'E4'], + ['E3', 'E5'], + ['E$3', 'E$5'], + ['$E3', '$E5'], + ['E7', 'E9'], + ['$E$7', '$E$9'], + ]; + } +}