diff --git a/samples/Basic/19_Namedrange.php b/samples/Basic/19_Namedrange.php index d89e1b04d9..6170fa28e7 100644 --- a/samples/Basic/19_Namedrange.php +++ b/samples/Basic/19_Namedrange.php @@ -31,8 +31,8 @@ // Define named ranges $helper->log('Define named ranges'); -$spreadsheet->addNamedRange(new NamedRange('PersonName', $spreadsheet->getActiveSheet(), 'B1')); -$spreadsheet->addNamedRange(new NamedRange('PersonLN', $spreadsheet->getActiveSheet(), 'B2')); +$spreadsheet->addNamedRange(new NamedRange('PersonName', $spreadsheet->getActiveSheet(), '$B$1')); +$spreadsheet->addNamedRange(new NamedRange('PersonLN', $spreadsheet->getActiveSheet(), '$B$2')); // Rename named ranges $helper->log('Rename named ranges'); diff --git a/src/PhpSpreadsheet/Writer/Xls/Parser.php b/src/PhpSpreadsheet/Writer/Xls/Parser.php index d49459b309..4033fd53e3 100644 --- a/src/PhpSpreadsheet/Writer/Xls/Parser.php +++ b/src/PhpSpreadsheet/Writer/Xls/Parser.php @@ -1149,10 +1149,6 @@ private function condition() $this->advance(); $result2 = $this->expression(); $result = $this->createTree('ptgNE', $result, $result2); - } elseif ($this->currentToken == '&') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgConcat', $result, $result2); } return $result; @@ -1203,6 +1199,11 @@ private function expression() return $this->createTree('ptgUplus', $result2, ''); } $result = $this->term(); + while ($this->currentToken === '&') { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgConcat', $result, $result2); + } while ( ($this->currentToken == '+') || ($this->currentToken == '-') || diff --git a/tests/PhpSpreadsheetTests/Writer/Xls/Sample19Test.php b/tests/PhpSpreadsheetTests/Writer/Xls/Sample19Test.php new file mode 100644 index 0000000000..13fa9fa1df --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Xls/Sample19Test.php @@ -0,0 +1,28 @@ +setActiveSheetIndex(0); + $spreadsheet->getActiveSheet()->setCellValue('A1', 'Firstname:') + ->setCellValue('A2', 'Lastname:') + ->setCellValue('A3', 'Fullname:') + ->setCellValue('B1', 'Maarten') + ->setCellValue('B2', 'Balliauw') + ->setCellValue('B3', '=B1 & " " & B2') + ->setCellValue('C1', '=A2&A3&A3&A2&B1'); + + $robj = $this->writeAndReload($spreadsheet, 'Xls'); + $sheet0 = $robj->setActiveSheetIndex(0); + // Xls parser eliminates unneeded whitespace + self::assertEquals('=B1&" "&B2', $sheet0->getCell('B3')->getValue()); + self::assertEquals('Maarten Balliauw', $sheet0->getCell('B3')->getCalculatedValue()); + self::assertEquals('Lastname:Fullname:Fullname:Lastname:Maarten', $sheet0->getCell('C1')->getCalculatedValue()); + } +}