Skip to content

Commit ac148c8

Browse files
committed
Xlsx Reader Defined Name on Sheet with Apostrophe in Title
Fix PHPOffice#4356. Xlsx Reader needs to handle apostrophe for sheet title in defined name by converting doubled apostrophes to single.
1 parent 9d1ad14 commit ac148c8

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1820,7 +1820,10 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
18201820
if (is_array($definedNameValueParts)) {
18211821
// Extract sheet name
18221822
[$extractedSheetName] = Worksheet::extractSheetTitle((string) $definedNameValueParts[0], true);
1823-
$extractedSheetName = trim((string) $extractedSheetName, "'");
1823+
$extractedSheetName ??= '';
1824+
if ($extractedSheetName[0] === "'" && substr($extractedSheetName, -1) === "'") {
1825+
$extractedSheetName = str_replace("''", "'", substr($extractedSheetName, 1, -1));
1826+
}
18241827

18251828
// Locate sheet
18261829
$locatedSheet = $excel->getSheetByName($extractedSheetName);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
6+
7+
use PhpOffice\PhpSpreadsheet\NamedRange;
8+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
10+
11+
class Issue4356Test extends AbstractFunctional
12+
{
13+
public function testIssue4356(): void
14+
{
15+
// Reader couldn't handle sheet title with apostrophe for defined name
16+
$originalSpreadsheet = new Spreadsheet();
17+
$originalSheet = $originalSpreadsheet->getActiveSheet();
18+
$originalSheet->setTitle("Goodn't sheet name");
19+
$originalSpreadsheet->addNamedRange(
20+
new NamedRange('CELLNAME', $originalSheet, '$A$1')
21+
);
22+
$originalSheet->setCellValue('A1', 'This is a named cell.');
23+
$spreadsheet = $this->writeAndReload($originalSpreadsheet, 'Xlsx');
24+
$originalSpreadsheet->disconnectWorksheets();
25+
26+
$sheet = $spreadsheet->getActiveSheet();
27+
$sheet->setCellValue('C1', '=CELLNAME');
28+
self::assertSame('This is a named cell.', $sheet->getCell('C1')->getCalculatedValue());
29+
30+
$spreadsheet->disconnectWorksheets();
31+
}
32+
}

0 commit comments

Comments
 (0)