Failed Conditions
Push — develop ( a6bb49...7a4cbd )
by Adrien
36:15
created

Xlsx::getOffice2003Compatibility()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer;
4
5
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
6
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
7
use PhpOffice\PhpSpreadsheet\HashTable;
8
use PhpOffice\PhpSpreadsheet\Shared\File;
9
use PhpOffice\PhpSpreadsheet\Spreadsheet;
10
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing as WorksheetDrawing;
11
use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
12
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
13
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Chart;
14
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Comments;
15
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\ContentTypes;
16
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\DocProps;
17
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Drawing;
18
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels;
19
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\RelsRibbon;
20
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\RelsVBA;
21
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\StringTable;
22
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style;
23
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Theme;
24
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Workbook;
25
use PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet;
26
use ZipArchive;
27
28
class Xlsx extends BaseWriter
29
{
30
    /**
31
     * Office2003 compatibility.
32
     *
33
     * @var bool
34
     */
35
    private $office2003compatibility = false;
36
37
    /**
38
     * Private writer parts.
39
     *
40
     * @var Xlsx\WriterPart[]
41
     */
42
    private $writerParts = [];
43
44
    /**
45
     * Private Spreadsheet.
46
     *
47
     * @var Spreadsheet
48
     */
49
    private $spreadSheet;
50
51
    /**
52
     * Private string table.
53
     *
54
     * @var string[]
55
     */
56
    private $stringTable = [];
57
58
    /**
59
     * Private unique Conditional HashTable.
60
     *
61
     * @var HashTable
62
     */
63
    private $stylesConditionalHashTable;
64
65
    /**
66
     * Private unique Style HashTable.
67
     *
68
     * @var HashTable
69
     */
70
    private $styleHashTable;
71
72
    /**
73
     * Private unique Fill HashTable.
74
     *
75
     * @var HashTable
76
     */
77
    private $fillHashTable;
78
79
    /**
80
     * Private unique \PhpOffice\PhpSpreadsheet\Style\Font HashTable.
81
     *
82
     * @var HashTable
83
     */
84
    private $fontHashTable;
85
86
    /**
87
     * Private unique Borders HashTable.
88
     *
89
     * @var HashTable
90
     */
91
    private $bordersHashTable;
92
93
    /**
94
     * Private unique NumberFormat HashTable.
95
     *
96
     * @var HashTable
97
     */
98
    private $numFmtHashTable;
99
100
    /**
101
     * Private unique \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\BaseDrawing HashTable.
102
     *
103
     * @var HashTable
104
     */
105
    private $drawingHashTable;
106
107
    /**
108
     * Create a new Xlsx Writer.
109
     *
110
     * @param Spreadsheet $spreadsheet
111
     */
112 79
    public function __construct(Spreadsheet $spreadsheet)
113
    {
114
        // Assign PhpSpreadsheet
115 79
        $this->setSpreadsheet($spreadsheet);
116
117
        $writerPartsArray = [
118 79
            'stringtable' => StringTable::class,
119
            'contenttypes' => ContentTypes::class,
120
            'docprops' => DocProps::class,
121
            'rels' => Rels::class,
122
            'theme' => Theme::class,
123
            'style' => Style::class,
124
            'workbook' => Workbook::class,
125
            'worksheet' => Worksheet::class,
126
            'drawing' => Drawing::class,
127
            'comments' => Comments::class,
128
            'chart' => Chart::class,
129
            'relsvba' => RelsVBA::class,
130
            'relsribbonobjects' => RelsRibbon::class,
131
        ];
132
133
        //    Initialise writer parts
134
        //        and Assign their parent IWriters
135 79
        foreach ($writerPartsArray as $writer => $class) {
136 79
            $this->writerParts[$writer] = new $class($this);
137
        }
138
139 79
        $hashTablesArray = ['stylesConditionalHashTable', 'fillHashTable', 'fontHashTable',
140
            'bordersHashTable', 'numFmtHashTable', 'drawingHashTable',
141
            'styleHashTable',
142
        ];
143
144
        // Set HashTable variables
145 79
        foreach ($hashTablesArray as $tableName) {
146 79
            $this->$tableName = new HashTable();
147
        }
148 79
    }
149
150
    /**
151
     * Get writer part.
152
     *
153
     * @param string $pPartName Writer part name
154
     *
155
     * @return \PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart
156
     */
157 78
    public function getWriterPart($pPartName)
158
    {
159 78
        if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) {
160 78
            return $this->writerParts[strtolower($pPartName)];
161
        }
162
163
        return null;
164
    }
