diff --git a/src/Service/Util/SharedStringReader.php b/src/Service/Util/SharedStringReader.php new file mode 100644 index 0000000..6f8c909 --- /dev/null +++ b/src/Service/Util/SharedStringReader.php @@ -0,0 +1,29 @@ +getFromName('xl/sharedStrings.xml'); + + $dom = new \DOMDocument; + $dom->loadXML($xml); + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('s', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + + $strings = []; + $count = 0; + foreach ($xpath->query('//s:sst/s:si/s:t') as $t) { + /** @var \DOMElement $t */ + $strings[$count] = $t->nodeValue; + $count++; + } + + return $strings; + } +} diff --git a/src/Service/Util/StringLocator.php b/src/Service/Util/StringLocator.php new file mode 100644 index 0000000..0081efe --- /dev/null +++ b/src/Service/Util/StringLocator.php @@ -0,0 +1,64 @@ +reader = $reader; + } + + /** + * @param \ZipArchive $zip + * @param string $sheetName + * @return array + */ + public function getLocation(\ZipArchive $zip, $sheetName) + { + $sharedStrings = $this->reader->read($zip); + + $sheets = SheetUtil::convertNamesToXmls($zip, [$sheetName]); + $xmlPath = $sheets[$sheetName]; + + return $this->makeMap($zip->getFromName($xmlPath), $sharedStrings); + } + + /** + * @param string $xml + * @param array $sharedStrings + * @return array + */ + private function makeMap($xml, array $sharedStrings) + { + $dom = new \DOMDocument; + $dom->loadXML($xml); + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('s', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + + $map = []; + foreach ($xpath->query('//s:worksheet/s:sheetData/s:row/s:c[@t="s"]/s:v') as $stringCellValue) { + $stringId = $stringCellValue->nodeValue; + if (!isset($sharedStrings[$stringId])) { + continue; + } + + $map[$stringCellValue->parentNode->getAttribute('r')] = $sharedStrings[$stringId]; + } + + return $map; + } +}