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;
|
$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
|
||||||
|
|
|
||||||
|
|
@ -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