165
166
    /**
167
     * Save PhpSpreadsheet to file.
168
     *
169
     * @param string $pFilename
170
     *
171
     * @throws WriterException
172
     */
173 78
    public function save($pFilename)
174
    {
175 78
        if ($this->spreadSheet !== null) {
176
            // garbage collect
177 78
            $this->spreadSheet->garbageCollect();
178
179
            // If $pFilename is php://output or php://stdout, make it a temporary file...
180 78
            $originalFilename = $pFilename;
181 78
            if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') {
182
                $pFilename = @tempnam(File::sysGetTempDir(), 'phpxltmp');
183
                if ($pFilename == '') {
184
                    $pFilename = $originalFilename;
185
                }
186
            }
187
188 78
            $saveDebugLog = Calculation::getInstance($this->spreadSheet)->getDebugLog()->getWriteDebugLog();
189 78
            Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog(false);
190 78
            $saveDateReturnType = Functions::getReturnDateType();
191 78
            Functions::setReturnDateType(Functions::RETURNDATE_EXCEL);
192
193
            // Create string lookup table
194 78
            $this->stringTable = [];
195 78
            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {
196 78
                $this->stringTable = $this->getWriterPart('StringTable')->createStringTable($this->spreadSheet->getSheet($i), $this->stringTable);
0 ignored issues
show
Bug introduced by
The method createStringTable() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\StringTable. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

196
                $this->stringTable = $this->getWriterPart('StringTable')->/** @scrutinizer ignore-call */ createStringTable($this->spreadSheet->getSheet($i), $this->stringTable);
Loading history...
197
            }
198
199
            // Create styles dictionaries
200 78
            $this->styleHashTable->addFromSource($this->getWriterPart('Style')->allStyles($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allStyles() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

200
            $this->styleHashTable->addFromSource($this->getWriterPart('Style')->/** @scrutinizer ignore-call */ allStyles($this->spreadSheet));
Loading history...
201 78
            $this->stylesConditionalHashTable->addFromSource($this->getWriterPart('Style')->allConditionalStyles($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allConditionalStyles() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

201
            $this->stylesConditionalHashTable->addFromSource($this->getWriterPart('Style')->/** @scrutinizer ignore-call */ allConditionalStyles($this->spreadSheet));
Loading history...
202 78
            $this->fillHashTable->addFromSource($this->getWriterPart('Style')->allFills($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allFills() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

202
            $this->fillHashTable->addFromSource($this->getWriterPart('Style')->/** @scrutinizer ignore-call */ allFills($this->spreadSheet));
Loading history...
203 78
            $this->fontHashTable->addFromSource($this->getWriterPart('Style')->allFonts($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allFonts() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

203
            $this->fontHashTable->addFromSource($this->getWriterPart('Style')->/** @scrutinizer ignore-call */ allFonts($this->spreadSheet));
Loading history...
204 78
            $this->bordersHashTable->addFromSource($this->getWriterPart('Style')->allBorders($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allBorders() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

204
            $this->bordersHashTable->addFromSource($this->getWriterPart('Style')->/** @scrutinizer ignore-call */ allBorders($this->spreadSheet));
Loading history...
205 78
            $this->numFmtHashTable->addFromSource($this->getWriterPart('Style')->allNumberFormats($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allNumberFormats() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

205
            $this->numFmtHashTable->addFromSource($this->getWriterPart('Style')->/** @scrutinizer ignore-call */ allNumberFormats($this->spreadSheet));
Loading history...
206
207
            // Create drawing dictionary
208 78
            $this->drawingHashTable->addFromSource($this->getWriterPart('Drawing')->allDrawings($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method allDrawings() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Drawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

208
            $this->drawingHashTable->addFromSource($this->getWriterPart('Drawing')->/** @scrutinizer ignore-call */ allDrawings($this->spreadSheet));
Loading history...
209
210 78
            $zip = new ZipArchive();
211
212 78
            if (file_exists($pFilename)) {
213 22
                unlink($pFilename);
214
            }
215
            // Try opening the ZIP file
216 78
            if ($zip->open($pFilename, ZipArchive::OVERWRITE) !== true) {
217 78
                if ($zip->open($pFilename, ZipArchive::CREATE) !== true) {
218
                    throw new WriterException('Could not open ' . $pFilename . ' for writing.');
219
                }
220
            }
221
222
            // Add [Content_Types].xml to ZIP file
223 78
            $zip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->spreadSheet, $this->includeCharts));
0 ignored issues
show
Bug introduced by
The method writeContentTypes() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\ContentTypes. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

223
            $zip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->/** @scrutinizer ignore-call */ writeContentTypes($this->spreadSheet, $this->includeCharts));
Loading history...
224
225
            //if hasMacros, add the vbaProject.bin file, Certificate file(if exists)
226 78
            if ($this->spreadSheet->hasMacros()) {
227 1
                $macrosCode = $this->spreadSheet->getMacrosCode();
228 1
                if ($macrosCode !== null) {
0 ignored issues
show
introduced by
The condition $macrosCode !== null is always true.
Loading history...
229
                    // we have the code ?
230 1
                    $zip->addFromString('xl/vbaProject.bin', $macrosCode); //allways in 'xl', allways named vbaProject.bin
231 1
                    if ($this->spreadSheet->hasMacrosCertificate()) {
232
                        //signed macros ?
233
                        // Yes : add the certificate file and the related rels file
234
                        $zip->addFromString('xl/vbaProjectSignature.bin', $this->spreadSheet->getMacrosCertificate());
235
                        $zip->addFromString('xl/_rels/vbaProject.bin.rels', $this->getWriterPart('RelsVBA')->writeVBARelationships($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeVBARelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\RelsVBA. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

235
                        $zip->addFromString('xl/_rels/vbaProject.bin.rels', $this->getWriterPart('RelsVBA')->/** @scrutinizer ignore-call */ writeVBARelationships($this->spreadSheet));
Loading history...
236
                    }
237
                }
238
            }
239
            //a custom UI in this workbook ? add it ("base" xml and additional objects (pictures) and rels)
240 78
            if ($this->spreadSheet->hasRibbon()) {
241
                $tmpRibbonTarget = $this->spreadSheet->getRibbonXMLData('target');
242
                $zip->addFromString($tmpRibbonTarget, $this->spreadSheet->getRibbonXMLData('data'));
243
                if ($this->spreadSheet->hasRibbonBinObjects()) {
244
                    $tmpRootPath = dirname($tmpRibbonTarget) . '/';
245
                    $ribbonBinObjects = $this->spreadSheet->getRibbonBinObjects('data'); //the files to write
246
                    foreach ($ribbonBinObjects as $aPath => $aContent) {
247
                        $zip->addFromString($tmpRootPath . $aPath, $aContent);
248
                    }
249
                    //the rels for files
250
                    $zip->addFromString($tmpRootPath . '_rels/' . basename($tmpRibbonTarget) . '.rels', $this->getWriterPart('RelsRibbonObjects')->writeRibbonRelationships($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeRibbonRelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\RelsRibbon. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

250
                    $zip->addFromString($tmpRootPath . '_rels/' . basename($tmpRibbonTarget) . '.rels', $this->getWriterPart('RelsRibbonObjects')->/** @scrutinizer ignore-call */ writeRibbonRelationships($this->spreadSheet));
Loading history...
251
                }
252
            }
253
254
            // Add relationships to ZIP file
255 78
            $zip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeRelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

255
            $zip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->/** @scrutinizer ignore-call */ writeRelationships($this->spreadSheet));
Loading history...
256 78
            $zip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeWorkbookRelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

256
            $zip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->/** @scrutinizer ignore-call */ writeWorkbookRelationships($this->spreadSheet));
Loading history...
257
258
            // Add document properties to ZIP file
259 78
            $zip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeDocPropsApp() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\DocProps. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

259
            $zip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->/** @scrutinizer ignore-call */ writeDocPropsApp($this->spreadSheet));
Loading history...
260 78
            $zip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeDocPropsCore() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\DocProps. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

260
            $zip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->/** @scrutinizer ignore-call */ writeDocPropsCore($this->spreadSheet));
Loading history...
261 78
            $customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->spreadSheet);
0 ignored issues
show
Bug introduced by
The method writeDocPropsCustom() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\DocProps. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

261
            $customPropertiesPart = $this->getWriterPart('DocProps')->/** @scrutinizer ignore-call */ writeDocPropsCustom($this->spreadSheet);
Loading history...
262 78
            if ($customPropertiesPart !== null) {
263 2
                $zip->addFromString('docProps/custom.xml', $customPropertiesPart);
264
            }
265
266
            // Add theme to ZIP file
267 78
            $zip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeTheme() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Theme. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

267
            $zip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->/** @scrutinizer ignore-call */ writeTheme($this->spreadSheet));
Loading history...
268
269
            // Add string table to ZIP file
270 78
            $zip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->stringTable));
0 ignored issues
show
Bug introduced by
The method writeStringTable() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\StringTable. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

270
            $zip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->/** @scrutinizer ignore-call */ writeStringTable($this->stringTable));
Loading history...
271
272
            // Add styles to ZIP file
273 78
            $zip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->spreadSheet));
0 ignored issues
show
Bug introduced by
The method writeStyles() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Style. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

273
            $zip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->/** @scrutinizer ignore-call */ writeStyles($this->spreadSheet));
Loading history...
274
275
            // Add workbook to ZIP file
276 78
            $zip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->spreadSheet, $this->preCalculateFormulas));
0 ignored issues
show
Bug introduced by
The method writeWorkbook() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Workbook. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

276
            $zip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->/** @scrutinizer ignore-call */ writeWorkbook($this->spreadSheet, $this->preCalculateFormulas));
Loading history...
277
278 78
            $chartCount = 0;
279
            // Add worksheets
280 78
            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {
281 78
                $zip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->spreadSheet->getSheet($i), $this->stringTable, $this->includeCharts));
