Style   F
last analyzed

Complexity

Total Complexity 109

Size/Duplication

Total Lines 682
Duplicated Lines 0 %

Test Coverage

Coverage 99.4%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 109
eloc 324
c 2
b 0
f 0
dl 0
loc 682
ccs 330
cts 332
cp 0.994
rs 2

18 Methods

Rating   Name   Duplication   Size   Complexity  
A writeFill() 0 12 4
A writeGradientFill() 0 39 3
A writePatternColors() 0 7 3
F writeStyles() 0 138 13
F writeFont() 0 103 21
A allBorders() 0 13 3
A allStyles() 0 3 1
A startFont() 0 5 2
A allFonts() 0 13 3
A allFills() 0 22 3
A allNumberFormats() 0 13 4
B writePatternFill() 0 34 7
A writeBorder() 0 30 4
A writeBorderPr() 0 18 4
F writeCellStyleXf() 0 82 26
A writeNumFmt() 0 11 3
A writeCellStyleDxf() 0 18 1
A allConditionalStyles() 0 15 4

How to fix   Complexity   

Complex Class

Complex classes like Style often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Style, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
4
5
use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
6
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
7
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
8
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9
use PhpOffice\PhpSpreadsheet\Style\Alignment;
10
use PhpOffice\PhpSpreadsheet\Style\Border;
11
use PhpOffice\PhpSpreadsheet\Style\Borders;
12
use PhpOffice\PhpSpreadsheet\Style\Conditional;
13
use PhpOffice\PhpSpreadsheet\Style\Fill;
14
use PhpOffice\PhpSpreadsheet\Style\Font;
15
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
16
use PhpOffice\PhpSpreadsheet\Style\Protection;
17
18
class Style extends WriterPart
19
{
20
    /**
21
     * Write styles to XML format.
22
     *
23
     * @return string XML Output
24
     */
25 399
    public function writeStyles(Spreadsheet $spreadsheet): string
26
    {
27
        // Create XML writer
28 399
        $objWriter = null;
29 399
        if ($this->getParentWriter()->getUseDiskCaching()) {
30
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
31
        } else {
32 399
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
33
        }
34
35
        // XML header
36 399
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
37
38
        // styleSheet
39 399
        $objWriter->startElement('styleSheet');
40 399
        $objWriter->writeAttribute('xmlns', Namespaces::MAIN);
41
42
        // numFmts
43 399
        $objWriter->startElement('numFmts');
44 399
        $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getNumFmtHashTable()->count());
45
46
        // numFmt
47 399
        for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) {
48 47
            $this->writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i);
49
        }
50
51 399
        $objWriter->endElement();
52
53
        // fonts
54 399
        $objWriter->startElement('fonts');
55 399
        $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getFontHashTable()->count());
56
57
        // font
58 399
        for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) {
59 398
            $thisfont = $this->getParentWriter()->getFontHashTable()->getByIndex($i);
60 398
            if ($thisfont !== null) {
61 398
                $this->writeFont($objWriter, $thisfont, $spreadsheet);
62
            }
63
        }
64
65 399
        $objWriter->endElement();
66
67
        // fills
68 399
        $objWriter->startElement('fills');
69 399
        $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getFillHashTable()->count());
70
71
        // fill
72 399
        for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) {
73 398
            $thisfill = $this->getParentWriter()->getFillHashTable()->getByIndex($i);
74 398
            if ($thisfill !== null) {
75 398
                $this->writeFill($objWriter, $thisfill);
76
            }
77
        }
78
79 399
        $objWriter->endElement();
80
81
        // borders
82 399
        $objWriter->startElement('borders');
83 399
        $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getBordersHashTable()->count());
84
85
        // border
86 399
        for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) {
87 398
            $thisborder = $this->getParentWriter()->getBordersHashTable()->getByIndex($i);
88 398
            if ($thisborder !== null) {
89 398
                $this->writeBorder($objWriter, $thisborder);
90
            }
91
        }
92
93 399
        $objWriter->endElement();
94
95
        // cellStyleXfs
96 399
        $objWriter->startElement('cellStyleXfs');
97 399
        $objWriter->writeAttribute('count', '1');
98
99
        // xf
100 399
        $objWriter->startElement('xf');
