From b21bb866828fa14bb27ca6de7a1115a5dce1d57b Mon Sep 17 00:00:00 2001 From: Adrien Loison Date: Fri, 29 May 2015 09:01:24 -0700 Subject: [PATCH] Add support for files containing formulas Formulas will be skipped on reading. The result of the formulas will be kept though. --- src/Spout/Reader/XLSX.php | 20 ++++++++++++++---- tests/Spout/Reader/XLSXTest.php | 15 +++++++++++++ tests/resources/xlsx/sheet_with_formulas.xlsx | Bin 0 -> 30451 bytes 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/resources/xlsx/sheet_with_formulas.xlsx diff --git a/src/Spout/Reader/XLSX.php b/src/Spout/Reader/XLSX.php index b0a66d1..adb9544 100644 --- a/src/Spout/Reader/XLSX.php +++ b/src/Spout/Reader/XLSX.php @@ -206,13 +206,25 @@ class XLSX extends AbstractReader $currentColumnIndex = CellHelper::getColumnIndexFromCellIndex($currentCellIndex); $node = $this->xmlReader->expand(); + $hasInlineString = ($this->xmlReader->getAttribute('t') === 'inlineStr'); $hasSharedString = ($this->xmlReader->getAttribute('t') === 's'); - if ($hasSharedString) { - $sharedStringIndex = intval($node->nodeValue); + + if ($hasInlineString) { + // inline strings are formatted this way: + // [INLINE_STRING] + $tNode = $node->getElementsByTagName('t')->item(0); + $rowData[$currentColumnIndex] = trim($tNode->nodeValue); + } else if ($hasSharedString) { + // shared strings are formatted this way: + // [SHARED_STRING_INDEX] + $vNode = $node->getElementsByTagName('v')->item(0); + $sharedStringIndex = intval($vNode->nodeValue); $rowData[$currentColumnIndex] = $this->sharedStringsHelper->getStringAtIndex($sharedStringIndex); } else { - // for inline strings or numbers, just get the value - $rowData[$currentColumnIndex] = trim($node->nodeValue); + // other values are formatted this way: + // [VALUE] + $vNode = $node->getElementsByTagName('v')->item(0); + $rowData[$currentColumnIndex] = intval($vNode->nodeValue); } } else if ($this->xmlReader->nodeType == \XMLReader::END_ELEMENT && $this->xmlReader->name === 'row') { // End of the row description diff --git a/tests/Spout/Reader/XLSXTest.php b/tests/Spout/Reader/XLSXTest.php index 9a214f2..24aa89c 100644 --- a/tests/Spout/Reader/XLSXTest.php +++ b/tests/Spout/Reader/XLSXTest.php @@ -245,6 +245,21 @@ class XLSXTest extends \PHPUnit_Framework_TestCase $this->assertEquals([], $allRows, 'Sheet with no cells should be correctly processed.'); } + /** + * @return void + */ + public function testReadShouldSkipFormulas() + { + $allRows = $this->getAllRowsForFile('sheet_with_formulas.xlsx'); + + $expectedRows = [ + ['val1', 'val2', 'total1', 'total2'], + [10, 20, 30, 21], + [11, 21, 32, 41], + ]; + $this->assertEquals($expectedRows, $allRows); + } + /** * @param string $fileName * @return array All the read rows the given file diff --git a/tests/resources/xlsx/sheet_with_formulas.xlsx b/tests/resources/xlsx/sheet_with_formulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..99975aecff8a9f191119dad90eeed8c832c43b8b GIT binary patch literal 30451 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 o{L