0 ignored issues
show
Bug introduced by
The method writeWorksheet() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

281
                $zip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->/** @scrutinizer ignore-call */ writeWorksheet($this->spreadSheet->getSheet($i), $this->stringTable, $this->includeCharts));
Loading history...
282 78
                if ($this->includeCharts) {
283 14
                    $charts = $this->spreadSheet->getSheet($i)->getChartCollection();
284 14
                    if (count($charts) > 0) {
285 13
                        foreach ($charts as $chart) {
286 13
                            $zip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart, $this->preCalculateFormulas));
0 ignored issues
show
Bug introduced by
The method writeChart() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Chart or PhpOffice\PhpSpreadsheet\Writer\Xlsx\Drawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

286
                            $zip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->/** @scrutinizer ignore-call */ writeChart($chart, $this->preCalculateFormulas));
Loading history...
287 13
                            ++$chartCount;
288
                        }
289
                    }
290
                }
291
            }
292
293 78
            $chartRef1 = 0;
294
            // Add worksheet relationships (drawings, ...)
295 78
            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {
296
                // Add relationships
297 78
                $zip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->spreadSheet->getSheet($i), ($i + 1), $this->includeCharts));
0 ignored issues
show
Bug introduced by
The method writeWorksheetRelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

297
                $zip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->/** @scrutinizer ignore-call */ writeWorksheetRelationships($this->spreadSheet->getSheet($i), ($i + 1), $this->includeCharts));
