diff --git a/src/Spout/Reader/Wrapper/XMLReader.php b/src/Spout/Reader/Wrapper/XMLReader.php index c50f5c0..1507cc9 100644 --- a/src/Spout/Reader/Wrapper/XMLReader.php +++ b/src/Spout/Reader/Wrapper/XMLReader.php @@ -160,4 +160,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/Manager/SharedStringsManager.php b/src/Spout/Reader/XLSX/Manager/SharedStringsManager.php index a59e093..af9279b 100644 --- a/src/Spout/Reader/XLSX/Manager/SharedStringsManager.php +++ b/src/Spout/Reader/XLSX/Manager/SharedStringsManager.php @@ -114,7 +114,7 @@ class SharedStringsManager $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++; @@ -142,7 +142,7 @@ class SharedStringsManager $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 aa406d8..a33fd41 100644 --- a/src/Spout/Reader/XLSX/RowIterator.php +++ b/src/Spout/Reader/XLSX/RowIterator.php @@ -340,7 +340,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 8808f62..b16df6b 100644 --- a/tests/Spout/Reader/XLSX/ReaderTest.php +++ b/tests/Spout/Reader/XLSX/ReaderTest.php @@ -111,6 +111,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 */ @@ -168,6 +184,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