Provide $includeAbsoluteReferences option for the CellReferenceHelper when updating cell addresses
This commit is contained in:
parent
251605f9b2
commit
4bc3ed9cc1
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue