Failed Conditions
Push — develop ( 064076...83c759 )
by Adrien
63:09
created

Xlsx::getWriterPart()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 3.1406

Importance

Changes 0
Metric Value
cc 3
eloc 3
nc 2
nop 1
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
ccs 3
cts 4
cp 0.75
crap 3.1406
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 74
    public function __construct(Spreadsheet $spreadsheet)
113
    {
114
        // Assign PhpSpreadsheet
115 74
        $this->setSpreadsheet($spreadsheet);
116
117
        $writerPartsArray = [
118 74
            '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 74
        foreach ($writerPartsArray as $writer => $class) {
136 74
            $this->writerParts[$writer] = new $class($this);
137
        }
138
139 74
        $hashTablesArray = ['stylesConditionalHashTable', 'fillHashTable', 'fontHashTable',
140
                                    'bordersHashTable', 'numFmtHashTable', 'drawingHashTable',
141
                                    'styleHashTable',
142
                                ];
143
144
        // Set HashTable variables
145 74
        foreach ($hashTablesArray as $tableName) {
146 74
            $this->$tableName = new HashTable();
147
        }
148 74
    }
149
150
    /**
151
     * Get writer part.
152
     *
153
     * @param string $pPartName Writer part name
154
     *
155
     * @return \PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart
156
     */
157 73
    public function getWriterPart($pPartName)
158
    {
159 73
        if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) {
160 73
            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 73
    public function save($pFilename)
174
    {
175 73
        if ($this->spreadSheet !== null) {
176
            // garbage collect
177 73
            $this->spreadSheet->garbageCollect();
178
179
            // If $pFilename is php://output or php://stdout, make it a temporary file...
180 73
            $originalFilename = $pFilename;
181 73
            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 73
            $saveDebugLog = Calculation::getInstance($this->spreadSheet)->getDebugLog()->getWriteDebugLog();
189 73
            Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog(false);
190 73
            $saveDateReturnType = Functions::getReturnDateType();
191 73
            Functions::setReturnDateType(Functions::RETURNDATE_EXCEL);
192
193
            // Create string lookup table
194 73
            $this->stringTable = [];
195 73
            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {
196 73
                $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 73
            $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 73
            $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 73
            $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 73
            $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 73
            $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 73
            $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 73
            $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 73
            $zip = new ZipArchive();
211
212 73
            if (file_exists($pFilename)) {
213 17
                unlink($pFilename);
214
            }
215
            // Try opening the ZIP file
216 73
            if ($zip->open($pFilename, ZipArchive::OVERWRITE) !== true) {
217 73
                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 73
            $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 73
            if ($this->spreadSheet->hasMacros()) {
227
                $macrosCode = $this->spreadSheet->getMacrosCode();
228
                if ($macrosCode !== null) {
0 ignored issues
show
introduced by
The condition $macrosCode !== null is always true.
Loading history...
229
                    // we have the code ?
230
                    $zip->addFromString('xl/vbaProject.bin', $macrosCode); //allways in 'xl', allways named vbaProject.bin
231
                    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 73
            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 73
            $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 73
            $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 73
            $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 73
            $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 73
            $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 73
            if ($customPropertiesPart !== null) {
263 2
                $zip->addFromString('docProps/custom.xml', $customPropertiesPart);
264
            }
265
266
            // Add theme to ZIP file
267 73
            $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 73
            $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 73
            $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 73
            $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 73
            $chartCount = 0;
279
            // Add worksheets
280 73
            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {
281 73
                $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 73
                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 73
            $chartRef1 = 0;
294
            // Add worksheet relationships (drawings, ...)
295 73
            for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) {
296
                // Add relationships
297 73
                $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 73
                // Add unparsedLoadedData
300 73
                $sheetCodeName = $this->spreadSheet->getSheet($i)->getCodeName();
301 73
                if (isset($this->spreadSheet->getUnparsedLoadedData()['sheets'][$sheetCodeName]['ctrlProps'])) {
302 14
                    foreach ($this->spreadSheet->getUnparsedLoadedData()['sheets'][$sheetCodeName]['ctrlProps'] as $ctrlProp) {
303
                        $zip->addFromString($ctrlProp['filePath'], $ctrlProp['content']);
304
                    }
305
                }
306 73
                if (isset($this->spreadSheet->getUnparsedLoadedData()['sheets'][$sheetCodeName]['printerSettings'])) {
307
                    foreach ($this->spreadSheet->getUnparsedLoadedData()['sheets'][$sheetCodeName]['printerSettings'] as $ctrlProp) {
308 22
                        $zip->addFromString($ctrlProp['filePath'], $ctrlProp['content']);
309
                    }
310
                }
311 22
312
                $drawings = $this->spreadSheet->getSheet($i)->getDrawingCollection();
313
                $drawingCount = count($drawings);
314
                if ($this->includeCharts) {
315 73
                    $chartCount = $this->spreadSheet->getSheet($i)->getChartCount();
316
                }
317 9
318
                // Add drawing and image relationship parts
319
                if (($drawingCount > 0) || ($chartCount > 0)) {
320 9
                    // Drawing relationships
321
                    $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

321
                    $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...
322
323
                    // Drawings
324 73
                    $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

324
                    $zip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->/** @scrutinizer ignore-call */ writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts));
Loading history...
325
                } elseif (isset($this->spreadSheet->getUnparsedLoadedData()['sheets'][$sheetCodeName]['drawingAlternateContents'])) {
326 1
                    // Drawings
327
                    $zip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts));
328
                }
329 1
330
                // Add comment relationship parts
331
                if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) {
332 1
                    // VML Comments
333 1
                    $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

333
                    $zip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->/** @scrutinizer ignore-call */ writeVMLComments($this->spreadSheet->getSheet($i)));
Loading history...
334
335
                    // Comments
336
                    $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

336
                    $zip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->/** @scrutinizer ignore-call */ writeComments($this->spreadSheet->getSheet($i)));
Loading history...
337
                }
338
339 73
                // Add unparsed relationship parts
340 10
                if (isset($this->spreadSheet->getUnparsedLoadedData()['sheets'][$this->spreadSheet->getSheet($i)->getCodeName()]['vmlDrawings'])) {
341 6
                    foreach ($this->spreadSheet->getUnparsedLoadedData()['sheets'][$this->spreadSheet->getSheet($i)->getCodeName()]['vmlDrawings'] as $vmlDrawing) {
342 6
                        $zip->addFromString($vmlDrawing['filePath'], $vmlDrawing['content']);
343 6
                    }
344 2
                }
345 2
346
                // Add header/footer relationship parts
347 2
                if (count($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) {
348 2
                    // VML Drawings
349 2
                    $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

349
                    $zip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->/** @scrutinizer ignore-call */ writeVMLHeaderFooterImages($this->spreadSheet->getSheet($i)));
Loading history...
350 2
351 2
                    // VML Drawing relationships
352
                    $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

352
                    $zip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->/** @scrutinizer ignore-call */ writeHeaderFooterDrawingRelationships($this->spreadSheet->getSheet($i)));
Loading history...
353 5
354
                    // Media
355
                    foreach ($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) {
356 6
                        $zip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath()));
357 4
                    }
