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\Xlsx;
4
 
5
use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Namespaces;
6
use PhpOffice\PhpSpreadsheet\Shared\Date;
7
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
8
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
10
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\DefinedNames as DefinedNamesWriter;
11
 
12
class Workbook extends WriterPart
13
{
14
    /**
15
     * Write workbook to XML format.
16
     *
17
     * @param bool $recalcRequired Indicate whether formulas should be recalculated before writing
18
     *
19
     * @return string XML Output
20
     */
21
    public function writeWorkbook(Spreadsheet $spreadsheet, $recalcRequired = false)
22
    {
23
        // Create XML writer
24
        if ($this->getParentWriter()->getUseDiskCaching()) {
25
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
26
        } else {
27
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
28
        }
29
 
30
        // XML header
31
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
32
 
33
        // workbook
34
        $objWriter->startElement('workbook');
35
        $objWriter->writeAttribute('xml:space', 'preserve');
36
        $objWriter->writeAttribute('xmlns', Namespaces::MAIN);
37
        $objWriter->writeAttribute('xmlns:r', Namespaces::SCHEMA_OFFICE_DOCUMENT);
38
 
39
        // fileVersion
40
        $this->writeFileVersion($objWriter);
41
 
42
        // workbookPr
43
        $this->writeWorkbookPr($objWriter);
44
 
45
        // workbookProtection
46
        $this->writeWorkbookProtection($objWriter, $spreadsheet);
47
 
48
        // bookViews
49
        if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
50
            $this->writeBookViews($objWriter, $spreadsheet);
51
        }
52
 
53
        // sheets
54
        $this->writeSheets($objWriter, $spreadsheet);
55
 
56
        // definedNames
57
        (new DefinedNamesWriter($objWriter, $spreadsheet))->write();
58
 
59
        // calcPr
60
        $this->writeCalcPr($objWriter, $recalcRequired);
61
 
62
        $objWriter->endElement();
63
 
64
        // Return
65
        return $objWriter->getData();
66
    }
67
 
68
    /**
69
     * Write file version.
70
     */
71
    private function writeFileVersion(XMLWriter $objWriter): void
72
    {
73
        $objWriter->startElement('fileVersion');
74
        $objWriter->writeAttribute('appName', 'xl');
75
        $objWriter->writeAttribute('lastEdited', '4');
76
        $objWriter->writeAttribute('lowestEdited', '4');
77
        $objWriter->writeAttribute('rupBuild', '4505');
78
        $objWriter->endElement();
79
    }
80
 
81
    /**
82
     * Write WorkbookPr.
83
     */
84
    private function writeWorkbookPr(XMLWriter $objWriter): void
85
    {
86
        $objWriter->startElement('workbookPr');
87
 
88
        if (Date::getExcelCalendar() === Date::CALENDAR_MAC_1904) {
89
            $objWriter->writeAttribute('date1904', '1');
90
        }
91
 
92
        $objWriter->writeAttribute('codeName', 'ThisWorkbook');
93
 
94
        $objWriter->endElement();
95
    }
96
 
97
    /**
98
     * Write BookViews.
99
     */
100
    private function writeBookViews(XMLWriter $objWriter, Spreadsheet $spreadsheet): void
101
    {
102
        // bookViews
103
        $objWriter->startElement('bookViews');
104
 
105
        // workbookView
106
        $objWriter->startElement('workbookView');
107
 
108
        $objWriter->writeAttribute('activeTab', (string) $spreadsheet->getActiveSheetIndex());
109
        $objWriter->writeAttribute('autoFilterDateGrouping', ($spreadsheet->getAutoFilterDateGrouping() ? 'true' : 'false'));
110
        $objWriter->writeAttribute('firstSheet', (string) $spreadsheet->getFirstSheetIndex());
111
        $objWriter->writeAttribute('minimized', ($spreadsheet->getMinimized() ? 'true' : 'false'));
112
        $objWriter->writeAttribute('showHorizontalScroll', ($spreadsheet->getShowHorizontalScroll() ? 'true' : 'false'));
113
        $objWriter->writeAttribute('showSheetTabs', ($spreadsheet->getShowSheetTabs() ? 'true' : 'false'));
114
        $objWriter->writeAttribute('showVerticalScroll', ($spreadsheet->getShowVerticalScroll() ? 'true' : 'false'));
115
        $objWriter->writeAttribute('tabRatio', (string) $spreadsheet->getTabRatio());
116
        $objWriter->writeAttribute('visibility', $spreadsheet->getVisibility());
117
 
118
        $objWriter->endElement();
119
 
120
        $objWriter->endElement();
121
    }