Loading history...
298
299
                // Add unparsedLoadedData
300 78
                $sheetCodeName = $this->spreadSheet->getSheet($i)->getCodeName();
301 78
                $unparsedLoadedData = $this->spreadSheet->getUnparsedLoadedData();
302 78
                if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['ctrlProps'])) {
303 1
                    foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['ctrlProps'] as $ctrlProp) {
304 1
                        $zip->addFromString($ctrlProp['filePath'], $ctrlProp['content']);
305
                    }
306
                }
307 78
                if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['printerSettings'])) {
308 4
                    foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['printerSettings'] as $ctrlProp) {
309 4
                        $zip->addFromString($ctrlProp['filePath'], $ctrlProp['content']);
310
                    }
311
                }
312
313 78
                $drawings = $this->spreadSheet->getSheet($i)->getDrawingCollection();
314 78
                $drawingCount = count($drawings);
315 78
                if ($this->includeCharts) {
316 14
                    $chartCount = $this->spreadSheet->getSheet($i)->getChartCount();
317
                }
318
319
                // Add drawing and image relationship parts
320 78
                if (($drawingCount > 0) || ($chartCount > 0)) {
321
                    // Drawing relationships
322 22
                    $zip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->spreadSheet->getSheet($i), $chartRef1, $this->includeCharts));
0 ignored issues
show
Bug introduced by
The method writeDrawingRelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

322
                    $zip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->/** @scrutinizer ignore-call */ writeDrawingRelationships($this->spreadSheet->getSheet($i), $chartRef1, $this->includeCharts));
Loading history...
323
324
                    // Drawings
325 22
                    $zip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts));
0 ignored issues
show
Bug introduced by
The method writeDrawings() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Drawing or PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

325
                    $zip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->/** @scrutinizer ignore-call */ writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts));