101 399
        $objWriter->writeAttribute('numFmtId', '0');
102 399
        $objWriter->writeAttribute('fontId', '0');
103 399
        $objWriter->writeAttribute('fillId', '0');
104 399
        $objWriter->writeAttribute('borderId', '0');
105 399
        $objWriter->endElement();
106
107 399
        $objWriter->endElement();
108
109
        // cellXfs
110 399
        $objWriter->startElement('cellXfs');
111 399
        $objWriter->writeAttribute('count', (string) count($spreadsheet->getCellXfCollection()));
112
113
        // xf
114 399
        $alignment = new Alignment();
115 399
        $defaultAlignHash = $alignment->getHashCode();
116 399
        if ($defaultAlignHash !== $spreadsheet->getDefaultStyle()->getAlignment()->getHashCode()) {
117 10
            $defaultAlignHash = '';
118
        }
119 399
        foreach ($spreadsheet->getCellXfCollection() as $cellXf) {
120 399
            $this->writeCellStyleXf($objWriter, $cellXf, $spreadsheet, $defaultAlignHash);
121
        }
122
123 399
        $objWriter->endElement();
124
125
        // cellStyles
126 399
        $objWriter->startElement('cellStyles');
127 399
        $objWriter->writeAttribute('count', '1');
128
129
        // cellStyle
130 399
        $objWriter->startElement('cellStyle');
131 399
        $objWriter->writeAttribute('name', 'Normal');
132 399
        $objWriter->writeAttribute('xfId', '0');
133 399
        $objWriter->writeAttribute('builtinId', '0');
134 399
        $objWriter->endElement();
135
136 399
        $objWriter->endElement();
137
138
        // dxfs
139 399
        $objWriter->startElement('dxfs');
140 399
        $objWriter->writeAttribute('count', (string) $this->getParentWriter()->getStylesConditionalHashTable()->count());
141
142
        // dxf
143 399
        for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) {
144
            /** @var ?Conditional */
145 35
            $thisstyle = $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i);
146 35
            if ($thisstyle !== null) {
147 35
                $this->writeCellStyleDxf($objWriter, $thisstyle->getStyle(), $spreadsheet);
148
            }
149
        }
150
151 399
        $objWriter->endElement();
152
153
        // tableStyles
154 399
        $objWriter->startElement('tableStyles');
155 399
        $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9');
156 399
        $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1');
157 399
        $objWriter->endElement();
158
159 399
        $objWriter->endElement();
160
161
        // Return
162 399
        return $objWriter->getData();
163
    }
164
165
    /**
166
     * Write Fill.
167
     */
168 399
    private function writeFill(XMLWriter $objWriter, Fill $fill): void
169
    {
170
        // Check if this is a pattern type or gradient type
171
        if (
172 399
            $fill->getFillType() === Fill::FILL_GRADIENT_LINEAR
173 399
            || $fill->getFillType() === Fill::FILL_GRADIENT_PATH
174
        ) {
175
            // Gradient fill
176 6
            $this->writeGradientFill($objWriter, $fill);
177 399
        } elseif ($fill->getFillType() !== null) {
178
            // Pattern fill
179 399
            $this->writePatternFill($objWriter, $fill);
180
        }
181
    }
182
183
    /**
184
     * Write Gradient Fill.
185
     */
186 6
    private function writeGradientFill(XMLWriter $objWriter, Fill $fill): void
187
    {
188
        // fill
189 6
        $objWriter->startElement('fill');
190
191
        // gradientFill
192 6
        $objWriter->startElement('gradientFill');
193 6
        $objWriter->writeAttribute('type', (string) $fill->getFillType());
194 6
        $objWriter->writeAttribute('degree', (string) $fill->getRotation());
195
196
        // stop
197 6
        $objWriter->startElement('stop');
198 6
        $objWriter->writeAttribute('position', '0');
199
200
        // color
201 6
        if (!empty($fill->getStartColor()->getARGB())) {
202 6
            $objWriter->startElement('color');
203 6
            $objWriter->writeAttribute('rgb', $fill->getStartColor()->getARGB());
204 6
            $objWriter->endElement();
205
        }
206
207 6
        $objWriter->endElement();
208
209
        // stop
210 6
        $objWriter->startElement('stop');
211 6
        $objWriter->writeAttribute('position', '1');
212
213
        // color
214 6
        if (!empty($fill->getEndColor()->getARGB())) {
215 6
            $objWriter->startElement('color');
216 6
            $objWriter->writeAttribute('rgb', $fill->getEndColor()->getARGB());
217 6
            $objWriter->endElement();
218
        }
219
220 6
        $objWriter->endElement();
221
222 6
        $objWriter->endElement();
223
224 6
        $objWriter->endElement();
225
    }