122
 
123
    /**
124
     * Write WorkbookProtection.
125
     */
126
    private function writeWorkbookProtection(XMLWriter $objWriter, Spreadsheet $spreadsheet): void
127
    {
128
        if ($spreadsheet->getSecurity()->isSecurityEnabled()) {
129
            $objWriter->startElement('workbookProtection');
130
            $objWriter->writeAttribute('lockRevision', ($spreadsheet->getSecurity()->getLockRevision() ? 'true' : 'false'));
131
            $objWriter->writeAttribute('lockStructure', ($spreadsheet->getSecurity()->getLockStructure() ? 'true' : 'false'));
132
            $objWriter->writeAttribute('lockWindows', ($spreadsheet->getSecurity()->getLockWindows() ? 'true' : 'false'));
133
 
134
            if ($spreadsheet->getSecurity()->getRevisionsPassword() != '') {
135
                $objWriter->writeAttribute('revisionsPassword', $spreadsheet->getSecurity()->getRevisionsPassword());
136
            }
137
 
138
            if ($spreadsheet->getSecurity()->getWorkbookPassword() != '') {
139
                $objWriter->writeAttribute('workbookPassword', $spreadsheet->getSecurity()->getWorkbookPassword());
140
            }
141
 
142
            $objWriter->endElement();
143
        }
144
    }
145
 
146
    /**
147
     * Write calcPr.
148
     *
149
     * @param bool $recalcRequired Indicate whether formulas should be recalculated before writing
150
     */
151
    private function writeCalcPr(XMLWriter $objWriter, $recalcRequired = true): void
152
    {
153
        $objWriter->startElement('calcPr');
154
 
155
        //    Set the calcid to a higher value than Excel itself will use, otherwise Excel will always recalc
156
        //  If MS Excel does do a recalc, then users opening a file in MS Excel will be prompted to save on exit
157
        //     because the file has changed
158
        $objWriter->writeAttribute('calcId', '999999');
159
        $objWriter->writeAttribute('calcMode', 'auto');
160
        //    fullCalcOnLoad isn't needed if we've recalculating for the save
161
        $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? '1' : '0');
162
        $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? '0' : '1');
163
        $objWriter->writeAttribute('forceFullCalc', ($recalcRequired) ? '0' : '1');
164
 
165
        $objWriter->endElement();
166
    }
167
 
168
    /**
169
     * Write sheets.
170
     */
171
    private function writeSheets(XMLWriter $objWriter, Spreadsheet $spreadsheet): void
172
    {
173
        // Write sheets
174
        $objWriter->startElement('sheets');
175
        $sheetCount = $spreadsheet->getSheetCount();
176
        for ($i = 0; $i < $sheetCount; ++$i) {
177
            // sheet
178
            $this->writeSheet(
179
                $objWriter,
180
                $spreadsheet->getSheet($i)->getTitle(),
181
                ($i + 1),
182
                ($i + 1 + 3),
183
                $spreadsheet->getSheet($i)->getSheetState()
184
            );
185
        }
186
 
187
        $objWriter->endElement();
188
    }
189
 
190
    /**
191
     * Write sheet.
192
     *
193
     * @param string $worksheetName Sheet name
194
     * @param int $worksheetId Sheet id
195
     * @param int $relId Relationship ID
196
     * @param string $sheetState Sheet state (visible, hidden, veryHidden)
197
     */
198
    private function writeSheet(XMLWriter $objWriter, $worksheetName, $worksheetId = 1, $relId = 1, $sheetState = 'visible'): void
199
    {
200
        if ($worksheetName != '') {
201
            // Write sheet
202
            $objWriter->startElement('sheet');
203
            $objWriter->writeAttribute('name', $worksheetName);
204
            $objWriter->writeAttribute('sheetId', (string) $worksheetId);
205
            if ($sheetState !== 'visible' && $sheetState != '') {
206
                $objWriter->writeAttribute('state', $sheetState);
207
            }
208
            $objWriter->writeAttribute('r:id', 'rId' . $relId);
209
            $objWriter->endElement();
210
        } else {
211
            throw new WriterException('Invalid parameters passed.');
212
        }
213
    }
214
}