Loading history...
326 57
                } elseif (isset($unparsedLoadedData['sheets'][$sheetCodeName]['drawingAlternateContents'])) {
327
                    // Drawings
328 1
                    $zip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts));
329
                }
330
331
                // Add comment relationship parts
332 78
                if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) {
333
                    // VML Comments
334 10
                    $zip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->spreadSheet->getSheet($i)));
0 ignored issues
show
Bug introduced by
The method writeVMLComments() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Comments. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

334
                    $zip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->/** @scrutinizer ignore-call */ writeVMLComments($this->spreadSheet->getSheet($i)));
Loading history...
335
336
                    // Comments
337 10
                    $zip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->spreadSheet->getSheet($i)));
0 ignored issues
show
Bug introduced by
The method writeComments() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Comments. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

337
                    $zip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->/** @scrutinizer ignore-call */ writeComments($this->spreadSheet->getSheet($i)));
Loading history...
338
                }
339
340
                // Add unparsed relationship parts
341 78
                if (isset($unparsedLoadedData['sheets'][$this->spreadSheet->getSheet($i)->getCodeName()]['vmlDrawings'])) {
342 1
                    foreach ($unparsedLoadedData['sheets'][$this->spreadSheet->getSheet($i)->getCodeName()]['vmlDrawings'] as $vmlDrawing) {
343 1
                        $zip->addFromString($vmlDrawing['filePath'], $vmlDrawing['content']);
344
                    }
345
                }
346
347
                // Add header/footer relationship parts
348 78
                if (count($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) {
349
                    // VML Drawings
350 1
                    $zip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->spreadSheet->getSheet($i)));
0 ignored issues
show
Bug introduced by
The method writeVMLHeaderFooterImages() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Drawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

350
                    $zip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->/** @scrutinizer ignore-call */ writeVMLHeaderFooterImages($this->spreadSheet->getSheet($i)));
Loading history...
351
352
                    // VML Drawing relationships
353 1
                    $zip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->spreadSheet->getSheet($i)));
0 ignored issues
show
Bug introduced by
The method writeHeaderFooterDrawingRelationships() does not exist on PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart such as PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

353
                    $zip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->/** @scrutinizer ignore-call */ writeHeaderFooterDrawingRelationships($this->spreadSheet->getSheet($i)));
Loading history...
354
355
                    // Media
356 1
                    foreach ($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) {
357 1
                        $zip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath()));
358
                    }
359
                }
360
            }
361
362
            // Add media
363 78
            for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
364 10
                if ($this->getDrawingHashTable()->getByIndex($i) instanceof WorksheetDrawing) {
365 6
                    $imageContents = null;
366 6
                    $imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath();
1 ignored issue
show
Bug introduced by
The method getPath() does not exist on PhpOffice\PhpSpreadsheet\IComparable. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\IComparable such as PhpOffice\PhpSpreadsheet\Worksheet\Drawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

366
                    $imagePath = $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getPath();
Loading history...
367 6
                    if (strpos($imagePath, 'zip://') !== false) {
368 2
                        $imagePath = substr($imagePath, 6);
369 2
                        $imagePathSplitted = explode('#', $imagePath);
370
371 2
                        $imageZip = new ZipArchive();
372 2
                        $imageZip->open($imagePathSplitted[0]);
373 2
                        $imageContents = $imageZip->getFromName($imagePathSplitted[1]);
374 2
                        $imageZip->close();
375 2
                        unset($imageZip);
376
                    } else {
377 5
                        $imageContents = file_get_contents($imagePath);
378
                    }
379
380 6
                    $zip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents);
0 ignored issues
show
Bug introduced by
The method getIndexedFilename() does not exist on PhpOffice\PhpSpreadsheet\IComparable. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\IComparable such as PhpOffice\PhpSpreadsheet\Worksheet\Drawing or PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

380
                    $zip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getIndexedFilename()), $imageContents);
Loading history...
381 4
                } elseif ($this->getDrawingHashTable()->getByIndex($i) instanceof MemoryDrawing) {
382 4
                    ob_start();
383 4
                    call_user_func(
384 4
                        $this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(),
1 ignored issue
show
Bug introduced by
The method getRenderingFunction() does not exist on PhpOffice\PhpSpreadsheet\IComparable. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\IComparable such as PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

384
                        $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getRenderingFunction(),
Loading history...
385 4
                        $this->getDrawingHashTable()->getByIndex($i)->getImageResource()
1 ignored issue
show
Bug introduced by
The method getImageResource() does not exist on PhpOffice\PhpSpreadsheet\IComparable. It seems like you code against a sub-type of PhpOffice\PhpSpreadsheet\IComparable such as PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

385
                        $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getImageResource()
Loading history...
386
                    );
387 4
                    $imageContents = ob_get_contents();
388 4
                    ob_end_clean();
389
390 4
                    $zip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents);
