summaryrefslogtreecommitdiffstats
path: root/src/Plugin/ConditionalFormatFixer.php
diff options
context:
space:
mode:
authorh-hishida <h-hishida@quartetcom.co.jp>2015-04-28 09:45:00 +0900
committerh-hishida <h-hishida@quartetcom.co.jp>2015-04-28 09:45:00 +0900
commit373ae12ca5db9837f84fef44f3f7077e766aca08 (patch)
treec515f2cccceaa886282ac40f89785da072a3627e /src/Plugin/ConditionalFormatFixer.php
downloadPHPExcelFixer.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.php77
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());
+ }
+ }
+ }
+}