226
227 399
    private static function writePatternColors(Fill $fill): bool
228
    {
229 399
        if ($fill->getFillType() === Fill::FILL_NONE) {
230 398
            return false;
231
        }
232
233 399
        return $fill->getFillType() === Fill::FILL_SOLID || $fill->getColorsChanged();
234
    }
235
236
    /**
237
     * Write Pattern Fill.
238
     */
239 399
    private function writePatternFill(XMLWriter $objWriter, Fill $fill): void
240
    {
241
        // fill
242 399
        $objWriter->startElement('fill');
243
244
        // patternFill
245 399
        $objWriter->startElement('patternFill');
246 399
        if ($fill->getFillType()) {
247 399
            $objWriter->writeAttribute('patternType', (string) $fill->getFillType());
248
        }
249
250 399
        if (self::writePatternColors($fill)) {
251
            // fgColor
252 46
            if ($fill->getStartColor()->getARGB()) {
253 41
                if (!$fill->getEndColor()->getARGB() && $fill->getFillType() === Fill::FILL_SOLID) {
254 13
                    $objWriter->startElement('bgColor');
255 13
                    $objWriter->writeAttribute('rgb', $fill->getStartColor()->getARGB());
256
                } else {
257 29
                    $objWriter->startElement('fgColor');
258 29
                    $objWriter->writeAttribute('rgb', $fill->getStartColor()->getARGB());
259
                }
260 41
                $objWriter->endElement();
261
            }
262
            // bgColor
263 46
            if ($fill->getEndColor()->getARGB()) {
264 34
                $objWriter->startElement('bgColor');
265 34
                $objWriter->writeAttribute('rgb', $fill->getEndColor()->getARGB());
266 34
                $objWriter->endElement();
267
            }
268
        }
269
270 399
        $objWriter->endElement();
271
272 399
        $objWriter->endElement();
273
    }
274
275 399
    private function startFont(XMLWriter $objWriter, bool &$fontStarted): void
276
    {
277 399
        if (!$fontStarted) {
278 399
            $fontStarted = true;
279 399
            $objWriter->startElement('font');
280
        }
281
    }
282
283
    /**
284
     * Write Font.
285
     */
286 399
    private function writeFont(XMLWriter $objWriter, Font $font, Spreadsheet $spreadsheet): void