391
                }
392
            }
393
394 78
            Functions::setReturnDateType($saveDateReturnType);
395 78
            Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog);
396
397
            // Close file
398 78
            if ($zip->close() === false) {
399
                throw new WriterException("Could not close zip file $pFilename.");
400
            }
401
402
            // If a temporary file was used, copy it to the correct file stream
403 78
            if ($originalFilename != $pFilename) {
404
                if (copy($pFilename, $originalFilename) === false) {
405
                    throw new WriterException("Could not copy temporary zip file $pFilename to $originalFilename.");
406
                }
407 78
                @unlink($pFilename);
1 ignored issue
show
Security Best Practice introduced by
It seems like you do not handle an error condition for unlink(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

407
                /** @scrutinizer ignore-unhandled */ @unlink($pFilename);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
408
            }
409
        } else {
410
            throw new WriterException('PhpSpreadsheet object unassigned.');
411
        }
412 78
    }
413
414
    /**
415
     * Get Spreadsheet object.
416
     *
417
     * @throws WriterException
418
     *
419
     * @return Spreadsheet
420
     */
421 78
    public function getSpreadsheet()
422
    {
423 78
        if ($this->spreadSheet !== null) {
424 78
            return $this->spreadSheet;
425
        }
426
427
        throw new WriterException('No Spreadsheet object assigned.');
428
    }
429
430
    /**
431
     * Set Spreadsheet object.
432
     *
433
     * @param Spreadsheet $spreadsheet PhpSpreadsheet object
434
     *
435
     * @return Xlsx
436
     */
437 79
    public function setSpreadsheet(Spreadsheet $spreadsheet)
438
    {
439 79
        $this->spreadSheet = $spreadsheet;
440
441 79
        return $this;
442
    }
443
444
    /**
445
     * Get string table.
446
     *
447
     * @return string[]
448
     */
449
    public function getStringTable()
450
    {
451
        return $this->stringTable;
452
    }
453
454
    /**
455
     * Get Style HashTable.
456
     *
457
     * @return HashTable
458
     */
459
    public function getStyleHashTable()
460
    {
461
        return $this->styleHashTable;
462
    }
463
464
    /**
465
     * Get Conditional HashTable.
466
     *
467
     * @return HashTable
468
     */
469 78
    public function getStylesConditionalHashTable()
470
    {
471 78
        return $this->stylesConditionalHashTable;
472
    }
473
474
    /**
475
     * Get Fill HashTable.
476
     *
477
     * @return HashTable
478
     */
479 78
    public function getFillHashTable()
480
    {
481 78
        return $this->fillHashTable;
482
    }
483
484
    /**
485
     * Get \PhpOffice\PhpSpreadsheet\Style\Font HashTable.
486
     *
487
     * @return HashTable
488
     */
489 78
    public function getFontHashTable()
490
    {
491 78
        return $this->fontHashTable;
492
    }
493
494
    /**
495
     * Get Borders HashTable.
496
     *
497
     * @return HashTable
498
     */
499 78
    public function getBordersHashTable()
500
    {
501 78
        return $this->bordersHashTable;
502
    }
503
504
    /**
505
     * Get NumberFormat HashTable.
506
     *
507
     * @return HashTable
508
     */
509 78
    public function getNumFmtHashTable()
510
    {
511 78
        return $this->numFmtHashTable;
512
    }
513
514
    /**
515
     * Get \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\BaseDrawing HashTable.
516
     *
517
     * @return HashTable
518
     */
519 78
    public function getDrawingHashTable()
520
    {
521 78
        return $this->drawingHashTable;
522
    }
523
524
    /**
525
     * Get Office2003 compatibility.
526
     *
527
     * @return bool
528
     */
529 78
    public function getOffice2003Compatibility()
530
    {
531 78
        return $this->office2003compatibility;
532
    }
533
534
    /**
535
     * Set Office2003 compatibility.
536
     *
537
     * @param bool $pValue Office2003 compatibility?
538
     *
539
     * @return Xlsx
540
     */
541
    public function setOffice2003Compatibility($pValue)
542
    {
543
        $this->office2003compatibility = $pValue;
544
545
        return $this;
546
    }
547
}
548