Failed Conditions
Pull Request — master (#4257)
by Owen
12:03
created

Style::writeStyles()   F

Complexity

Conditions 13
Paths 1296

Size

Total Lines 139
Code Lines 74

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 73
CRAP Score 13.0004

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 74
c 1
b 0
f 0
dl 0
loc 139
ccs 73
cts 74
cp 0.9865
rs 2.5272
cc 13
nc 1296
nop 1
crap 13.0004

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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