Skip to content

Commit b9a7aed

Browse files
author
MarkBaker
committed
First steps to handling array formulae with the Xlsx Reader and Writer
Only supprots the basic happy path (no handling for Error results when reading) No functionality yet for setting array formulae in code
1 parent d01f954 commit b9a7aed

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -810,9 +810,10 @@ public function load(string $filename, int $flags = 0): Spreadsheet
810810
} else {
811811
// Formula
812812
$this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToString');
813-
if (isset($c->f['t'])) {
814-
$formulaType = $c->f['t'];
815-
$formulaRange = $c->f['ref'] ? (string) $c->f['ref'] : null;
813+
$formulaAttributes = $c->f->attributes();
814+
if (isset($formulaAttributes['t'])) {
815+
$formulaType = $formulaAttributes['t'];
816+
$formulaRange = $formulaAttributes['ref'] ? (string) $formulaAttributes['ref'] : null;
816817
$docSheet->getCell($r)->setFormulaAttributes(['t' => (string) $formulaType, 'ref' => $formulaRange]);
817818
}
818819
}

src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
44

5+
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
56
use PhpOffice\PhpSpreadsheet\Cell\Cell;
67
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
78
use PhpOffice\PhpSpreadsheet\RichText\RichText;
@@ -1246,9 +1247,11 @@ private function writeCellError(XMLWriter $objWriter, string $mappedType, string
12461247

12471248
private function writeCellFormula(XMLWriter $objWriter, string $cellValue, Cell $cell): void
12481249
{
1249-
$calculatedValue = $this->getParentWriter()->getPreCalculateFormulas() ? $cell->getCalculatedValue() : $cellValue;
1250+
$calculatedValue = $this->getParentWriter()->getPreCalculateFormulas()
1251+
? $cell->getCalculatedValue() : $cellValue;
1252+
12501253
if (is_string($calculatedValue)) {
1251-
if (\PhpOffice\PhpSpreadsheet\Calculation\Functions::isError($calculatedValue)) {
1254+
if (Functions::isError($calculatedValue)) {
12521255
$this->writeCellError($objWriter, 'e', $cellValue, $calculatedValue);
12531256

12541257
return;
@@ -1272,14 +1275,15 @@ private function writeCellFormula(XMLWriter $objWriter, string $cellValue, Cell
12721275
$objWriter->endElement();
12731276
} else {
12741277
$objWriter->writeElement('f', Xlfn::addXlfnStripEquals($cellValue));
1275-
self::writeElementIf(
1276-
$objWriter,
1277-
$this->getParentWriter()->getOffice2003Compatibility() === false,
1278-
'v',
1279-
($this->getParentWriter()->getPreCalculateFormulas() && !is_array($calculatedValue) && substr($calculatedValue, 0, 1) !== '#')
1280-
? StringHelper::formatNumber($calculatedValue) : '0'
1281-
);
12821278
}
1279+
1280+
self::writeElementIf(
1281+
$objWriter,
1282+
$this->getParentWriter()->getOffice2003Compatibility() === false,
1283+
'v',
1284+
($this->getParentWriter()->getPreCalculateFormulas() && !is_array($calculatedValue) && substr($calculatedValue, 0, 1) !== '#')
1285+
? StringHelper::formatNumber($calculatedValue) : '0'
1286+
);
12831287
}
12841288

12851289
/**

0 commit comments

Comments
 (0)