Skip to content

Commit 324e190

Browse files
authored
Xls Reader Conditional Styles (#3400)
The code currently allocates the style object as a non-conditional style, leading to corruption when the spreadsheet is written out. That being said, Font Color is the only Conditional Formatting I have gotten to work for Xls for read or write. Use of other styles will essentially continue to be ignored, but will at least no longer result in corrupt spreadsheets.
1 parent 006e5dd commit 324e190

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/PhpSpreadsheet/Reader/Xls.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7921,7 +7921,7 @@ private function readCFRule(array $cellRangeAddresses): void
79217921
// offset: 6; size: 4; Options
79227922
$options = self::getInt4d($recordData, 6);
79237923

7924-
$style = new Style();
7924+
$style = new Style(false, true); // non-supervisor, conditional
79257925
$this->getCFStyleOptions($options, $style);
79267926

79277927
$hasFontRecord = (bool) ((0x04000000 & $options) >> 26);

tests/PhpSpreadsheetTests/Reader/Xls/ConditionalFormattingBasicTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xls;
44

55
use PhpOffice\PhpSpreadsheet\Reader\Xls;
6+
use PhpOffice\PhpSpreadsheet\Style\Border;
67
use PhpOffice\PhpSpreadsheet\Style\Conditional;
78
use PHPUnit\Framework\TestCase;
89

@@ -146,4 +147,59 @@ public function conditionalFormattingProvider(): array
146147
],
147148
];
148149
}
150+
151+
public function testReadConditionalFormattingStyles(): void
152+
{
153+
$filename = 'tests/data/Reader/XLS/CF_Basic_Comparisons.xls';
154+
$reader = new Xls();
155+
$spreadsheet = $reader->load($filename);
156+
$sheet = $spreadsheet->getActiveSheet();
157+
$expectedRange = 'A2:E5';
158+
$hasConditionalStyles = $sheet->conditionalStylesExists($expectedRange);
159+
self::assertTrue($hasConditionalStyles);
160+
161+
$conditionalStyles = $sheet->getConditionalStyles($expectedRange);
162+
self::assertCount(3, $conditionalStyles);
163+
164+
$style = $conditionalStyles[0]->getStyle();
165+
$font = $style->getFont();
166+
self::assertSame('FF0000FF', $font->getColor()->getArgb());
167+
self::assertNull($font->getItalic());
168+
self::assertNull($font->getStrikethrough());
169+
// Fill not handled correctly - forget for now
170+
$borders = $style->getBorders();
171+
self::assertSame(Border::BORDER_OMIT, $borders->getLeft()->getBorderStyle());
172+
self::assertSame(Border::BORDER_OMIT, $borders->getRight()->getBorderStyle());
173+
self::assertSame(Border::BORDER_OMIT, $borders->getTop()->getBorderStyle());
174+
self::assertSame(Border::BORDER_OMIT, $borders->getBottom()->getBorderStyle());
175+
self::assertNull($style->getNumberFormat()->getFormatCode());
176+
177+
$style = $conditionalStyles[1]->getStyle();
178+
$font = $style->getFont();
179+
self::assertSame('FF800000', $font->getColor()->getArgb());
180+
self::assertNull($font->getItalic());
181+
self::assertNull($font->getStrikethrough());
182+
// Fill not handled correctly - forget for now
183+
$borders = $style->getBorders();
184+
self::assertSame(Border::BORDER_OMIT, $borders->getLeft()->getBorderStyle());
185+
self::assertSame(Border::BORDER_OMIT, $borders->getRight()->getBorderStyle());
186+
self::assertSame(Border::BORDER_OMIT, $borders->getTop()->getBorderStyle());
187+
self::assertSame(Border::BORDER_OMIT, $borders->getBottom()->getBorderStyle());
188+
self::assertNull($style->getNumberFormat()->getFormatCode());
189+
190+
$style = $conditionalStyles[2]->getStyle();
191+
$font = $style->getFont();
192+
self::assertSame('FF00FF00', $font->getColor()->getArgb());
193+
self::assertNull($font->getItalic());
194+
self::assertNull($font->getStrikethrough());
195+
// Fill not handled correctly - forget for now
196+
$borders = $style->getBorders();
197+
self::assertSame(Border::BORDER_OMIT, $borders->getLeft()->getBorderStyle());
198+
self::assertSame(Border::BORDER_OMIT, $borders->getRight()->getBorderStyle());
199+
self::assertSame(Border::BORDER_OMIT, $borders->getTop()->getBorderStyle());
200+
self::assertSame(Border::BORDER_OMIT, $borders->getBottom()->getBorderStyle());
201+
self::assertNull($style->getNumberFormat()->getFormatCode());
202+
203+
$spreadsheet->disconnectWorksheets();
204+
}
149205
}

0 commit comments

Comments
 (0)