nfTlWNl rn Ѻq$³*LJ0Y8i(?q;m ^*Ogص\`Lٔ*ܝIcQj Q@~D#9mO4WYvUV-,iB29\`Lٔ*ܝIcO*a[/Mgnl\`Lٔ*ܝIcO*a[/ayЪC4+YT;Tt(nBb cu) P8/P&oAY\QN#]>̮p9ܓ'8P6jm׺+VE5U9)WBK8`"ë\RXJCTD]f'މb1ʖ,Bi( %qU>AxV;;¦gD2LXp Hk_#1Iķխ}`xBA gޖB6m%b$ʙLGrJsf]ZV h ˄Юj][3m/Qe_>-Efdn/)Ra5'԰/g!<*a,ױ~N;*I{|nʪߐeX@e à*tZ [OC:TxǓ/p-ߵI5BAώ_}m N6baso$f4x;Tw@ əcB qEr 0 O] ~};Tw@ əcB KH3yĤAIq]1mlӭxV\ '9¦X9Udx)^y m7 OQkln = #eD UcgwMY|9,5o 1*g92'+~V" Dqj7H>Fk׾kkyR_u^ N5b"QۅX$ۓ[g<}(ދx965hde5M\Pp,ŁMճٰ;L$ypNkns~ <)U9u;xvg,OY"6{| zP}7#U)IAXvO8 ^rPuÌ$;Tw@ əcB KH3yĤAIq]1mlӭxV\ '9¦]6.S_Րle͛xh[+-w!w_:hzz:I&|[K2s(<]Vf"\v*p&Q;'8V WQTxʬ מKρ?romPE>U6vl4M]3> dV*z Muhi7" Ik)-Ws󅈉Kw5dpR2@<ήE9 5 #ʾ8|oΫ#S'!D<措'[&m ZN]6.S_Րle}{s*/ :lCSB *wOy9x)X㧩5(yz̫bsPWK\"$OϹڊiCcx >eiePnΤZn%XU%jYf%~7G~3 xmۄQZ,XNvyNOPD^8=bʞG9t gHZY~Z[0͋6VZ TKl5-@?Aooxx@9QiDu[eÈ;OS߾~P pon+o@w^QAzG>-؞{hv-cwFC8ayЪC4+Y{Ou_|wP کСPue5#A+uk$)̺8vZ] XI [Ѱ,Ek򂋯ӬA%9cWl ׿i6 1؆ _MLi dhtLFDj1p68bX?ZNy 1; 62݄Y8[cq7:vܷ#k3E!\9ӈFs3KE&FmqԦɎGMaٳeΏV*61;ﵾb<_(To݊PtHT)wt{^Oja -T Z$NSjsBD3e?5%6P@6#/0G.D] p4*cv|6xV+3{Mk@ncN!U7(@Ne(c`qI{44pqۂb`[~ҩ ĢQ$37Y5.I#`.6_pb.P(נV ,kq)7le.ʼ塢3{Mk@ncN!qd僬TN 8.~BT-H: @rk l:K\%O>ڽd{s_:Zi{Xƨ/RqveCRSڽd^lo~mrjQce_pb.P(נVT]A2hqP3+KC&E ĢQ$3F")Os|^P/ 6%ݒ|܃#R+- zlaչ YuiZ9AȖz yTU+d'\(f"g’@ay|jF{=Pi^!Fhru)3{q-6\ks泣I9-jbI%^hMfLRL݃cFH Bkw(Qz $conditionType = (string) $attributes->type; $operatorType = (string) $attributes->operator; $operands = []; foreach ($cfRuleXml->children($this->ns['xm']) as $cfRuleOperandsXml) { $operands[] = (string) $cfRuleOperandsXml; } $conditional = new Conditional(); $conditional->setConditionType($conditionType); $conditional->setOperatorType($operatorType); if ( $conditionType === Conditional::CONDITION_CONTAINSTEXT || $conditionType === Conditional::CONDITION_NOTCONTAINSTEXT || $conditionType === Conditional::CONDITION_BEGINSWITH || $conditionType === Conditional::CONDITION_ENDSWITH || $conditionType === Conditional::CONDITION_TIMEPERIOD ) { $conditional->setText(array_pop($operands) ?? ''); } $conditional->setConditions($operands); return $conditional; } private function readStyleFromExt(SimpleXMLElement $extCfRuleXml, StyleReader $styleReader): Style { $cfStyle = new Style(false, true); if ($extCfRuleXml->dxf) { $styleXML = $extCfRuleXml->dxf->children(); if ($styleXML->borders) { $styleReader->readBorderStyle($cfStyle->getBorders(), $styleXML->borders); } if ($styleXML->fill) { $styleReader->readFillStyle($cfStyle->getFill(), $styleXML->fill); } } return $cfStyle; } private function readConditionalStyles(SimpleXMLElement $xmlSheet): array { $conditionals = []; foreach ($xmlSheet->conditionalFormatting as $conditional) { foreach ($conditional->cfRule as $cfRule) { if (Conditional::isValidConditionType((string) $cfRule['type']) && (!isset($cfRule['dxfId']) || isset($this->dxfs[(int) ($cfRule['dxfId'])]))) { $conditionals[(string) $conditional['sqref']][(int) ($cfRule['priority'])] = $cfRule; } elseif ((string) $cfRule['type'] == Conditional::CONDITION_DATABAR) { $conditionals[(string) $conditional['sqref']][(int) ($cfRule['priority'])] = $cfRule; } } } return $conditionals; } private function setConditionalStyles(Worksheet $worksheet, array $conditionals, SimpleXMLElement $xmlExtLst): void { foreach ($conditionals as $cellRangeReference => $cfRules) { ksort($cfRules); $conditionalStyles = $this->readStyleRules($cfRules, $xmlExtLst); // Extract all cell references in $cellRangeReference $cellBlocks = explode(' ', str_replace('$', '', strtoupper($cellRangeReference))); foreach ($cellBlocks as $cellBlock) { $worksheet->getStyle($cellBlock)->setConditionalStyles($conditionalStyles); } } } private function readStyleRules(array $cfRules, SimpleXMLElement $extLst): array { $conditionalFormattingRuleExtensions = ConditionalFormattingRuleExtension::parseExtLstXml($extLst); $conditionalStyles = []; foreach ($cfRules as $cfRule) { $objConditional = new Conditional(); $objConditional->setConditionType((string) $cfRule['type']); $objConditional->setOperatorType((string) $cfRule['operator']); $objConditional->setNoFormatSet(!isset($cfRule['dxfId'])); if ((string) $cfRule['text'] != '') { $objConditional->setText((string) $cfRule['text']); } elseif ((string) $cfRule['timePeriod'] != '') { $objConditional->setText((string) $cfRule['timePeriod']); } if (isset($cfRule['stopIfTrue']) && (int) $cfRule['stopIfTrue'] === 1) { $objConditional->setStopIfTrue(true); } if (count($cfRule->formula) >= 1) { foreach ($cfRule->formula as $formulax) { $formula = (string) $formulax; if ($formula === 'TRUE') { $objConditional->addCondition(true); } elseif ($formula === 'FALSE') { $objConditional->addCondition(false); } else { $objConditional->addCondition($formula); } } } else { $objConditional->addCondition(''); } if (isset($cfRule->dataBar)) { $objConditional->setDataBar( $this->readDataBarOfConditionalRule($cfRule, $conditionalFormattingRuleExtensions) // @phpstan-ignore-line ); } elseif (isset($cfRule['dxfId'])) { $objConditional->setStyle(clone $this->dxfs[(int) ($cfRule['dxfId'])]); } $conditionalStyles[] = $objConditional; } return $conditionalStyles; } /** * @param SimpleXMLElement|stdClass $cfRule */ private function readDataBarOfConditionalRule($cfRule, array $conditionalFormattingRuleExtensions): ConditionalDataBar { $dataBar = new ConditionalDataBar(); //dataBar attribute if (isset($cfRule->dataBar['showValue'])) { $dataBar->setShowValue((bool) $cfRule->dataBar['showValue']); } //dataBar children //conditionalFormatValueObjects $cfvoXml = $cfRule->dataBar->cfvo; $cfvoIndex = 0; foreach ((count($cfvoXml) > 1 ? $cfvoXml : [$cfvoXml]) as $cfvo) { if ($cfvoIndex === 0) { $dataBar->setMinimumConditionalFormatValueObject(new ConditionalFormatValueObject((string) $cfvo['type'], (string) $cfvo['val'])); } if ($cfvoIndex === 1) { $dataBar->setMaximumConditionalFormatValueObject(new ConditionalFormatValueObject((string) $cfvo['type'], (string) $cfvo['val'])); } ++$cfvoIndex; } //color if (isset($cfRule->dataBar->color)) { $dataBar->setColor((string) $cfRule->dataBar->color['rgb']); } //extLst $this->readDataBarExtLstOfConditionalRule($dataBar, $cfRule, $conditionalFormattingRuleExtensions); return $dataBar; } /** * @param SimpleXMLElement|stdClass $cfRule */ private function readDataBarExtLstOfConditionalRule(ConditionalDataBar $dataBar, $cfRule, array $conditionalFormattingRuleExtensions): void { if (isset($cfRule->extLst)) { $ns = $cfRule->extLst->getNamespaces(true); foreach ((count($cfRule->extLst) > 0 ? $cfRule->extLst->ext : [$cfRule->extLst->ext]) as $ext) { $extId = (string) $ext->children($ns['x14'])->id; if (isset($conditionalFormattingRuleExtensions[$extId]) && (string) $ext['uri'] === '{B025F937-C7B1-47D3-B67F-A62EFF666E3E}') { $dataBar->setConditionalFormattingRuleExt($conditionalFormattingRuleExtensions[$extId]); } } } } }