Skip to content

Commit

Permalink
Xlsx Reader Defined Name on Sheet with Apostrophe in Title
Browse files Browse the repository at this point in the history
Fix PHPOffice#4356. Xlsx Reader needs to handle apostrophe for sheet title in defined name by converting doubled apostrophes to single.
  • Loading branch information
oleibman committed Feb 12, 2025
1 parent 9d1ad14 commit ac148c8
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/PhpSpreadsheet/Reader/Xlsx.php
Original file line number Diff line number Diff line change
Expand Up @@ -1820,7 +1820,10 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
if (is_array($definedNameValueParts)) {
// Extract sheet name
[$extractedSheetName] = Worksheet::extractSheetTitle((string) $definedNameValueParts[0], true);
$extractedSheetName = trim((string) $extractedSheetName, "'");
$extractedSheetName ??= '';
if ($extractedSheetName[0] === "'" && substr($extractedSheetName, -1) === "'") {
$extractedSheetName = str_replace("''", "'", substr($extractedSheetName, 1, -1));
}

// Locate sheet
$locatedSheet = $excel->getSheetByName($extractedSheetName);
Expand Down
32 changes: 32 additions & 0 deletions tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4356Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;

use PhpOffice\PhpSpreadsheet\NamedRange;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;

class Issue4356Test extends AbstractFunctional
{
public function testIssue4356(): void
{
// Reader couldn't handle sheet title with apostrophe for defined name
$originalSpreadsheet = new Spreadsheet();
$originalSheet = $originalSpreadsheet->getActiveSheet();
$originalSheet->setTitle("Goodn't sheet name");
$originalSpreadsheet->addNamedRange(
new NamedRange('CELLNAME', $originalSheet, '$A$1')
);
$originalSheet->setCellValue('A1', 'This is a named cell.');
$spreadsheet = $this->writeAndReload($originalSpreadsheet, 'Xlsx');
$originalSpreadsheet->disconnectWorksheets();

$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('C1', '=CELLNAME');
self::assertSame('This is a named cell.', $sheet->getCell('C1')->getCalculatedValue());

$spreadsheet->disconnectWorksheets();
}
}

0 comments on commit ac148c8

Please sign in to comment.