Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

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