287
    {
288 399
        $fontStarted = false;
289
        // font
290
        //    Weird! The order of these elements actually makes a difference when opening Xlsx
291
        //        files in Excel2003 with the compatibility pack. It's not documented behaviour,
292
        //        and makes for a real WTF!
293
294
        // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does
295
        // for conditional formatting). Otherwise it will apparently not be picked up in conditional
296
        // formatting style dialog
297 399
        if ($font->getBold() !== null) {
298 398
            $this->startFont($objWriter, $fontStarted);
299 398
            $objWriter->startElement('b');
300 398
            $objWriter->writeAttribute('val', $font->getBold() ? '1' : '0');
301 398
            $objWriter->endElement();
302
        }
303
304
        // Italic
305 399
        if ($font->getItalic() !== null) {
306 398
            $this->startFont($objWriter, $fontStarted);
307 398
            $objWriter->startElement('i');
308 398
            $objWriter->writeAttribute('val', $font->getItalic() ? '1' : '0');
309 398
            $objWriter->endElement();
310
        }
311
312
        // Strikethrough
313 399
        if ($font->getStrikethrough() !== null) {
314 398
            $this->startFont($objWriter, $fontStarted);
315 398
            $objWriter->startElement('strike');
316 398
            $objWriter->writeAttribute('val', $font->getStrikethrough() ? '1' : '0');
317 398
            $objWriter->endElement();
318
        }
319
320
        // Underline
321 399
        if ($font->getUnderline() !== null) {
322 398
            $this->startFont($objWriter, $fontStarted);
323 398
            $objWriter->startElement('u');
324 398
            $objWriter->writeAttribute('val', $font->getUnderline());
325 398
            $objWriter->endElement();
326
        }
327
328
        // Superscript / subscript
329 399
        if ($font->getSuperscript() === true || $font->getSubscript() === true) {
330 2
            $this->startFont($objWriter, $fontStarted);
331 2
            $objWriter->startElement('vertAlign');
332 2
            if ($font->getSuperscript() === true) {
333 2
                $objWriter->writeAttribute('val', 'superscript');
334 2
            } elseif ($font->getSubscript() === true) {
335 2
                $objWriter->writeAttribute('val', 'subscript');
336
            }
337 2
            $objWriter->endElement();
338
        }
339
340
        // Size
341 399
        if ($font->getSize() !== null) {
342 398
            $this->startFont($objWriter, $fontStarted);
343 398
            $objWriter->startElement('sz');
344 398
            $objWriter->writeAttribute('val', StringHelper::formatNumber($font->getSize()));
345 398
            $objWriter->endElement();
346
        }
347
348
        // Foreground color
349 399
        if ($font->getAutoColor()) {
350 1
            $this->startFont($objWriter, $fontStarted);
351 1
            $objWriter->startElement('auto');
352 1
            $objWriter->writeAttribute('val', '1');
353 1
            $objWriter->endElement();
354 398
        } elseif ($font->getColor()->getTheme() >= 0) {
355 64
            $this->startFont($objWriter, $fontStarted);
356 64
            $objWriter->startElement('color');
357 64
            $objWriter->writeAttribute('theme', (string) $font->getColor()->getTheme());
358 64
            $objWriter->endElement();
359 372
        } elseif ($font->getColor()->getARGB() !== null) {
360 365
            $this->startFont($objWriter, $fontStarted);
361 365
            $objWriter->startElement('color');
362 365
            $objWriter->writeAttribute('rgb', $font->getColor()->getARGB());
363 365
            $objWriter->endElement();
364
        }
365
366
        // Name
367 399
        if ($font->getName() !== null) {
368 398
            $this->startFont($objWriter, $fontStarted);
369 398
            $objWriter->startElement('name');
370 398
            $objWriter->writeAttribute('val', $font->getName());
371 398
            $objWriter->endElement();
372 398
            $charset = $spreadsheet->getFontCharset($font->getName());
373 398
            if ($charset >= 0 && $charset <= 255) {
374 10
                $objWriter->startElement('charset');
375 10
                $objWriter->writeAttribute('val', "$charset");
376 10
                $objWriter->endElement();
377
            }
378
        }
379
380 399
        if (!empty($font->getScheme())) {
381 54
            $this->startFont($objWriter, $fontStarted);
382 54
            $objWriter->startElement('scheme');
383 54
            $objWriter->writeAttribute('val', $font->getScheme());
384 54
            $objWriter->endElement();
385
        }
386
387 399
        if ($fontStarted) {
388 399
            $objWriter->endElement();
389
        }
390
    }
391
392
    /**
393
     * Write Border.
394
     */
395 399
    private function writeBorder(XMLWriter $objWriter, Borders $borders): void
396
    {
397
        // Write border
398 399
        $objWriter->startElement('border');
399
        // Diagonal?
400 399
        switch ($borders->getDiagonalDirection()) {
401
            case Borders::DIAGONAL_UP:
402 3
                $objWriter->writeAttribute('diagonalUp', 'true');
403 3
                $objWriter->writeAttribute('diagonalDown', 'false');
404
405 3
                break;
406
            case Borders::DIAGONAL_DOWN:
407 2
                $objWriter->writeAttribute('diagonalUp', 'false');
408 2
                $objWriter->writeAttribute('diagonalDown', 'true');
409
410 2
                break;
411
            case Borders::DIAGONAL_BOTH:
412 3
                $objWriter->writeAttribute('diagonalUp', 'true');
413 3
                $objWriter->writeAttribute('diagonalDown', 'true');
414
415 3
                break;
416
        }
417
418
        // BorderPr
419 399
        $this->writeBorderPr($objWriter, 'left', $borders->getLeft());
420 399
        $this->writeBorderPr($objWriter, 'right', $borders->getRight());
421 399
        $this->writeBorderPr($objWriter, 'top', $borders->getTop());
422 399
        $this->writeBorderPr($objWriter, 'bottom', $borders->getBottom());
423 399
        $this->writeBorderPr($objWriter, 'diagonal', $borders->getDiagonal());
424 399
        $objWriter->endElement();
425
    }
