Provide $includeAbsoluteReferences option for the CellReferenceHelper when updating cell addresses

This commit is contained in:
MarkBaker 2022-03-16 19:14:50 +01:00
parent 251605f9b2
commit 4bc3ed9cc1
2 changed files with 209 additions and 5 deletions

View File

@ -50,7 +50,7 @@ class CellReferenceHelper
$this->numberOfRows !== $numberOfRows; $this->numberOfRows !== $numberOfRows;
} }
public function updateCellReference(string $cellReference = 'A1'): string public function updateCellReference(string $cellReference = 'A1', bool $includeAbsoluteReferences = false): string
{ {
if (Coordinate::coordinateIsRange($cellReference)) { if (Coordinate::coordinateIsRange($cellReference)) {
throw new Exception('Only single cell references may be passed to this method.'); 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)); $newColumnIndex = (int) Coordinate::columnIndexFromString(str_replace('$', '', $newColumn));
$newRowIndex = (int) str_replace('$', '', $newRow); $newRowIndex = (int) str_replace('$', '', $newRow);
$absoluteColumn = $newColumn[0] === '$' ? '$' : '';
$absoluteRow = $newRow[0] === '$' ? '$' : '';
// Verify which parts should be updated // Verify which parts should be updated
$updateColumn = (($newColumn[0] !== '$') && $newColumnIndex >= $this->beforeColumn); if ($includeAbsoluteReferences === false) {
$updateRow = (($newRow[0] !== '$') && $newRow >= $this->beforeRow); $updateColumn = (($absoluteColumn !== '$') && $newColumnIndex >= $this->beforeColumn);
$updateRow = (($absoluteRow !== '$') && $newRowIndex >= $this->beforeRow);
} else {
$updateColumn = ($newColumnIndex >= $this->beforeColumn);
$updateRow = ($newRowIndex >= $this->beforeRow);
}
// Create new column reference // Create new column reference
if ($updateColumn) { 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 // Create new row reference
if ($updateRow) { if ($updateRow) {
$newRow = $newRowIndex + $this->numberOfRows; $newRow = ($includeAbsoluteReferences === false)
? $newRowIndex + $this->numberOfRows
: $absoluteRow . (string) ($newRowIndex + $this->numberOfRows);
} }
// Return new reference // Return new reference

View File

@ -0,0 +1,193 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests;
use PhpOffice\PhpSpreadsheet\CellReferenceHelper;
use PHPUnit\Framework\TestCase;
class CellReferenceHelperTest extends TestCase
{
/**
* @dataProvider cellReferenceHelperInsertColumnsProvider
*/
public function testCellReferenceHelperInsertColumns(string $expectedResult, string $cellAddress): void
{
$cellReferenceHelper = new CellReferenceHelper('E5', 2, 0);
$result = $cellReferenceHelper->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'],
];
}
}