Failed Conditions
Push — master ( 9dc82e...e23c98 )
by
unknown
20:43 queued 07:22
created

Style::allFills()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 22
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 3

Importance

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