From 075cecd268f11ee612e8c0a968ae54385f526c79 Mon Sep 17 00:00:00 2001 From: oleibman Date: Fri, 2 Jul 2021 03:36:54 -0700 Subject: [PATCH] Xlsx Reader Better Namespace Handling Phase 1 First Bugfix (#2204) See issue #2203. An undotted i uncrossed t. When using namespaces, need to call attributes() to access the attributes before trying to access them directly. Failure to do so in castToFormula caused problem for shared formulas. Surprisingly, this didn't show up in unit tests. Perhaps sharing the same formula between two cells isn't common. It did show up in Chart Samples. I've added a test. I was really inclined to merge this right away. Not to worry - I can control myself. It should be moved fairly quickly nevertheless. --- src/PhpSpreadsheet/Reader/Xlsx.php | 7 ++-- .../Reader/Xlsx/SharedFormulaTest.php | 41 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/SharedFormulaTest.php diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 00d86f00..d94a8852 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -312,15 +312,16 @@ class Xlsx extends BaseReader private function castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType): void { + $attr = $c->f->attributes(); $cellDataType = 'f'; $value = "={$c->f}"; $calculatedValue = self::$castBaseType($c); // Shared formula? - if (isset($c->f['t']) && strtolower((string) $c->f['t']) == 'shared') { - $instance = (string) $c->f['si']; + if (isset($attr['t']) && strtolower((string) $attr['t']) == 'shared') { + $instance = (string) $attr['si']; - if (!isset($sharedFormulas[(string) $c->f['si']])) { + if (!isset($sharedFormulas[(string) $attr['si']])) { $sharedFormulas[$instance] = ['master' => $r, 'formula' => $value]; } else { $master = Coordinate::indexesFromString($sharedFormulas[$instance]['master']); diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/SharedFormulaTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/SharedFormulaTest.php new file mode 100644 index 00000000..94f8e349 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/SharedFormulaTest.php @@ -0,0 +1,41 @@ +', $data); + self::assertStringContainsString('', $data); + } + } + + public function testLoadSheetsXlsxChart(): void + { + $filename = self::$testbook; + $reader = IOFactory::createReader('Xlsx'); + $spreadsheet = $reader->load($filename, IReader::LOAD_WITH_CHARTS); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame('=(RANDBETWEEN(-50,250)+100)*10', $sheet->getCell('D6')->getValue()); + self::assertSame('=(RANDBETWEEN(-50,250)+100)*10', $sheet->getCell('E6')->getValue()); + $spreadsheet->disconnectWorksheets(); + } +}