Skip to content

Commit 4e7e876

Browse files
committed
Tighten Up getStyle(definedName) Processing
1 parent 7b60624 commit 4e7e876

File tree

4 files changed

+28
-16
lines changed

4 files changed

+28
-16
lines changed

src/PhpSpreadsheet/Worksheet/Validations.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PhpOffice\PhpSpreadsheet\Worksheet;
44

5+
use Composer\Pcre\Preg;
56
use PhpOffice\PhpSpreadsheet\Cell\AddressRange;
67
use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
78
use PhpOffice\PhpSpreadsheet\Cell\CellRange;
@@ -45,7 +46,7 @@ public static function validateCellOrCellRange(AddressRange|CellAddress|int|stri
4546
if (is_string($cellRange) || is_numeric($cellRange)) {
4647
// Convert a single column reference like 'A' to 'A:A',
4748
// a single row reference like '1' to '1:1'
48-
$cellRange = (string) preg_replace('/^([A-Z]+|\d+)$/', '${1}:${1}', (string) $cellRange);
49+
$cellRange = Preg::replace('/^([A-Z]+|\d+)$/', '${1}:${1}', (string) $cellRange);
4950
} elseif (is_object($cellRange) && $cellRange instanceof CellAddress) {
5051
$cellRange = new CellRange($cellRange, $cellRange);
5152
}
@@ -62,7 +63,7 @@ public static function validateCellOrCellRange(AddressRange|CellAddress|int|stri
6263
*/
6364
public static function convertWholeRowColumn(?string $addressRange): string
6465
{
65-
return (string) preg_replace(
66+
return Preg::replace(
6667
['/^([A-Z]+):([A-Z]+)$/i', '/^(\\d+):(\\d+)$/'],
6768
[self::SETMAXROW, self::SETMAXCOL],
6869
$addressRange ?? ''
@@ -109,16 +110,19 @@ public static function validateCellRange(AddressRange|string|array $cellRange):
109110
return (string) $cellRange;
110111
}
111112

112-
public static function definedNameToCoordinate(string $coordinate, Worksheet $worksheet): string
113+
public static function definedNameToCoordinate(string $coordinate, Worksheet $worksheet, bool $replaceDollar = false): string
113114
{
114115
// Uppercase coordinate
115116
$coordinate = strtoupper($coordinate);
116117
// Eliminate leading equal sign
117-
$testCoordinate = (string) preg_replace('/^=/', '', $coordinate);
118+
$testCoordinate = Preg::replace('/^=/', '', $coordinate);
118119
$defined = $worksheet->getParentOrThrow()->getDefinedName($testCoordinate, $worksheet);
119120
if ($defined !== null) {
120121
if ($defined->getWorksheet() === $worksheet && !$defined->isFormula()) {
121-
$coordinate = (string) preg_replace('/^=/', '', $defined->getValue());
122+
$coordinate = Preg::replace('/^=/', '', $defined->getValue());
123+
if ($replaceDollar) {
124+
$coordinate = str_replace('$', '', $coordinate);
125+
}
122126
}
123127
}
124128

src/PhpSpreadsheet/Worksheet/Worksheet.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,9 @@ public function getColumnStyle(string $column): ?Style
13951395
*/
13961396
public function getStyle(AddressRange|CellAddress|int|string|array $cellCoordinate): Style
13971397
{
1398+
if (is_string($cellCoordinate)) {
1399+
$cellCoordinate = Validations::definedNameToCoordinate($cellCoordinate, $this, true);
1400+
}
13981401
$cellCoordinate = Validations::validateCellOrCellRange($cellCoordinate);
13991402

14001403
// set this sheet as active

tests/PhpSpreadsheetTests/Reader/Xls/Issue4356Test.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,28 @@ public function testIssue4356(): void
1414
{
1515
// Reader couldn't handle sheet title with apostrophe for defined name.
1616
// Issue was reported against Xlsx - see how Xls does.
17+
$nameDefined = 'CELLNAME';
1718
$originalSpreadsheet = new Spreadsheet();
1819
$originalSheet = $originalSpreadsheet->getActiveSheet();
1920
$originalSheet->setTitle("Goodn't sheet name");
2021
$originalSpreadsheet->addNamedRange(
21-
new NamedRange('CELLNAME', $originalSheet, '$A$1')
22+
new NamedRange($nameDefined, $originalSheet, '$A$1')
2223
);
2324
$originalSheet->setCellValue('A1', 'This is a named cell.');
24-
$originalSheet->getStyle('A1')->getFont()->setItalic(true);
25+
$originalSheet->getStyle($nameDefined)
26+
->getFont()
27+
->setItalic(true);
2528
$spreadsheet = $this->writeAndReload($originalSpreadsheet, 'Xls');
2629
$originalSpreadsheet->disconnectWorksheets();
2730

2831
$sheet = $spreadsheet->getActiveSheet();
29-
$sheet->setCellValue('C1', '=CELLNAME');
32+
$sheet->setCellValue('C1', "=$nameDefined");
3033
self::assertSame('This is a named cell.', $sheet->getCell('C1')->getCalculatedValue());
31-
$namedRange2 = $spreadsheet->getNamedRange('CELLNAME');
34+
$namedRange2 = $spreadsheet->getNamedRange($nameDefined);
3235
self::assertNotNull($namedRange2);
3336
$sheetx = $namedRange2->getWorksheet();
3437
self::assertNotNull($sheetx);
35-
$style = $sheetx->getStyle($namedRange2->getRange());
36-
//$style = $sheetx->getStyle('CELLNAME'); // no exception but doesn't work
38+
$style = $sheetx->getStyle($nameDefined);
3739
self::assertTrue($style->getFont()->getItalic());
3840
$style->getFont()->setItalic(false);
3941

tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4356Test.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,28 @@ class Issue4356Test extends AbstractFunctional
1313
public function testIssue4356(): void
1414
{
1515
// Reader couldn't handle sheet title with apostrophe for defined name
16+
$nameDefined = 'CELLNAME';
1617
$originalSpreadsheet = new Spreadsheet();
1718
$originalSheet = $originalSpreadsheet->getActiveSheet();
1819
$originalSheet->setTitle("Goodn't sheet name");
1920
$originalSpreadsheet->addNamedRange(
20-
new NamedRange('CELLNAME', $originalSheet, '$A$1')
21+
new NamedRange($nameDefined, $originalSheet, '$A$1')
2122
);
2223
$originalSheet->setCellValue('A1', 'This is a named cell.');
23-
$originalSheet->getStyle('A1')->getFont()->setItalic(true);
24+
$originalSheet->getStyle($nameDefined)
25+
->getFont()
26+
->setItalic(true);
2427
$spreadsheet = $this->writeAndReload($originalSpreadsheet, 'Xlsx');
2528
$originalSpreadsheet->disconnectWorksheets();
2629

2730
$sheet = $spreadsheet->getActiveSheet();
28-
$sheet->setCellValue('C1', '=CELLNAME');
31+
$sheet->setCellValue('C1', "=$nameDefined");
2932
self::assertSame('This is a named cell.', $sheet->getCell('C1')->getCalculatedValue());
30-
$namedRange2 = $spreadsheet->getNamedRange('CELLNAME');
33+
$namedRange2 = $spreadsheet->getNamedRange($nameDefined);
3134
self::assertNotNull($namedRange2);
3235
$sheetx = $namedRange2->getWorksheet();
3336
self::assertNotNull($sheetx);
34-
$style = $sheetx->getStyle($namedRange2->getRange());
37+
$style = $sheetx->getStyle($nameDefined);
3538
self::assertTrue($style->getFont()->getItalic());
3639
$style->getFont()->setItalic(false);
3740

0 commit comments

Comments
 (0)