358 4
                }
359 4
            }
360 4
361 4
            // Add media
362
            for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
363 4
                if ($this->getDrawingHashTable()->getByIndex($i) instanceof WorksheetDrawing) {
364 4
                    $imageContents = null;
365
                    $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

365
                    $imagePath = $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getPath();
Loading history...
366 4
                    if (strpos($imagePath, 'zip://') !== false) {
367
                        $imagePath = substr($imagePath, 6);
368
                        $imagePathSplitted = explode('#', $imagePath);
369
370 73
                        $imageZip = new ZipArchive();
371 73
                        $imageZip->open($imagePathSplitted[0]);
372
                        $imageContents = $imageZip->getFromName($imagePathSplitted[1]);
373
                        $imageZip->close();
374 73
                        unset($imageZip);
375
                    } else {
376
                        $imageContents = file_get_contents($imagePath);
377
                    }
378
379 73
                    $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

379
                    $zip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getIndexedFilename()), $imageContents);
Loading history...
380
                } elseif ($this->getDrawingHashTable()->getByIndex($i) instanceof MemoryDrawing) {
381
                    ob_start();
382
                    call_user_func(
383 73
                        $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

383
                        $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getRenderingFunction(),
Loading history...
384
                        $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

384
                        $this->getDrawingHashTable()->getByIndex($i)->/** @scrutinizer ignore-call */ getImageResource()
Loading history...
385
                    );
386
                    $imageContents = ob_get_contents();
387
                    ob_end_clean();
388 73
389
                    $zip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents);
390
                }
391
            }
392
393
            Functions::setReturnDateType($saveDateReturnType);
394
            Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog);
395
396
            // Close file
397 73
            if ($zip->close() === false) {
398
                throw new WriterException("Could not close zip file $pFilename.");
399 73
            }
400 73
401
            // If a temporary file was used, copy it to the correct file stream
402
            if ($originalFilename != $pFilename) {
403
                if (copy($pFilename, $originalFilename) === false) {
404
                    throw new WriterException("Could not copy temporary zip file $pFilename to $originalFilename.");
405
                }
406
                @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

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