From 0a9d15407fa5b070f72d5bf5cf54bce7af93f475 Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Sat, 19 Mar 2022 19:47:14 +0100 Subject: [PATCH] Suport fill style and color for reading CF Formats --- CHANGELOG.md | 2 +- src/PhpSpreadsheet/Reader/Xls.php | 21 ++++++++++++++++++ .../Reader/XLS/CF_Expression_Comparisons.xls | Bin 26624 -> 27136 bytes 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57fc4f95..500d1ac4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - Support for two cell anchor drawing of images. [#2532](https://github.com/PHPOffice/PhpSpreadsheet/pull/2532) - Limited support for Xls Reader to handle Conditional Formatting: - Ranges and Rules are read, but style is currently limited to font size, weight and color. + Ranges and Rules are read, but style is currently limited to font size, weight and color; and to fill style and color. ### Changed diff --git a/src/PhpSpreadsheet/Reader/Xls.php b/src/PhpSpreadsheet/Reader/Xls.php index 7d2e8fc4..402fea9f 100644 --- a/src/PhpSpreadsheet/Reader/Xls.php +++ b/src/PhpSpreadsheet/Reader/Xls.php @@ -9,6 +9,7 @@ use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; use PhpOffice\PhpSpreadsheet\NamedRange; use PhpOffice\PhpSpreadsheet\Reader\Xls\ConditionalFormatting; use PhpOffice\PhpSpreadsheet\Reader\Xls\Style\CellFont; +use PhpOffice\PhpSpreadsheet\Reader\Xls\Style\FillPattern; use PhpOffice\PhpSpreadsheet\RichText\RichText; use PhpOffice\PhpSpreadsheet\Shared\CodePage; use PhpOffice\PhpSpreadsheet\Shared\Date; @@ -23,6 +24,7 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Borders; use PhpOffice\PhpSpreadsheet\Style\Conditional; +use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Style\Font; use PhpOffice\PhpSpreadsheet\Style\NumberFormat; use PhpOffice\PhpSpreadsheet\Style\Protection; @@ -8013,6 +8015,25 @@ class Xls extends BaseReader private function getCFFillStyle(string $options, Style $style): void { + $fillPattern = self::getUInt2d($options, 0); + // bit: 10-15; mask: 0xFC00; type + $fillPattern = (0xFC00 & $fillPattern) >> 10; + $fillPattern = FillPattern::lookup($fillPattern); + $fillPattern = $fillPattern === Fill::FILL_NONE ? Fill::FILL_SOLID : $fillPattern; + + if ($fillPattern !== Fill::FILL_NONE) { + $style->getFill()->setFillType($fillPattern); + + $fillColors = self::getUInt2d($options, 2); + + // bit: 0-6; mask: 0x007F; type + $color1 = (0x007F & $fillColors) >> 0; + $style->getFill()->getStartColor()->setRGB(Xls\Color::map($color1, $this->palette, $this->version)['rgb']); + + // bit: 7-13; mask: 0x3F80; type + $color2 = (0x3F80 & $fillColors) >> 7; + $style->getFill()->getEndColor()->setRGB(Xls\Color::map($color2, $this->palette, $this->version)['rgb']); + } } private function getCFProtectionStyle(string $options, Style $style): void diff --git a/tests/data/Reader/XLS/CF_Expression_Comparisons.xls b/tests/data/Reader/XLS/CF_Expression_Comparisons.xls index c9c8fe42203346b8a04ec8df3054fa0898ce5b6e..58273caeba9bcdc9d5fabb4f1737896536b31a24 100644 GIT binary patch delta 1352 zcmbtU&ubGw6n?Y2NjKR|n$$JvDm97LA2sPuK^v7OK|!cRTTna~q#gthErPTMBj~M# zv`;KZ5B4I`9-4L)EVf1ug4j!i3LZp@e}Tn{rBv59+ubz994ZccJ8$0i-uKPSW|LiH z*(H{1V#kJ?_ew1QFx@r943o_=%t>w>6Fn@2c~^{{X|dX?L5@+80DKw3bxE;^5VpDO zNEIMlT2$=~mM%4af-yJ_b3#!@L$BnsWg0BON0RM_`&`_gJD)C938@THTN;l=UjJ5% z`ab~!d5hqU-eRM%>e>*P8&~A8?k4*mW)$El1$;--__r}o60gaD`DN^ zDBlkTN0m_pqz6{77rW`k6kJil*s4}VCakQ_sa}Fk3L^loth^szlUC&x8wJQ#J8UIa z(E|=!blSX~AjZ@%tHPw(sP8JNDMShpXE&Oqu-jpmpc|mA=pMpp^@{ZU$>fBg`r6fa z9}LM7w`o)7^Adla%;z+wMNl4^;uDiZp6{Y51HJ|*?UZ`IiH_D^^u82@N%Dj z=2AA0iILWC(=-pzTuV4eI7B#1I6|l+a6V2m-3rtb8VHSqCPK3@e>KHMde(&TGq~Q< Q&-UZZYq!;-M1g&RKi=Xf0RR91 delta 1127 zcmbu8%WD%+6voe;N6b7DGcnC1W|4{3SJIjXrB&M0Xz_uo2GML>q#H@Wg&=P1!Vz)R zP2v>`mV%-?7bTr`Q4rd0%|eANT=q|}pdccSXEM2Y=vQ5His1blksN)J8v;u^FOdO@Vq7WP-1i^dG1+>IR=m#M{TC^(0 z=vP6)U5Ss$TJLNpj0}e}!{KZ{tcoeuOP&}k62p)+<5ZHRVJi3Oyucj%LpgMxcbh|O zeG`9iBuWqbdOV6Z`EDBko49d4Vcpn=2t;X0@}e)hv@Gf9&`_N9v1capX?oIkT_5kW zjB2u15C7x5-Kjf5U!(H~UU&HJTV49ulUiNsboK99*IA)?MUNk5&d)V%MOjfmc+okl z(FJ_5BlG}Q*?GPAA(q*OdE6!eb~~AVx`$NiQv<+^F)BF@@c^T}D(=gKXiC+IO3$m= zcyJ(RC%Kbko%lKq5k}jv05IFD9;QvTBILx)YnB?gu3Bq}YM5J{vh48!kuzxk6%Rg1 zThrN=>T8|@*eY7;%#zPne9M{LajDGR=9UdA&K3UpySQxJ#kn$d9&X;asNkMAbq>lC z$|Y_Tmi!qM!MSsuhDQN7a|ndTDCF!0KbEe7hQHl(XF7ohz|(t|>(;BQt7PNKQ{ta` zGr2bXh47YExgXrPWrm8sZQDMExyMnXs1vA@s8guZD2L-^A%hx2jib(@vZ$Q3cjp3W aRE1}?ADpj5f7Tw76n(JxNIip;HTnm4