diff --git a/src/Spout/Reader/Wrapper/XMLReader.php b/src/Spout/Reader/Wrapper/XMLReader.php index 2e20327..08e99fc 100644 --- a/src/Spout/Reader/Wrapper/XMLReader.php +++ b/src/Spout/Reader/Wrapper/XMLReader.php @@ -164,4 +164,12 @@ class XMLReader extends \XMLReader return ($this->nodeType === $nodeType && $currentNodeName === $nodeName); } + + /** + * @return string The name of the current node, un-prefixed + */ + public function getCurrentNodeName() + { + return $this->localName; + } } diff --git a/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php b/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php index 415d5cf..fc04c79 100644 --- a/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php +++ b/src/Spout/Reader/XLSX/Helper/SharedStringsHelper.php @@ -99,7 +99,7 @@ class SharedStringsHelper $xmlReader->readUntilNodeFound(self::XML_NODE_SI); - while ($xmlReader->name === self::XML_NODE_SI) { + while ($xmlReader->getCurrentNodeName() === self::XML_NODE_SI) { $this->processSharedStringsItem($xmlReader, $sharedStringIndex); $sharedStringIndex++; @@ -128,7 +128,7 @@ class SharedStringsHelper $xmlReader->next(self::XML_NODE_SST); // Iterate over the "sst" elements to get the actual "sst ELEMENT" (skips any DOCTYPE) - while ($xmlReader->name === self::XML_NODE_SST && $xmlReader->nodeType !== XMLReader::ELEMENT) { + while ($xmlReader->getCurrentNodeName() === self::XML_NODE_SST && $xmlReader->nodeType !== XMLReader::ELEMENT) { $xmlReader->read(); } diff --git a/src/Spout/Reader/XLSX/RowIterator.php b/src/Spout/Reader/XLSX/RowIterator.php index 45069b3..e70c617 100644 --- a/src/Spout/Reader/XLSX/RowIterator.php +++ b/src/Spout/Reader/XLSX/RowIterator.php @@ -348,7 +348,7 @@ class RowIterator implements IteratorInterface */ protected function isEmptyRow($rowData) { - return (count($rowData) === 1 && $rowData[0] === ''); + return (count($rowData) === 1 && key($rowData) === ''); } /** diff --git a/tests/Spout/Reader/XLSX/ReaderTest.php b/tests/Spout/Reader/XLSX/ReaderTest.php index b9e032e..2ad6834 100644 --- a/tests/Spout/Reader/XLSX/ReaderTest.php +++ b/tests/Spout/Reader/XLSX/ReaderTest.php @@ -112,6 +112,22 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedRows, $allRows); } + /** + * @return void + */ + public function testReadShouldSupportPrefixedSharedStringsXML() + { + // The sharedStrings.xml file of this spreadsheet is prefixed. + // For instance, they use "" instead of "", etc. + $allRows = $this->getAllRowsForFile('sheet_with_prefixed_shared_strings_xml.xlsx'); + + $expectedRows = [ + ['s1--A1', 's1--B1', 's1--C1', 's1--D1', 's1--E1'], + ['s1--A2', 's1--B2', 's1--C2', 's1--D2', 's1--E2'], + ]; + $this->assertEquals($expectedRows, $allRows); + } + /** * @return void */ @@ -169,6 +185,21 @@ class ReaderTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedRows, $allRows); } + /** + * @return void + */ + public function testReadShouldSupportFilesWithRowsNotStartingAtColumnA() + { + // file where the row starts at column C: + // 0... + $allRows = $this->getAllRowsForFile('sheet_with_row_not_starting_at_column_a.xlsx'); + + $expectedRows = [ + ['', '', 's1--C1', 's1--D1', 's1--E1'], + ]; + $this->assertEquals($expectedRows, $allRows); + } + /** * @return void */ diff --git a/tests/resources/xlsx/sheet_with_prefixed_shared_strings_xml.xlsx b/tests/resources/xlsx/sheet_with_prefixed_shared_strings_xml.xlsx new file mode 100644 index 0000000..33f92f7 Binary files /dev/null and b/tests/resources/xlsx/sheet_with_prefixed_shared_strings_xml.xlsx differ diff --git a/tests/resources/xlsx/sheet_with_row_not_starting_at_column_a.xlsx b/tests/resources/xlsx/sheet_with_row_not_starting_at_column_a.xlsx new file mode 100644 index 0000000..61ea578 Binary files /dev/null and b/tests/resources/xlsx/sheet_with_row_not_starting_at_column_a.xlsx differ