426
427
    /**
428
     * Write Cell Style Xf.
429
     */
430 399
    private function writeCellStyleXf(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Style\Style $style, Spreadsheet $spreadsheet, string $defaultAlignHash): void
431
    {
432
        // xf
433 399
        $objWriter->startElement('xf');
434 399
        $objWriter->writeAttribute('xfId', '0');
435 399
        $objWriter->writeAttribute('fontId', (string) (int) $this->getParentWriter()->getFontHashTable()->getIndexForHashCode($style->getFont()->getHashCode()));
436 399
        if ($style->getQuotePrefix()) {
437 4
            $objWriter->writeAttribute('quotePrefix', '1');
438
        }
439
440 399
        if ($style->getNumberFormat()->getBuiltInFormatCode() === false) {
441 47
            $objWriter->writeAttribute('numFmtId', (string) (int) ($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($style->getNumberFormat()->getHashCode()) + 164));
442
        } else {
443 399
            $objWriter->writeAttribute('numFmtId', (string) (int) $style->getNumberFormat()->getBuiltInFormatCode());
444
        }
445
446 399
        $objWriter->writeAttribute('fillId', (string) (int) $this->getParentWriter()->getFillHashTable()->getIndexForHashCode($style->getFill()->getHashCode()));
447 399
        $objWriter->writeAttribute('borderId', (string) (int) $this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($style->getBorders()->getHashCode()));
448
449
        // Apply styles?
450 399
        $objWriter->writeAttribute('applyFont', ($spreadsheet->getDefaultStyle()->getFont()->getHashCode() != $style->getFont()->getHashCode()) ? '1' : '0');
451 399
        $objWriter->writeAttribute('applyNumberFormat', ($spreadsheet->getDefaultStyle()->getNumberFormat()->getHashCode() != $style->getNumberFormat()->getHashCode()) ? '1' : '0');
452 399
        $objWriter->writeAttribute('applyFill', ($spreadsheet->getDefaultStyle()->getFill()->getHashCode() != $style->getFill()->getHashCode()) ? '1' : '0');
453 399
        $objWriter->writeAttribute('applyBorder', ($spreadsheet->getDefaultStyle()->getBorders()->getHashCode() != $style->getBorders()->getHashCode()) ? '1' : '0');
454 399
        if ($defaultAlignHash !== '' && $defaultAlignHash === $style->getAlignment()->getHashCode()) {
455 389
            $applyAlignment = '0';
456
        } else {
457 63
            $applyAlignment = '1';
458
        }
459 399
        $objWriter->writeAttribute('applyAlignment', $applyAlignment);
460 399
        if ($style->getProtection()->getLocked() != Protection::PROTECTION_INHERIT || $style->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) {
461 25
            $objWriter->writeAttribute('applyProtection', 'true');
462
        }
463
464
        // alignment
465 399
        if ($applyAlignment === '1') {
466 63
            $objWriter->startElement('alignment');
467 63
            $vertical = Alignment::VERTICAL_ALIGNMENT_FOR_XLSX[$style->getAlignment()->getVertical()] ?? '';
468 63
            $horizontal = Alignment::HORIZONTAL_ALIGNMENT_FOR_XLSX[$style->getAlignment()->getHorizontal()] ?? '';
469 63
            if ($horizontal !== '') {
470 49
                $objWriter->writeAttribute('horizontal', $horizontal);
471
            }
472 63
            if ($vertical !== '') {
473 63
                $objWriter->writeAttribute('vertical', $vertical);
474
            }
475 63
            $justifyLastLine = $style->getAlignment()->getJustifyLastLine();
476 63
            if (is_bool($justifyLastLine)) {
477 1
                $objWriter->writeAttribute('justifyLastLine', (string) (int) $justifyLastLine);
478
            }
479
480 63
            if ($style->getAlignment()->getTextRotation() >= 0) {
481 62
                $textRotation = $style->getAlignment()->getTextRotation();
482
            } else {
483 6
                $textRotation = 90 - $style->getAlignment()->getTextRotation();
484
            }
485 63
            $objWriter->writeAttribute('textRotation', (string) $textRotation);
486
487 63
            $objWriter->writeAttribute('wrapText', ($style->getAlignment()->getWrapText() ? 'true' : 'false'));
488 63
            $objWriter->writeAttribute('shrinkToFit', ($style->getAlignment()->getShrinkToFit() ? 'true' : 'false'));
489
490 63
            if ($style->getAlignment()->getIndent() > 0) {
491 1
                $objWriter->writeAttribute('indent', (string) $style->getAlignment()->getIndent());
492
            }
493 63
            if ($style->getAlignment()->getReadOrder() > 0) {
494
                $objWriter->writeAttribute('readingOrder', (string) $style->getAlignment()->getReadOrder());
495
            }
496 63
            $objWriter->endElement();
497
        }
498
499
        // protection
500 399
        if ($style->getProtection()->getLocked() != Protection::PROTECTION_INHERIT || $style->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) {
501 25
            $objWriter->startElement('protection');
502 25
            if ($style->getProtection()->getLocked() != Protection::PROTECTION_INHERIT) {
503 19
                $objWriter->writeAttribute('locked', ($style->getProtection()->getLocked() == Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
504
            }
505 25
            if ($style->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) {
506 12
                $objWriter->writeAttribute('hidden', ($style->getProtection()->getHidden() == Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
507
            }
508 25
            $objWriter->endElement();
509
        }
510
511 399
        $objWriter->endElement();
512
    }
513
514
    /**
515
     * Write Cell Style Dxf.
516
     */
517 35
    private function writeCellStyleDxf(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Style\Style $style, Spreadsheet $spreadsheet): void
518
    {
519
        // dxf
520 35
        $objWriter->startElement('dxf');
521
522
        // font
523 35
        $this->writeFont($objWriter, $style->getFont(), $spreadsheet);
524
525
        // numFmt
526 35
        $this->writeNumFmt($objWriter, $style->getNumberFormat());
527
528
        // fill
529 35
        $this->writeFill($objWriter, $style->getFill());
530
531
        // border
532 35
        $this->writeBorder($objWriter, $style->getBorders());
533
534 35
        $objWriter->endElement();
535
    }
536
537
    /**
538
     * Write BorderPr.
539
     *
540
     * @param string $name Element name
541
     */
542 399
    private function writeBorderPr(XMLWriter $objWriter, string $name, Border $border): void
543
    {
544
        // Write BorderPr
545 399
        if ($border->getBorderStyle() === Border::BORDER_OMIT) {
546 35
            return;
547
        }
548 398
        $objWriter->startElement($name);
549 398
        if ($border->getBorderStyle() !== Border::BORDER_NONE) {
550 33
            $objWriter->writeAttribute('style', $border->getBorderStyle());
551
552
            // color
553 33
            if ($border->getColor()->getARGB() !== null) {
554 33
                $objWriter->startElement('color');
555 33
                $objWriter->writeAttribute('rgb', $border->getColor()->getARGB());
556 33
                $objWriter->endElement();
557
            }
558
        }
559 398
        $objWriter->endElement();
560
    }
561
562
    /**
563
     * Write NumberFormat.
564
     *
565
     * @param int $id Number Format identifier
566
     */
567 77
    private function writeNumFmt(XMLWriter $objWriter, ?NumberFormat $numberFormat, int $id = 0): void
568
    {
569
        // Translate formatcode
570 77
        $formatCode = ($numberFormat === null) ? null : $numberFormat->getFormatCode();
571
572
        // numFmt
573 77
        if ($formatCode !== null) {
574 49
            $objWriter->startElement('numFmt');
575 49
            $objWriter->writeAttribute('numFmtId', (string) ($id + 164));
576 49
            $objWriter->writeAttribute('formatCode', $formatCode);
577 49
            $objWriter->endElement();
578
        }
579
    }
580
581
    /**
582
     * Get an array of all styles.
583
     *
584
     * @return \PhpOffice\PhpSpreadsheet\Style\Style[] All styles in PhpSpreadsheet
585
     */
586 398
    public function allStyles(Spreadsheet $spreadsheet): array
587
    {
588 398
        return $spreadsheet->getCellXfCollection();
589
    }
590
591
    /**
592
     * Get an array of all conditional styles.
593
     *
594
     * @return Conditional[] All conditional styles in PhpSpreadsheet
595
     */
596 399
    public function allConditionalStyles(Spreadsheet $spreadsheet): array
597
    {
598
        // Get an array of all styles
599 399
        $aStyles = [];
600
601 399
        $sheetCount = $spreadsheet->getSheetCount();
602 399
        for ($i = 0; $i < $sheetCount; ++$i) {
603 399
            foreach ($spreadsheet->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) {
604 35
                foreach ($conditionalStyles as $conditionalStyle) {
605 35
                    $aStyles[] = $conditionalStyle;
606
                }
607
            }
608
        }
609
610 399
        return $aStyles;
611
    }
612
613
    /**
614
     * Get an array of all fills.
615
     *
616
     * @return Fill[] All fills in PhpSpreadsheet
617
     */
618 398
    public function allFills(Spreadsheet $spreadsheet): array
619
    {
620
        // Get an array of unique fills
621 398
        $aFills = [];
622
623
        // Two first fills are predefined
624 398
        $fill0 = new Fill();
625 398
        $fill0->setFillType(Fill::FILL_NONE);
626 398
        $aFills[] = $fill0;
627
628 398
        $fill1 = new Fill();
629 398
        $fill1->setFillType(Fill::FILL_PATTERN_GRAY125);
630 398
        $aFills[] = $fill1;
631
        // The remaining fills
632 398
        $aStyles = $this->allStyles($spreadsheet);
633 398
        foreach ($aStyles as $style) {
634 398
            if (!isset($aFills[$style->getFill()->getHashCode()])) {
635 398
                $aFills[$style->getFill()->getHashCode()] = $style->getFill();
636
            }
637
        }
638
639 398
        return $aFills;
640
    }
641
642
    /**
643
     * Get an array of all fonts.
644
     *
645
     * @return Font[] All fonts in PhpSpreadsheet
646
     */
647 398
    public function allFonts(Spreadsheet $spreadsheet): array
648
    {
649
        // Get an array of unique fonts
650 398
        $aFonts = [];
651 398
        $aStyles = $this->allStyles($spreadsheet);
652
653 398
        foreach ($aStyles as $style) {
654 398
            if (!isset($aFonts[$style->getFont()->getHashCode()])) {
655 398
                $aFonts[$style->getFont()->getHashCode()] = $style->getFont();
656
            }
657
        }
658
659 398
        return $aFonts;
660
    }
661
662
    /**
663
     * Get an array of all borders.
664
     *
665
     * @return Borders[] All borders in PhpSpreadsheet
666
     */
667 398
    public function allBorders(Spreadsheet $spreadsheet): array
668
    {
669
        // Get an array of unique borders
670 398
        $aBorders = [];
671 398
        $aStyles = $this->allStyles($spreadsheet);
672
673 398
        foreach ($aStyles as $style) {
674 398
            if (!isset($aBorders[$style->getBorders()->getHashCode()])) {
675 398
                $aBorders[$style->getBorders()->getHashCode()] = $style->getBorders();
676
            }
677
        }
678
679 398
        return $aBorders;
680
    }
681
682
    /**
683
     * Get an array of all number formats.
684
     *
685
     * @return NumberFormat[] All number formats in PhpSpreadsheet
686
     */
687 398
    public function allNumberFormats(Spreadsheet $spreadsheet): array
688
    {
689
        // Get an array of unique number formats
690 398
        $aNumFmts = [];
691 398
        $aStyles = $this->allStyles($spreadsheet);
692
693 398
        foreach ($aStyles as $style) {
694 398
            if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !isset($aNumFmts[$style->getNumberFormat()->getHashCode()])) {
695 47
                $aNumFmts[$style->getNumberFormat()->getHashCode()] = $style->getNumberFormat();
696
            }
697
        }
698
699 398
        return $aNumFmts;
700
    }
701
}
702