diff --git a/CHANGELOG.md b/CHANGELOG.md index 953dedaa64..e27b761a58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Fixed -- Nothing yet. +- Xls writer Parser Mishandling True/False Argument. [Issue #4331](https://github.com/PHPOffice/PhpSpreadsheet/issues/4331) [PR #4333](https://github.com/PHPOffice/PhpSpreadsheet/pull/4333) ## 2025-01-26 - 3.9.0 diff --git a/src/PhpSpreadsheet/Writer/Xls/Parser.php b/src/PhpSpreadsheet/Writer/Xls/Parser.php index 52b4ad3538..ec1114a4a3 100644 --- a/src/PhpSpreadsheet/Writer/Xls/Parser.php +++ b/src/PhpSpreadsheet/Writer/Xls/Parser.php @@ -1624,7 +1624,9 @@ public function toReversePolish(array $tree = []): string } // add its left subtree and return. - return $left_tree . $this->convertFunction($tree['value'], $tree['right']); + if ($left_tree !== '' || $tree['right'] !== '') { + return $left_tree . $this->convertFunction($tree['value'], $tree['right'] ?: 0); + } } $converted_tree = $this->convert($tree['value']); diff --git a/tests/PhpSpreadsheetTests/Writer/Xls/Issue4331Test.php b/tests/PhpSpreadsheetTests/Writer/Xls/Issue4331Test.php new file mode 100644 index 0000000000..77841d8290 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Xls/Issue4331Test.php @@ -0,0 +1,56 @@ +getActiveSheet(); + $c3 = '=VLOOKUP(B3,$B$10:$C$13,2,FALSE)'; + $d3 = '=VLOOKUP("intermediate",$B$10:$C$13,2,TRUE)'; + $c4 = '=VLOOKUP(B3,$B$10:$C$13,2,FALSE())'; + $d4 = '=VLOOKUP("intermediate",$B$10:$C$13,2,TRUE())'; + $sheet->fromArray( + [ + ['level', 'result'], + ['medium', $c3, $d3], + [null, $c4, $d4], + ], + null, + 'B2', + true + ); + $sheet->fromArray( + [ + ['high', 6], + ['low', 2], + ['medium', 4], + ['none', 0], + ], + null, + 'B10', + true + ); + + $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xls'); + $spreadsheet->disconnectWorksheets(); + + $worksheet = $reloadedSpreadsheet->getActiveSheet(); + self::assertSame($c3, $worksheet->getCell('C3')->getValue()); + self::assertSame(4, $worksheet->getCell('C3')->getCalculatedValue()); + self::assertSame($d3, $worksheet->getCell('D3')->getValue()); + self::assertSame(6, $worksheet->getCell('D3')->getCalculatedValue()); + self::assertSame($c4, $worksheet->getCell('C4')->getValue()); + self::assertSame(4, $worksheet->getCell('C4')->getCalculatedValue()); + self::assertSame($d4, $worksheet->getCell('D4')->getValue()); + self::assertSame(6, $worksheet->getCell('D4')->getCalculatedValue()); + $reloadedSpreadsheet->disconnectWorksheets(); + } +}