diff --git a/CHANGELOG.md b/CHANGELOG.md index d6bd13817..fa1483ca2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). Thia is a ### Added +- Option to use OldCalculatedValue in ToArray and Relatives. [Issue #1810](https://github.com/PHPOffice/PhpSpreadsheet/issues/1810) [PR #4787](https://github.com/PHPOffice/PhpSpreadsheet/pull/4787) - Add checkbox style (Xlsx and Html). [PR #4781](https://github.com/PHPOffice/PhpSpreadsheet/pull/4781) - Writer/Html add ability to set line ending. [PR #4779](https://github.com/PHPOffice/PhpSpreadsheet/pull/4779) - Writer/Html optionally save formulas as data attributes. [PR #4783](https://github.com/PHPOffice/PhpSpreadsheet/pull/4783) diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index 657216d97..d482adf70 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -3000,7 +3000,7 @@ class Worksheet } elseif ($calculateFormulas) { $returnValue = $cell->getCalculatedValue(); } elseif ($oldCalculatedValue && ($cell->getDataType() === DataType::TYPE_FORMULA)) { - $returnValue = $cell->getOldCalculatedValue(); + $returnValue = $cell->getOldCalculatedValue() ?? $cell->getValue(); } else { $returnValue = $cell->getValue(); } diff --git a/tests/PhpSpreadsheetTests/Worksheet/ToArrayOldCalculatedValueTest.php b/tests/PhpSpreadsheetTests/Worksheet/ToArrayOldCalculatedValueTest.php index 4ccb48028..726317f45 100644 --- a/tests/PhpSpreadsheetTests/Worksheet/ToArrayOldCalculatedValueTest.php +++ b/tests/PhpSpreadsheetTests/Worksheet/ToArrayOldCalculatedValueTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace PhpOffice\PhpSpreadsheetTests\Worksheet; use PhpOffice\PhpSpreadsheet\Spreadsheet; +use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter; use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional; class ToArrayOldCalculatedValueTest extends AbstractFunctional @@ -25,4 +26,24 @@ class ToArrayOldCalculatedValueTest extends AbstractFunctional $reloadedSpreadsheet->disconnectWorksheets(); } + + private function noPreCalculation(XlsxWriter $writer): void + { + $writer->setPreCalculateFormulas(false); + } + + public function testNoPreCalculate(): void + { + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->fromArray([['A', 'B', 'C', '=1+2']]); + $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', null, $this->noPreCalculation(...)); + $spreadsheet->disconnectWorksheets(); + $rsheet = $reloadedSpreadsheet->getActiveSheet(); + $rsheet->setCellValue('D1', '=1+3'); + $array1 = $rsheet->toArray(formatData: false, calculateFormulas: false, oldCalculatedValue: true); + self::assertSame([['A', 'B', 'C', '=1+3']], $array1, 'uses value of cell if formula was not calculated'); + + $reloadedSpreadsheet->disconnectWorksheets(); + } }