Skip to content

Commit 4c1d953

Browse files
author
Mark Baker
authored
Merge pull request #2685 from PHPOffice/Refactoring-ReferenceHelper-allow-absolute-cellreference-updates
Provide $includeAbsoluteReferences option for the CellReferenceHelper when updating cell addresses
2 parents 251605f + 4bc3ed9 commit 4c1d953

File tree

2 files changed

+209
-5
lines changed

2 files changed

+209
-5
lines changed

src/PhpSpreadsheet/CellReferenceHelper.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public function refreshRequired(string $beforeCellAddress, int $numberOfColumns,
5050
$this->numberOfRows !== $numberOfRows;
5151
}
5252

53-
public function updateCellReference(string $cellReference = 'A1'): string
53+
public function updateCellReference(string $cellReference = 'A1', bool $includeAbsoluteReferences = false): string
5454
{
5555
if (Coordinate::coordinateIsRange($cellReference)) {
5656
throw new Exception('Only single cell references may be passed to this method.');
@@ -61,18 +61,29 @@ public function updateCellReference(string $cellReference = 'A1'): string
6161
$newColumnIndex = (int) Coordinate::columnIndexFromString(str_replace('$', '', $newColumn));
6262
$newRowIndex = (int) str_replace('$', '', $newRow);
6363

64+
$absoluteColumn = $newColumn[0] === '$' ? '$' : '';
65+
$absoluteRow = $newRow[0] === '$' ? '$' : '';
6466
// Verify which parts should be updated
65-
$updateColumn = (($newColumn[0] !== '$') && $newColumnIndex >= $this->beforeColumn);
66-
$updateRow = (($newRow[0] !== '$') && $newRow >= $this->beforeRow);
67+
if ($includeAbsoluteReferences === false) {
68+
$updateColumn = (($absoluteColumn !== '$') && $newColumnIndex >= $this->beforeColumn);
69+
$updateRow = (($absoluteRow !== '$') && $newRowIndex >= $this->beforeRow);
70+
} else {
71+
$updateColumn = ($newColumnIndex >= $this->beforeColumn);
72+
$updateRow = ($newRowIndex >= $this->beforeRow);
73+
}
6774

6875
// Create new column reference
6976
if ($updateColumn) {
70-
$newColumn = Coordinate::stringFromColumnIndex($newColumnIndex + $this->numberOfColumns);
77+
$newColumn = ($includeAbsoluteReferences === false)
78+
? Coordinate::stringFromColumnIndex($newColumnIndex + $this->numberOfColumns)
79+
: $absoluteColumn . Coordinate::stringFromColumnIndex($newColumnIndex + $this->numberOfColumns);
7180
}
7281

7382
// Create new row reference
7483
if ($updateRow) {
75-
$newRow = $newRowIndex + $this->numberOfRows;
84+
$newRow = ($includeAbsoluteReferences === false)
85+
? $newRowIndex + $this->numberOfRows
86+
: $absoluteRow . (string) ($newRowIndex + $this->numberOfRows);
7687
}
7788

7889
// Return new reference
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests;
4+
5+
use PhpOffice\PhpSpreadsheet\CellReferenceHelper;
6+
use PHPUnit\Framework\TestCase;
7+
8+
class CellReferenceHelperTest extends TestCase
9+
{
10+
/**
11+
* @dataProvider cellReferenceHelperInsertColumnsProvider
12+
*/
13+
public function testCellReferenceHelperInsertColumns(string $expectedResult, string $cellAddress): void
14+
{
15+
$cellReferenceHelper = new CellReferenceHelper('E5', 2, 0);
16+
$result = $cellReferenceHelper->updateCellReference($cellAddress);
17+
self::assertSame($expectedResult, $result);
18+
}
19+
20+
public function cellReferenceHelperInsertColumnsProvider(): array
21+
{
22+
return [
23+
['A1', 'A1'],
24+
['D5', 'D5'],
25+
['G5', 'E5'],
26+
['$E5', '$E5'],
27+
['G$5', 'E$5'],
28+
['I5', 'G5'],
29+
['$G$5', '$G$5'],
30+
];
31+
}
32+
33+
/**
34+
* @dataProvider cellReferenceHelperDeleteColumnsProvider
35+
*/
36+
public function testCellReferenceHelperDeleteColumns(string $expectedResult, string $cellAddress): void
37+
{
38+
$cellReferenceHelper = new CellReferenceHelper('E5', -2, 0);
39+
$result = $cellReferenceHelper->updateCellReference($cellAddress);
40+
self::assertSame($expectedResult, $result);
41+
}
42+
43+
public function cellReferenceHelperDeleteColumnsProvider(): array
44+
{
45+
return [
46+
['A1', 'A1'],
47+
['D5', 'D5'],
48+
['C5', 'E5'],
49+
['$E5', '$E5'],
50+
['C$5', 'E$5'],
51+
['E5', 'G5'],
52+
['$G$5', '$G$5'],
53+
];
54+
}
55+
56+
/**
57+
* @dataProvider cellReferenceHelperInsertRowsProvider
58+
*/
59+
public function testCellReferenceHelperInsertRows(string $expectedResult, string $cellAddress): void
60+
{
61+
$cellReferenceHelper = new CellReferenceHelper('E5', 0, 2);
62+
$result = $cellReferenceHelper->updateCellReference($cellAddress);
63+
self::assertSame($expectedResult, $result);
64+
}
65+
66+
public function cellReferenceHelperInsertRowsProvider(): array
67+
{
68+
return [
69+
['A1', 'A1'],
70+
['E4', 'E4'],
71+
['E7', 'E5'],
72+
['E$5', 'E$5'],
73+
['$E7', '$E5'],
74+
['E11', 'E9'],
75+
['$E$9', '$E$9'],
76+
];
77+
}
78+
79+
/**
80+
* @dataProvider cellReferenceHelperDeleteRowsProvider
81+
*/
82+
public function testCellReferenceHelperDeleteRows(string $expectedResult, string $cellAddress): void
83+
{
84+
$cellReferenceHelper = new CellReferenceHelper('E5', 0, -2);
85+
$result = $cellReferenceHelper->updateCellReference($cellAddress);
86+
self::assertSame($expectedResult, $result);
87+
}
88+
89+
public function cellReferenceHelperDeleteRowsProvider(): array
90+
{
91+
return [
92+
['A1', 'A1'],
93+
['E4', 'E4'],
94+
['E3', 'E5'],
95+
['E$5', 'E$5'],
96+
['$E3', '$E5'],
97+
['E7', 'E9'],
98+
['$E$9', '$E$9'],
99+
];
100+
}
101+
102+
/**
103+
* @dataProvider cellReferenceHelperInsertColumnsAbsoluteProvider
104+
*/
105+
public function testCellReferenceHelperInsertColumnsAbsolute(string $expectedResult, string $cellAddress): void
106+
{
107+
$cellReferenceHelper = new CellReferenceHelper('E5', 2, 0);
108+
$result = $cellReferenceHelper->updateCellReference($cellAddress, true);
109+
self::assertSame($expectedResult, $result);
110+
}
111+
112+
public function cellReferenceHelperInsertColumnsAbsoluteProvider(): array
113+
{
114+
return [
115+
['A1', 'A1'],
116+
['D5', 'D5'],
117+
['G5', 'E5'],
118+
['$G5', '$E5'],
119+
['G$5', 'E$5'],
120+
['I5', 'G5'],
121+
['$I$5', '$G$5'],
122+
];
123+
}
124+
125+
/**
126+
* @dataProvider cellReferenceHelperDeleteColumnsAbsoluteProvider
127+
*/
128+
public function testCellReferenceHelperDeleteColumnsAbsolute(string $expectedResult, string $cellAddress): void
129+
{
130+
$cellReferenceHelper = new CellReferenceHelper('E5', -2, 0);
131+
$result = $cellReferenceHelper->updateCellReference($cellAddress, true);
132+
self::assertSame($expectedResult, $result);
133+
}
134+
135+
public function cellReferenceHelperDeleteColumnsAbsoluteProvider(): array
136+
{
137+
return [
138+
['A1', 'A1'],
139+
['D5', 'D5'],
140+
['C5', 'E5'],
141+
['$C5', '$E5'],
142+
['C$5', 'E$5'],
143+
['E5', 'G5'],
144+
['$E$5', '$G$5'],
145+
];
146+
}
147+
148+
/**
149+
* @dataProvider cellReferenceHelperInsertRowsAbsoluteProvider
150+
*/
151+
public function testCellReferenceHelperInsertRowsAbsolute(string $expectedResult, string $cellAddress): void
152+
{
153+
$cellReferenceHelper = new CellReferenceHelper('E5', 0, 2);
154+
$result = $cellReferenceHelper->updateCellReference($cellAddress, true);
155+
self::assertSame($expectedResult, $result);
156+
}
157+
158+
public function cellReferenceHelperInsertRowsAbsoluteProvider(): array
159+
{
160+
return [
161+
['A1', 'A1'],
162+
['E4', 'E4'],
163+
['E7', 'E5'],
164+
['E$7', 'E$5'],
165+
['$E7', '$E5'],
166+
['E11', 'E9'],
167+
['$E$11', '$E$9'],
168+
];
169+
}
170+
171+
/**
172+
* @dataProvider cellReferenceHelperDeleteRowsAbsoluteProvider
173+
*/
174+
public function testCellReferenceHelperDeleteRowsAbsolute(string $expectedResult, string $cellAddress): void
175+
{
176+
$cellReferenceHelper = new CellReferenceHelper('E5', 0, -2);
177+
$result = $cellReferenceHelper->updateCellReference($cellAddress, true);
178+
self::assertSame($expectedResult, $result);
179+
}
180+
181+
public function cellReferenceHelperDeleteRowsAbsoluteProvider(): array
182+
{
183+
return [
184+
['A1', 'A1'],
185+
['E4', 'E4'],
186+
['E3', 'E5'],
187+
['E$3', 'E$5'],
188+
['$E3', '$E5'],
189+
['E7', 'E9'],
190+
['$E$7', '$E$9'],
191+
];
192+
}
193+
}

0 commit comments

Comments
 (0)