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\Reader\Xlsx;
4
 
5
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
6
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
7
use SimpleXMLElement;
8
 
9
class PageSetup extends BaseParserClass
10
{
11
    private Worksheet $worksheet;
12
 
13
    private ?SimpleXMLElement $worksheetXml;
14
 
15
    public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null)
16
    {
17
        $this->worksheet = $workSheet;
18
        $this->worksheetXml = $worksheetXml;
19
    }
20
 
21
    public function load(array $unparsedLoadedData): array
22
    {
23
        $worksheetXml = $this->worksheetXml;
24
        if ($worksheetXml === null) {
25
            return $unparsedLoadedData;
26
        }
27
 
28
        $this->margins($worksheetXml, $this->worksheet);
29
        $unparsedLoadedData = $this->pageSetup($worksheetXml, $this->worksheet, $unparsedLoadedData);
30
        $this->headerFooter($worksheetXml, $this->worksheet);
31
        $this->pageBreaks($worksheetXml, $this->worksheet);
32
 
33
        return $unparsedLoadedData;
34
    }
35
 
36
    private function margins(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void
37
    {
38
        if ($xmlSheet->pageMargins) {
39
            $docPageMargins = $worksheet->getPageMargins();
40
            $docPageMargins->setLeft((float) ($xmlSheet->pageMargins['left']));
41
            $docPageMargins->setRight((float) ($xmlSheet->pageMargins['right']));
42
            $docPageMargins->setTop((float) ($xmlSheet->pageMargins['top']));
43
            $docPageMargins->setBottom((float) ($xmlSheet->pageMargins['bottom']));
44
            $docPageMargins->setHeader((float) ($xmlSheet->pageMargins['header']));
45
            $docPageMargins->setFooter((float) ($xmlSheet->pageMargins['footer']));
46
        }
47
    }
48
 
49
    private function pageSetup(SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData): array
50
    {
51
        if ($xmlSheet->pageSetup) {
52
            $docPageSetup = $worksheet->getPageSetup();
53
 
54
            if (isset($xmlSheet->pageSetup['orientation'])) {
55
                $docPageSetup->setOrientation((string) $xmlSheet->pageSetup['orientation']);
56
            }
57
            if (isset($xmlSheet->pageSetup['paperSize'])) {
58
                $docPageSetup->setPaperSize((int) ($xmlSheet->pageSetup['paperSize']));
59
            }
60
            if (isset($xmlSheet->pageSetup['scale'])) {
61
                $docPageSetup->setScale((int) ($xmlSheet->pageSetup['scale']), false);
62
            }
63
            if (isset($xmlSheet->pageSetup['fitToHeight']) && (int) ($xmlSheet->pageSetup['fitToHeight']) >= 0) {
64
                $docPageSetup->setFitToHeight((int) ($xmlSheet->pageSetup['fitToHeight']), false);
65
            }
66
            if (isset($xmlSheet->pageSetup['fitToWidth']) && (int) ($xmlSheet->pageSetup['fitToWidth']) >= 0) {
67
                $docPageSetup->setFitToWidth((int) ($xmlSheet->pageSetup['fitToWidth']), false);
68
            }
69
            if (
70
                isset($xmlSheet->pageSetup['firstPageNumber'], $xmlSheet->pageSetup['useFirstPageNumber'])
71
                && self::boolean((string) $xmlSheet->pageSetup['useFirstPageNumber'])
72
            ) {
73
                $docPageSetup->setFirstPageNumber((int) ($xmlSheet->pageSetup['firstPageNumber']));
74
            }
75
            if (isset($xmlSheet->pageSetup['pageOrder'])) {
76
                $docPageSetup->setPageOrder((string) $xmlSheet->pageSetup['pageOrder']);
77
            }
78
 
79
            $relAttributes = $xmlSheet->pageSetup->attributes(Namespaces::SCHEMA_OFFICE_DOCUMENT);
80
            if (isset($relAttributes['id'])) {
81
                $relid = (string) $relAttributes['id'];
82
                if (!str_ends_with($relid, 'ps')) {
83
                    $relid .= 'ps';
84
                }
85
                $unparsedLoadedData['sheets'][$worksheet->getCodeName()]['pageSetupRelId'] = $relid;
86
            }
87
        }
88
 
89
        return $unparsedLoadedData;
90
    }
91
 
92
    private function headerFooter(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void
93
    {
94
        if ($xmlSheet->headerFooter) {
95
            $docHeaderFooter = $worksheet->getHeaderFooter();
96
 
97
            if (
98
                isset($xmlSheet->headerFooter['differentOddEven'])
99
                && self::boolean((string) $xmlSheet->headerFooter['differentOddEven'])
100
            ) {
101
                $docHeaderFooter->setDifferentOddEven(true);
102
            } else {
103
                $docHeaderFooter->setDifferentOddEven(false);
104
            }
105
            if (
106
                isset($xmlSheet->headerFooter['differentFirst'])
107
                && self::boolean((string) $xmlSheet->headerFooter['differentFirst'])
108
            ) {
109
                $docHeaderFooter->setDifferentFirst(true);
110
            } else {
111
                $docHeaderFooter->setDifferentFirst(false);
112
            }
113
            if (
114
                isset($xmlSheet->headerFooter['scaleWithDoc'])
115
                && !self::boolean((string) $xmlSheet->headerFooter['scaleWithDoc'])
116
            ) {
117
                $docHeaderFooter->setScaleWithDocument(false);
118
            } else {
119
                $docHeaderFooter->setScaleWithDocument(true);
120
            }
121
            if (
122
                isset($xmlSheet->headerFooter['alignWithMargins'])
123
                && !self::boolean((string) $xmlSheet->headerFooter['alignWithMargins'])
124
            ) {
125
                $docHeaderFooter->setAlignWithMargins(false);
126
            } else {
127
                $docHeaderFooter->setAlignWithMargins(true);
128
            }
129
 
130
            $docHeaderFooter->setOddHeader((string) $xmlSheet->headerFooter->oddHeader);
131
            $docHeaderFooter->setOddFooter((string) $xmlSheet->headerFooter->oddFooter);
132
            $docHeaderFooter->setEvenHeader((string) $xmlSheet->headerFooter->evenHeader);
133
            $docHeaderFooter->setEvenFooter((string) $xmlSheet->headerFooter->evenFooter);
134
            $docHeaderFooter->setFirstHeader((string) $xmlSheet->headerFooter->firstHeader);
135
            $docHeaderFooter->setFirstFooter((string) $xmlSheet->headerFooter->firstFooter);
136
        }
137
    }
138
 
139
    private function pageBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void
140
    {
141
        if ($xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk) {
142
            $this->rowBreaks($xmlSheet, $worksheet);
143
        }
144
        if ($xmlSheet->colBreaks && $xmlSheet->colBreaks->brk) {
145
            $this->columnBreaks($xmlSheet, $worksheet);
146
        }
147
    }
148
 
149
    private function rowBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void
150
    {
151
        foreach ($xmlSheet->rowBreaks->brk as $brk) {
152
            $rowBreakMax = isset($brk['max']) ? ((int) $brk['max']) : -1;
153
            if ($brk['man']) {
154
                $worksheet->setBreak("A{$brk['id']}", Worksheet::BREAK_ROW, $rowBreakMax);
155
            }
156
        }
157
    }
158
 
159
    private function columnBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void
160
    {
161
        foreach ($xmlSheet->colBreaks->brk as $brk) {
162
            if ($brk['man']) {
163
                $worksheet->setBreak(
164
                    Coordinate::stringFromColumnIndex(((int) $brk['id']) + 1) . '1',
165
                    Worksheet::BREAK_COLUMN
166
                );
167
            }
168
        }
169
    }
170
}