diff options
author | h-hishida <h-hishida@quartetcom.co.jp> | 2015-04-28 09:45:00 +0900 |
---|---|---|
committer | h-hishida <h-hishida@quartetcom.co.jp> | 2015-04-28 09:45:00 +0900 |
commit | 373ae12ca5db9837f84fef44f3f7077e766aca08 (patch) | |
tree | c515f2cccceaa886282ac40f89785da072a3627e /src/Plugin/ConditionalFormatFixer.php | |
download | PHPExcelFixer.StyleFixer-373ae12ca5db9837f84fef44f3f7077e766aca08.zip PHPExcelFixer.StyleFixer-373ae12ca5db9837f84fef44f3f7077e766aca08.tar.gz PHPExcelFixer.StyleFixer-373ae12ca5db9837f84fef44f3f7077e766aca08.tar.bz2 |
initial commit
Diffstat (limited to 'src/Plugin/ConditionalFormatFixer.php')
-rw-r--r-- | src/Plugin/ConditionalFormatFixer.php | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/Plugin/ConditionalFormatFixer.php b/src/Plugin/ConditionalFormatFixer.php new file mode 100644 index 0000000..2c6638b --- /dev/null +++ b/src/Plugin/ConditionalFormatFixer.php @@ -0,0 +1,77 @@ +<?php + +namespace PHPExcel\StyleFixer\Plugin; + +use PHPExcel\StyleFixer\Util\Book as BookUtil; +use PHPExcel\StyleFixer\Util\XmlNamespace; + +/** + * Class ConditionalFormatFixer + * PHPExcelが壊した条件付き書式を修復する + */ +class ConditionalFormatFixer implements Plugin +{ + /** + * @var \PHPExcel\StyleFixer\Util\Book + */ + private $bookUtil; + + public function __construct(BookUtil $bookUtil) + { + $this->bookUtil = $bookUtil; + } + + /** + * 各ワークシート内の条件付き書式設定を修復する + * + * @param \ZipArchive $output + * @param \ZipArchive $template + */ + public function execute(\ZipArchive $output, \ZipArchive $template) + { + // テンプレート側のシート名のマッピング + $srcSheetMap = $this->bookUtil->makeSheetMap($template); + // 出力ファイル側のシート名のマッピング + $distSheetMap = $this->bookUtil->makeSheetMap($output); + + foreach ($distSheetMap as $sheetName => $distSheetPath) { + $distXml = $output->getFromName($distSheetPath); + if (false !== strpos($distXml, 'conditionalFormatting')) { + $distDom = new \DOMDocument; + $distDom->loadXML($distXml); + $distXPath = new \DOMXPath($distDom); + $distXPath->registerNamespace('s', XmlNamespace::SPREADSHEETML_NS_URL); + $distRoot = $distXPath->query('//s:worksheet')->item(0); + $distConditionalFormattings = $distXPath->query('//s:worksheet/s:conditionalFormatting'); + $elementAfterConditionalFormatting = null; + foreach ($distConditionalFormattings as $distConditionalFormatting) { + $elementAfterConditionalFormatting = $distConditionalFormatting->nextSibling; + $distRoot->removeChild($distConditionalFormatting); + } + + while ($elementAfterConditionalFormatting instanceOf \DOMNode && !$elementAfterConditionalFormatting instanceOf \DOMElement) { + $elementAfterConditionalFormatting = $elementAfterConditionalFormatting->nextSibling; + } + if (!$elementAfterConditionalFormatting instanceOf \DOMElement) { + break; + } + + $srcSheetPath = $srcSheetMap[$sheetName]; + $srcXml = $template->getFromName($srcSheetPath); + $srcDom = new \DOMDocument; + $srcDom->loadXML($srcXml); + $srcXPath = new \DOMXPath($srcDom); + $srcXPath->registerNamespace('s', XmlNamespace::SPREADSHEETML_NS_URL); + + $conditionalFormattings = $srcXPath->query('//s:worksheet/s:conditionalFormatting'); + foreach ($conditionalFormattings as $conditionalFormatting) { + /** @var \DOMElement $conditionalFormatting */ + $newDistConditionalFormatting = $distDom->importNode($conditionalFormatting, true); + $distRoot->insertBefore($newDistConditionalFormatting, $elementAfterConditionalFormatting); + } + + $output->addFromString($distSheetPath, $distDom->saveXML()); + } + } + } +} |