Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
namespace PhpOffice\PhpSpreadsheet\Writer\Ods;
4
 
5
use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
6
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
7
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
8
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
10
 
11
class Settings extends WriterPart
12
{
13
    /**
14
     * Write settings.xml to XML format.
15
     *
16
     * @return string XML Output
17
     */
18
    public function write(): string
19
    {
20
        if ($this->getParentWriter()->getUseDiskCaching()) {
21
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
22
        } else {
23
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
24
        }
25
 
26
        // XML header
27
        $objWriter->startDocument('1.0', 'UTF-8');
28
 
29
        // Settings
30
        $objWriter->startElement('office:document-settings');
31
        $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');
32
        $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
33
        $objWriter->writeAttribute('xmlns:config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0');
34
        $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');
35
        $objWriter->writeAttribute('office:version', '1.2');
36
 
37
        $objWriter->startElement('office:settings');
38
        $objWriter->startElement('config:config-item-set');
39
        $objWriter->writeAttribute('config:name', 'ooo:view-settings');
40
        $objWriter->startElement('config:config-item-map-indexed');
41
        $objWriter->writeAttribute('config:name', 'Views');
42
        $objWriter->startElement('config:config-item-map-entry');
43
        $spreadsheet = $this->getParentWriter()->getSpreadsheet();
44
 
45
        $objWriter->startElement('config:config-item');
46
        $objWriter->writeAttribute('config:name', 'ViewId');
47
        $objWriter->writeAttribute('config:type', 'string');
48
        $objWriter->text('view1');
49
        $objWriter->endElement(); // ViewId
50
        $objWriter->startElement('config:config-item-map-named');
51
 
52
        $this->writeAllWorksheetSettings($objWriter, $spreadsheet);
53
 
54
        $wstitle = $spreadsheet->getActiveSheet()->getTitle();
55
        $objWriter->startElement('config:config-item');
56
        $objWriter->writeAttribute('config:name', 'ActiveTable');
57
        $objWriter->writeAttribute('config:type', 'string');
58
        $objWriter->text($wstitle);
59
        $objWriter->endElement(); // config:config-item ActiveTable
60
 
61
        $objWriter->endElement(); // config:config-item-map-entry
62
        $objWriter->endElement(); // config:config-item-map-indexed Views
63
        $objWriter->endElement(); // config:config-item-set ooo:view-settings
64
        $objWriter->startElement('config:config-item-set');
65
        $objWriter->writeAttribute('config:name', 'ooo:configuration-settings');
66
        $objWriter->endElement(); // config:config-item-set ooo:configuration-settings
67
        $objWriter->endElement(); // office:settings
68
        $objWriter->endElement(); // office:document-settings
69
 
70
        return $objWriter->getData();
71
    }
72
 
73
    private function writeAllWorksheetSettings(XMLWriter $objWriter, Spreadsheet $spreadsheet): void
74
    {
75
        $objWriter->writeAttribute('config:name', 'Tables');
76
 
77
        foreach ($spreadsheet->getWorksheetIterator() as $worksheet) {
78
            $this->writeWorksheetSettings($objWriter, $worksheet);
79
        }
80
 
81
        $objWriter->endElement(); // config:config-item-map-entry Tables
82
    }
83
 
84
    private function writeWorksheetSettings(XMLWriter $objWriter, Worksheet $worksheet): void
85
    {
86
        $objWriter->startElement('config:config-item-map-entry');
87
        $objWriter->writeAttribute('config:name', $worksheet->getTitle());
88
 
89
        $this->writeSelectedCells($objWriter, $worksheet);
90
        if ($worksheet->getFreezePane() !== null) {
91
            $this->writeFreezePane($objWriter, $worksheet);
92
        }
93
 
94
        $objWriter->endElement(); // config:config-item-map-entry Worksheet
95
    }
96
 
97
    private function writeSelectedCells(XMLWriter $objWriter, Worksheet $worksheet): void
98
    {
99
        $selected = $worksheet->getSelectedCells();
100
        if (preg_match('/^([a-z]+)([0-9]+)/i', $selected, $matches) === 1) {
101
            $colSel = Coordinate::columnIndexFromString($matches[1]) - 1;
102
            $rowSel = (int) $matches[2] - 1;
103
            $objWriter->startElement('config:config-item');
104
            $objWriter->writeAttribute('config:name', 'CursorPositionX');
105
            $objWriter->writeAttribute('config:type', 'int');
106
            $objWriter->text((string) $colSel);
107
            $objWriter->endElement();
108
            $objWriter->startElement('config:config-item');
109
            $objWriter->writeAttribute('config:name', 'CursorPositionY');
110
            $objWriter->writeAttribute('config:type', 'int');
111
            $objWriter->text((string) $rowSel);
112
            $objWriter->endElement();
113
        }
114
    }
115
 
116
    private function writeSplitValue(XMLWriter $objWriter, string $splitMode, string $type, string $value): void
117
    {
118
        $objWriter->startElement('config:config-item');
119
        $objWriter->writeAttribute('config:name', $splitMode);
120
        $objWriter->writeAttribute('config:type', $type);
121
        $objWriter->text($value);
122
        $objWriter->endElement();
123
    }
124
 
125
    private function writeFreezePane(XMLWriter $objWriter, Worksheet $worksheet): void
126
    {
127
        $freezePane = CellAddress::fromCellAddress($worksheet->getFreezePane());
128
        if ($freezePane->cellAddress() === 'A1') {
129
            return;
130
        }
131
 
132
        $columnId = $freezePane->columnId();
133
        $columnName = $freezePane->columnName();
134
        $row = $freezePane->rowId();
135
 
136
        $this->writeSplitValue($objWriter, 'HorizontalSplitMode', 'short', '2');
137
        $this->writeSplitValue($objWriter, 'HorizontalSplitPosition', 'int', (string) ($columnId - 1));
138
        $this->writeSplitValue($objWriter, 'PositionLeft', 'short', '0');
139
        $this->writeSplitValue($objWriter, 'PositionRight', 'short', (string) ($columnId - 1));
140
 
141
        for ($column = 'A'; $column !== $columnName; ++$column) {
142
            $worksheet->getColumnDimension($column)->setAutoSize(true);
143
        }
144
 
145
        $this->writeSplitValue($objWriter, 'VerticalSplitMode', 'short', '2');
146
        $this->writeSplitValue($objWriter, 'VerticalSplitPosition', 'int', (string) ($row - 1));
147
        $this->writeSplitValue($objWriter, 'PositionTop', 'short', '0');
148
        $this->writeSplitValue($objWriter, 'PositionBottom', 'short', (string) ($row - 1));
149
 
150
        $this->writeSplitValue($objWriter, 'ActiveSplitRange', 'short', '3');
151
    }
152
}