Failed Conditions
Push — master ( 42761f...d02352 )
by Adrien
16:26 queued 08:32
created

Chart::writeAlternateContent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 15
nc 1
nop 1
dl 0
loc 21
ccs 16
cts 16
cp 1
crap 1
rs 9.7666
c 0
b 0
f 0
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
4
5
use PhpOffice\PhpSpreadsheet\Chart\Axis;
6
use PhpOffice\PhpSpreadsheet\Chart\DataSeries;
7
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues;
8
use PhpOffice\PhpSpreadsheet\Chart\GridLines;
9
use PhpOffice\PhpSpreadsheet\Chart\Layout;
10
use PhpOffice\PhpSpreadsheet\Chart\Legend;
11
use PhpOffice\PhpSpreadsheet\Chart\PlotArea;
12
use PhpOffice\PhpSpreadsheet\Chart\Title;
13
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
14
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
15
use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException;
16
17
class Chart extends WriterPart
18
{
19
    protected $calculateCellValues;
20
21
    /**
22
     * @var int
23
     */
24
    private $seriesIndex;
25
26
    /**
27
     * Write charts to XML format.
28
     *
29
     * @param mixed $calculateCellValues
30
     *
31
     * @return string XML Output
32
     */
33 15
    public function writeChart(\PhpOffice\PhpSpreadsheet\Chart\Chart $pChart, $calculateCellValues = true)
34
    {
35 15
        $this->calculateCellValues = $calculateCellValues;
36
37
        // Create XML writer
38 15
        $objWriter = null;
39 15
        if ($this->getParentWriter()->getUseDiskCaching()) {
40
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
41
        } else {
42 15
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
43
        }
44
        //    Ensure that data series values are up-to-date before we save
45 15
        if ($this->calculateCellValues) {
46 15
            $pChart->refresh();
47
        }
48
49
        // XML header
50 15
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
51
52
        // c:chartSpace
53 15
        $objWriter->startElement('c:chartSpace');
54 15
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
55 15
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
56 15
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
57
58 15
        $objWriter->startElement('c:date1904');
59 15
        $objWriter->writeAttribute('val', 0);
60 15
        $objWriter->endElement();
61 15
        $objWriter->startElement('c:lang');
62 15
        $objWriter->writeAttribute('val', 'en-GB');
63 15
        $objWriter->endElement();
64 15
        $objWriter->startElement('c:roundedCorners');
65 15
        $objWriter->writeAttribute('val', 0);
66 15
        $objWriter->endElement();
67
68 15
        $this->writeAlternateContent($objWriter);
69
70 15
        $objWriter->startElement('c:chart');
71
72 15
        $this->writeTitle($objWriter, $pChart->getTitle());
73
74 15
        $objWriter->startElement('c:autoTitleDeleted');
75 15
        $objWriter->writeAttribute('val', 0);
76 15
        $objWriter->endElement();
77
78 15
        $this->writePlotArea($objWriter, $pChart->getWorksheet(), $pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $pChart->getChartAxisX(), $pChart->getChartAxisY(), $pChart->getMajorGridlines(), $pChart->getMinorGridlines());
79
80 15
        $this->writeLegend($objWriter, $pChart->getLegend());
81
82 15
        $objWriter->startElement('c:plotVisOnly');
83 15
        $objWriter->writeAttribute('val', (int) $pChart->getPlotVisibleOnly());
84 15
        $objWriter->endElement();
85
86 15
        $objWriter->startElement('c:dispBlanksAs');
87 15
        $objWriter->writeAttribute('val', $pChart->getDisplayBlanksAs());
88 15
        $objWriter->endElement();
89
90 15
        $objWriter->startElement('c:showDLblsOverMax');
91 15
        $objWriter->writeAttribute('val', 0);
92 15
        $objWriter->endElement();
93
94 15
        $objWriter->endElement();
95
96 15
        $this->writePrintSettings($objWriter);
97
98 15
        $objWriter->endElement();
99
100
        // Return
101 15
        return $objWriter->getData();
102
    }
103
104
    /**
105
     * Write Chart Title.
106
     *
107
     * @param XMLWriter $objWriter XML Writer
108
     * @param Title $title
109
     */
110 15
    private function writeTitle(XMLWriter $objWriter, ?Title $title = null): void
111
    {
112 15
        if ($title === null) {
113 1
            return;
114
        }
115
116 15
        $objWriter->startElement('c:title');
117 15
        $objWriter->startElement('c:tx');
118 15
        $objWriter->startElement('c:rich');
119
120 15
        $objWriter->startElement('a:bodyPr');
121 15
        $objWriter->endElement();
122
123 15
        $objWriter->startElement('a:lstStyle');
124 15
        $objWriter->endElement();
125
126 15
        $objWriter->startElement('a:p');
127
128 15
        $caption = $title->getCaption();
129 15
        if ((is_array($caption)) && (count($caption) > 0)) {
0 ignored issues
show
introduced by
The condition is_array($caption) is always false.
Loading history...
130 2
            $caption = $caption[0];
131
        }
132 15
        $this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
133
134 15
        $objWriter->endElement();
135 15
        $objWriter->endElement();
136 15
        $objWriter->endElement();
137
138 15
        $this->writeLayout($objWriter, $title->getLayout());
139
140 15
        $objWriter->startElement('c:overlay');
141 15
        $objWriter->writeAttribute('val', 0);
142 15
        $objWriter->endElement();
143
144 15
        $objWriter->endElement();
145 15
    }
146
147
    /**
148
     * Write Chart Legend.
149
     *
150
     * @param XMLWriter $objWriter XML Writer
151
     * @param Legend $legend
152
     */
153 15
    private function writeLegend(XMLWriter $objWriter, ?Legend $legend = null): void
154
    {
155 15
        if ($legend === null) {
156 3
            return;
157
        }
158
159 15
        $objWriter->startElement('c:legend');
160
161 15
        $objWriter->startElement('c:legendPos');
162 15
        $objWriter->writeAttribute('val', $legend->getPosition());
163 15
        $objWriter->endElement();
164
165 15
        $this->writeLayout($objWriter, $legend->getLayout());
166
167 15
        $objWriter->startElement('c:overlay');
168 15
        $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0');
169 15
        $objWriter->endElement();
170
171 15
        $objWriter->startElement('c:txPr');
172 15
        $objWriter->startElement('a:bodyPr');
173 15
        $objWriter->endElement();
174
175 15
        $objWriter->startElement('a:lstStyle');
176 15
        $objWriter->endElement();
177
178 15
        $objWriter->startElement('a:p');
179 15
        $objWriter->startElement('a:pPr');
180 15
        $objWriter->writeAttribute('rtl', 0);
181
182 15
        $objWriter->startElement('a:defRPr');
183 15
        $objWriter->endElement();
184 15
        $objWriter->endElement();
185
186 15
        $objWriter->startElement('a:endParaRPr');
187 15
        $objWriter->writeAttribute('lang', 'en-US');
188 15
        $objWriter->endElement();
189
190 15
        $objWriter->endElement();
191 15
        $objWriter->endElement();
192
193 15
        $objWriter->endElement();
194 15
    }
195
196
    /**
197
     * Write Chart Plot Area.
198
     *
199
     * @param XMLWriter $objWriter XML Writer
200
     * @param Title $xAxisLabel
201
     * @param Title $yAxisLabel
202
     * @param Axis $xAxis
203
     * @param Axis $yAxis
204
     */
205 15
    private function writePlotArea(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pSheet, PlotArea $plotArea, ?Title $xAxisLabel = null, ?Title $yAxisLabel = null, ?Axis $xAxis = null, ?Axis $yAxis = null, ?GridLines $majorGridlines = null, ?GridLines $minorGridlines = null): void
0 ignored issues
show
Unused Code introduced by
The parameter $pSheet is not used and could be removed. ( Ignorable by Annotation )

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

205
    private function writePlotArea(XMLWriter $objWriter, /** @scrutinizer ignore-unused */ \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pSheet, PlotArea $plotArea, ?Title $xAxisLabel = null, ?Title $yAxisLabel = null, ?Axis $xAxis = null, ?Axis $yAxis = null, ?GridLines $majorGridlines = null, ?GridLines $minorGridlines = null): void

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
206
    {
207 15
        if ($plotArea === null) {
208
            return;
209
        }
210
211 15
        $id1 = $id2 = 0;
212 15
        $this->seriesIndex = 0;
213 15
        $objWriter->startElement('c:plotArea');
214
215 15
        $layout = $plotArea->getLayout();
216
217 15
        $this->writeLayout($objWriter, $layout);
218
219 15
        $chartTypes = self::getChartType($plotArea);
220 15
        $catIsMultiLevelSeries = $valIsMultiLevelSeries = false;
221 15
        $plotGroupingType = '';
222 15
        $chartType = null;
223 15
        foreach ($chartTypes as $chartType) {
224 15
            $objWriter->startElement('c:' . $chartType);
225
226 15
            $groupCount = $plotArea->getPlotGroupCount();
227 15
            $plotGroup = null;
228 15
            for ($i = 0; $i < $groupCount; ++$i) {
229 15
                $plotGroup = $plotArea->getPlotGroupByIndex($i);
230 15
                $groupType = $plotGroup->getPlotType();
231 15
                if ($groupType == $chartType) {
232 15
                    $plotStyle = $plotGroup->getPlotStyle();
233 15
                    if ($groupType === DataSeries::TYPE_RADARCHART) {
234 2
                        $objWriter->startElement('c:radarStyle');
235 2
                        $objWriter->writeAttribute('val', $plotStyle);
236 2
                        $objWriter->endElement();
237 14
                    } elseif ($groupType === DataSeries::TYPE_SCATTERCHART) {
238 2
                        $objWriter->startElement('c:scatterStyle');
239 2
                        $objWriter->writeAttribute('val', $plotStyle);
240 2
                        $objWriter->endElement();
241
                    }
242
243 15
                    $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType);
244
                }
245
            }
246
247 15
            $this->writeDataLabels($objWriter, $layout);
248
249 15
            if ($chartType === DataSeries::TYPE_LINECHART && $plotGroup) {
250
                //    Line only, Line3D can't be smoothed
251 3
                $objWriter->startElement('c:smooth');
252 3
                $objWriter->writeAttribute('val', (int) $plotGroup->getSmoothLine());
253 3
                $objWriter->endElement();
254 14
            } elseif (($chartType === DataSeries::TYPE_BARCHART) || ($chartType === DataSeries::TYPE_BARCHART_3D)) {
255 8
                $objWriter->startElement('c:gapWidth');
256 8
                $objWriter->writeAttribute('val', 150);
257 8
                $objWriter->endElement();
258
259 8
                if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') {
260 2
                    $objWriter->startElement('c:overlap');
261 2
                    $objWriter->writeAttribute('val', 100);
262 8
                    $objWriter->endElement();
263
                }
264 9
            } elseif ($chartType === DataSeries::TYPE_BUBBLECHART) {
265 1
                $objWriter->startElement('c:bubbleScale');
266 1
                $objWriter->writeAttribute('val', 25);
267 1
                $objWriter->endElement();
268
269 1
                $objWriter->startElement('c:showNegBubbles');
270 1
                $objWriter->writeAttribute('val', 0);
271 1
                $objWriter->endElement();
272 9
            } elseif ($chartType === DataSeries::TYPE_STOCKCHART) {
273 2
                $objWriter->startElement('c:hiLowLines');
274 2
                $objWriter->endElement();
275
276 2
                $objWriter->startElement('c:upDownBars');
277
278 2
                $objWriter->startElement('c:gapWidth');
279 2
                $objWriter->writeAttribute('val', 300);
280 2
                $objWriter->endElement();
281
282 2
                $objWriter->startElement('c:upBars');
283 2
                $objWriter->endElement();
284
285 2
                $objWriter->startElement('c:downBars');
286 2
                $objWriter->endElement();
287
288 2
                $objWriter->endElement();
289
            }
290
291
            //    Generate 2 unique numbers to use for axId values
292 15
            $id1 = '75091328';
293 15
            $id2 = '75089408';
294
295 15
            if (($chartType !== DataSeries::TYPE_PIECHART) && ($chartType !== DataSeries::TYPE_PIECHART_3D) && ($chartType !== DataSeries::TYPE_DONUTCHART)) {
296 13
                $objWriter->startElement('c:axId');
297 13
                $objWriter->writeAttribute('val', $id1);
298 13
                $objWriter->endElement();
299 13
                $objWriter->startElement('c:axId');
300 13
                $objWriter->writeAttribute('val', $id2);
301 13
                $objWriter->endElement();
302
            } else {
303 3
                $objWriter->startElement('c:firstSliceAng');
304 3
                $objWriter->writeAttribute('val', 0);
305 3
                $objWriter->endElement();
306
307 3
                if ($chartType === DataSeries::TYPE_DONUTCHART) {
308 3
                    $objWriter->startElement('c:holeSize');
309 3
                    $objWriter->writeAttribute('val', 50);
310 3
                    $objWriter->endElement();
311
                }
312
            }
313
314 15
            $objWriter->endElement();
315
        }
316
317 15
        if (($chartType !== DataSeries::TYPE_PIECHART) && ($chartType !== DataSeries::TYPE_PIECHART_3D) && ($chartType !== DataSeries::TYPE_DONUTCHART)) {
318 13
            if ($chartType === DataSeries::TYPE_BUBBLECHART) {
319 1
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $majorGridlines, $minorGridlines);
3 ignored issues
show
Bug introduced by
It seems like $xAxis can also be of type null; however, parameter $xAxis of PhpOffice\PhpSpreadsheet...Chart::writeValueAxis() does only seem to accept PhpOffice\PhpSpreadsheet\Chart\Axis, maybe add an additional type check? ( Ignorable by Annotation )

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

319
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, /** @scrutinizer ignore-type */ $xAxis, $majorGridlines, $minorGridlines);
Loading history...
Bug introduced by
It seems like $majorGridlines can also be of type null; however, parameter $majorGridlines of PhpOffice\PhpSpreadsheet...Chart::writeValueAxis() does only seem to accept PhpOffice\PhpSpreadsheet\Chart\GridLines, maybe add an additional type check? ( Ignorable by Annotation )

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

319
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, /** @scrutinizer ignore-type */ $majorGridlines, $minorGridlines);
Loading history...
Bug introduced by
It seems like $minorGridlines can also be of type null; however, parameter $minorGridlines of PhpOffice\PhpSpreadsheet...Chart::writeValueAxis() does only seem to accept PhpOffice\PhpSpreadsheet\Chart\GridLines, maybe add an additional type check? ( Ignorable by Annotation )

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

319
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $majorGridlines, /** @scrutinizer ignore-type */ $minorGridlines);
Loading history...
320
            } else {
321 13
                $this->writeCategoryAxis($objWriter, $xAxisLabel, $id1, $id2, $catIsMultiLevelSeries, $yAxis);
1 ignored issue
show
Bug introduced by
It seems like $yAxis can also be of type null; however, parameter $yAxis of PhpOffice\PhpSpreadsheet...rt::writeCategoryAxis() does only seem to accept PhpOffice\PhpSpreadsheet\Chart\Axis, maybe add an additional type check? ( Ignorable by Annotation )

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

321
                $this->writeCategoryAxis($objWriter, $xAxisLabel, $id1, $id2, $catIsMultiLevelSeries, /** @scrutinizer ignore-type */ $yAxis);
Loading history...
322
            }
323
324 13
            $this->writeValueAxis($objWriter, $yAxisLabel, $chartType, $id1, $id2, $valIsMultiLevelSeries, $xAxis, $majorGridlines, $minorGridlines);
325
        }
326
327 15
        $objWriter->endElement();
328 15
    }
329
330
    /**
331
     * Write Data Labels.
332
     *
333
     * @param XMLWriter $objWriter XML Writer
334
     * @param \PhpOffice\PhpSpreadsheet\Chart\Layout $chartLayout Chart layout
335
     */
336 15
    private function writeDataLabels(XMLWriter $objWriter, ?Layout $chartLayout = null): void
337
    {
338 15
        $objWriter->startElement('c:dLbls');
339
340 15
        $objWriter->startElement('c:showLegendKey');
341 15
        $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey();
342 15
        $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1));
343 15
        $objWriter->endElement();
344
345 15
        $objWriter->startElement('c:showVal');
346 15
        $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal();
347 15
        $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1));
348 15
        $objWriter->endElement();
349
350 15
        $objWriter->startElement('c:showCatName');
351 15
        $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName();
352 15
        $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1));
353 15
        $objWriter->endElement();
354
355 15
        $objWriter->startElement('c:showSerName');
356 15
        $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName();
357 15
        $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1));
358 15
        $objWriter->endElement();
359
360 15
        $objWriter->startElement('c:showPercent');
361 15
        $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent();
362 15
        $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1));
363 15
        $objWriter->endElement();
364
365 15
        $objWriter->startElement('c:showBubbleSize');
366 15
        $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize();
367 15
        $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1));
368 15
        $objWriter->endElement();
369
370 15
        $objWriter->startElement('c:showLeaderLines');
371 15
        $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines();
372 15
        $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1));
373 15
        $objWriter->endElement();
374
375 15
        $objWriter->endElement();
376 15
    }
377
378
    /**
379
     * Write Category Axis.
380
     *
381
     * @param XMLWriter $objWriter XML Writer
382
     * @param Title $xAxisLabel
383
     * @param string $id1
384
     * @param string $id2
385
     * @param bool $isMultiLevelSeries
386
     */
387 13
    private function writeCategoryAxis($objWriter, $xAxisLabel, $id1, $id2, $isMultiLevelSeries, Axis $yAxis): void
388
    {
389 13
        $objWriter->startElement('c:catAx');
390
391 13
        if ($id1 > 0) {
392 13
            $objWriter->startElement('c:axId');
393 13
            $objWriter->writeAttribute('val', $id1);
394 13
            $objWriter->endElement();
395
        }
396
397 13
        $objWriter->startElement('c:scaling');
398 13
        $objWriter->startElement('c:orientation');
399 13
        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation'));
400 13
        $objWriter->endElement();
401 13
        $objWriter->endElement();
402
403 13
        $objWriter->startElement('c:delete');
404 13
        $objWriter->writeAttribute('val', 0);
405 13
        $objWriter->endElement();
406
407 13
        $objWriter->startElement('c:axPos');
408 13
        $objWriter->writeAttribute('val', 'b');
409 13
        $objWriter->endElement();
410
411 13
        if ($xAxisLabel !== null) {
412 3
            $objWriter->startElement('c:title');
413 3
            $objWriter->startElement('c:tx');
414 3
            $objWriter->startElement('c:rich');
415
416 3
            $objWriter->startElement('a:bodyPr');
417 3
            $objWriter->endElement();
418
419 3
            $objWriter->startElement('a:lstStyle');
420 3
            $objWriter->endElement();
421
422 3
            $objWriter->startElement('a:p');
423 3
            $objWriter->startElement('a:r');
424
425 3
            $caption = $xAxisLabel->getCaption();
426 3
            if (is_array($caption)) {
0 ignored issues
show
introduced by
The condition is_array($caption) is always false.
Loading history...
427 1
                $caption = $caption[0];
428
            }
429 3
            $objWriter->startElement('a:t');
430 3
            $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($caption));
431 3
            $objWriter->endElement();
432
433 3
            $objWriter->endElement();
434 3
            $objWriter->endElement();
435 3
            $objWriter->endElement();
436 3
            $objWriter->endElement();
437
438 3
            $layout = $xAxisLabel->getLayout();
439 3
            $this->writeLayout($objWriter, $layout);
440
441 3
            $objWriter->startElement('c:overlay');
442 3
            $objWriter->writeAttribute('val', 0);
443 3
            $objWriter->endElement();
444
445 3
            $objWriter->endElement();
446
        }
447
448 13
        $objWriter->startElement('c:numFmt');
449 13
        $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat());
450 13
        $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked());
451 13
        $objWriter->endElement();
452
453 13
        $objWriter->startElement('c:majorTickMark');
454 13
        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark'));
455 13
        $objWriter->endElement();
456
457 13
        $objWriter->startElement('c:minorTickMark');
458 13
        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark'));
459 13
        $objWriter->endElement();
460
461 13
        $objWriter->startElement('c:tickLblPos');
462 13
        $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels'));
463 13
        $objWriter->endElement();
464
465 13
        if ($id2 > 0) {
466 13
            $objWriter->startElement('c:crossAx');
467 13
            $objWriter->writeAttribute('val', $id2);
468 13
            $objWriter->endElement();
469
470 13
            $objWriter->startElement('c:crosses');
471 13
            $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses'));
472 13
            $objWriter->endElement();
473
        }
474
475 13
        $objWriter->startElement('c:auto');
476 13
        $objWriter->writeAttribute('val', 1);
477 13
        $objWriter->endElement();
478
479 13
        $objWriter->startElement('c:lblAlgn');
480 13
        $objWriter->writeAttribute('val', 'ctr');
481 13
        $objWriter->endElement();
482
483 13
        $objWriter->startElement('c:lblOffset');
484 13
        $objWriter->writeAttribute('val', 100);
485 13
        $objWriter->endElement();
486
487 13
        if ($isMultiLevelSeries) {
488 2
            $objWriter->startElement('c:noMultiLvlLbl');
489 2
            $objWriter->writeAttribute('val', 0);
490 2
            $objWriter->endElement();
491
        }
492 13
        $objWriter->endElement();
493 13
    }
494
495
    /**
496
     * Write Value Axis.
497
     *
498
     * @param XMLWriter $objWriter XML Writer
499
     * @param Title $yAxisLabel
500
     * @param string $groupType Chart type
501
     * @param string $id1
502
     * @param string $id2
503
     * @param bool $isMultiLevelSeries
504
     */
505 13
    private function writeValueAxis($objWriter, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, Axis $xAxis, GridLines $majorGridlines, GridLines $minorGridlines): void
506
    {
507 13
        $objWriter->startElement('c:valAx');
508
509 13
        if ($id2 > 0) {
510 13
            $objWriter->startElement('c:axId');
511 13
            $objWriter->writeAttribute('val', $id2);
512 13
            $objWriter->endElement();
513
        }
514
515 13
        $objWriter->startElement('c:scaling');
516
517 13
        if ($xAxis->getAxisOptionsProperty('maximum') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...rty('maximum') !== null is always true.
Loading history...
518
            $objWriter->startElement('c:max');
519
            $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum'));
520
            $objWriter->endElement();
521
        }
522
523 13
        if ($xAxis->getAxisOptionsProperty('minimum') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...rty('minimum') !== null is always true.
Loading history...
524
            $objWriter->startElement('c:min');
525
            $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum'));
526
            $objWriter->endElement();
527
        }
528
529 13
        $objWriter->startElement('c:orientation');
530 13
        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation'));
531
532 13
        $objWriter->endElement();
533 13
        $objWriter->endElement();
534
535 13
        $objWriter->startElement('c:delete');
536 13
        $objWriter->writeAttribute('val', 0);
537 13
        $objWriter->endElement();
538
539 13
        $objWriter->startElement('c:axPos');
540 13
        $objWriter->writeAttribute('val', 'l');
541 13
        $objWriter->endElement();
542
543 13
        $objWriter->startElement('c:majorGridlines');
544 13
        $objWriter->startElement('c:spPr');
545
546 13
        if ($majorGridlines->getLineColorProperty('value') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getLine...perty('value') !== null is always true.
Loading history...
547
            $objWriter->startElement('a:ln');
548
            $objWriter->writeAttribute('w', $majorGridlines->getLineStyleProperty('width'));
549
            $objWriter->startElement('a:solidFill');
550
            $objWriter->startElement("a:{$majorGridlines->getLineColorProperty('type')}");
551
            $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('value'));
552
            $objWriter->startElement('a:alpha');
553
            $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('alpha'));
554
            $objWriter->endElement(); //end alpha
555
            $objWriter->endElement(); //end srgbClr
556
            $objWriter->endElement(); //end solidFill
557
558
            $objWriter->startElement('a:prstDash');
559
            $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash'));
560
            $objWriter->endElement();
561
562
            if ($majorGridlines->getLineStyleProperty('join') == 'miter') {
563
                $objWriter->startElement('a:miter');
564
                $objWriter->writeAttribute('lim', '800000');
565
                $objWriter->endElement();
566
            } else {
567
                $objWriter->startElement('a:bevel');
568
                $objWriter->endElement();
569
            }
570
571
            if ($majorGridlines->getLineStyleProperty(['arrow', 'head', 'type']) !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getLine...ead', 'type')) !== null is always true.
Loading history...
572
                $objWriter->startElement('a:headEnd');
573
                $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(['arrow', 'head', 'type']));
574
                $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('head', 'w'));
575
                $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('head', 'len'));
576
                $objWriter->endElement();
577
            }
578
579
            if ($majorGridlines->getLineStyleProperty(['arrow', 'end', 'type']) !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getLine...end', 'type')) !== null is always true.
Loading history...
580
                $objWriter->startElement('a:tailEnd');
581
                $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(['arrow', 'end', 'type']));
582
                $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('end', 'w'));
583
                $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('end', 'len'));
584
                $objWriter->endElement();
585
            }
586
            $objWriter->endElement(); //end ln
587
        }
588 13
        $objWriter->startElement('a:effectLst');
589
590 13
        if ($majorGridlines->getGlowSize() !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getGlowSize() !== null is always true.
Loading history...
591
            $objWriter->startElement('a:glow');
592
            $objWriter->writeAttribute('rad', $majorGridlines->getGlowSize());
593
            $objWriter->startElement("a:{$majorGridlines->getGlowColor('type')}");
594
            $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('value'));
595
            $objWriter->startElement('a:alpha');
596
            $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('alpha'));
597
            $objWriter->endElement(); //end alpha
598
            $objWriter->endElement(); //end schemeClr
599
            $objWriter->endElement(); //end glow
600
        }
601
602 13
        if ($majorGridlines->getShadowProperty('presets') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...rty('presets') !== null is always true.
Loading history...
603
            $objWriter->startElement("a:{$majorGridlines->getShadowProperty('effect')}");
604
            if ($majorGridlines->getShadowProperty('blur') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...operty('blur') !== null is always true.
Loading history...
605
                $objWriter->writeAttribute('blurRad', $majorGridlines->getShadowProperty('blur'));
606
            }
607
            if ($majorGridlines->getShadowProperty('distance') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...ty('distance') !== null is always true.
Loading history...
608
                $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance'));
609
            }
610
            if ($majorGridlines->getShadowProperty('direction') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...y('direction') !== null is always true.
Loading history...
611
                $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction'));
612
            }
613
            if ($majorGridlines->getShadowProperty('algn') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...operty('algn') !== null is always true.
Loading history...
614
                $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn'));
615
            }
616
            if ($majorGridlines->getShadowProperty(['size', 'sx']) !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...'size', 'sx')) !== null is always true.
Loading history...
617
                $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(['size', 'sx']));
618
            }
619
            if ($majorGridlines->getShadowProperty(['size', 'sy']) !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...'size', 'sy')) !== null is always true.
Loading history...
620
                $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(['size', 'sy']));
621
            }
622
            if ($majorGridlines->getShadowProperty(['size', 'kx']) !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...'size', 'kx')) !== null is always true.
Loading history...
623
                $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(['size', 'kx']));
624
            }
625
            if ($majorGridlines->getShadowProperty('rotWithShape') !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getShad...rotWithShape') !== null is always true.
Loading history...
626
                $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape'));
627
            }
628
            $objWriter->startElement("a:{$majorGridlines->getShadowProperty(['color', 'type'])}");
629
            $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(['color', 'value']));
630
631
            $objWriter->startElement('a:alpha');
632
            $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(['color', 'alpha']));
633
            $objWriter->endElement(); //end alpha
634
635
            $objWriter->endElement(); //end color:type
636
            $objWriter->endElement(); //end shadow
637
        }
638
639 13
        if ($majorGridlines->getSoftEdgesSize() !== null) {
0 ignored issues
show
introduced by
The condition $majorGridlines->getSoftEdgesSize() !== null is always true.
Loading history...
640
            $objWriter->startElement('a:softEdge');
641
            $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize());
642
            $objWriter->endElement(); //end softEdge
643
        }
644
645 13
        $objWriter->endElement(); //end effectLst
646 13
        $objWriter->endElement(); //end spPr
647 13
        $objWriter->endElement(); //end majorGridLines
648
649 13
        if ($minorGridlines->getObjectState()) {
650
            $objWriter->startElement('c:minorGridlines');
651
            $objWriter->startElement('c:spPr');
652
653
            if ($minorGridlines->getLineColorProperty('value') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getLine...perty('value') !== null is always true.
Loading history...
654
                $objWriter->startElement('a:ln');
655
                $objWriter->writeAttribute('w', $minorGridlines->getLineStyleProperty('width'));
656
                $objWriter->startElement('a:solidFill');
657
                $objWriter->startElement("a:{$minorGridlines->getLineColorProperty('type')}");
658
                $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('value'));
659
                $objWriter->startElement('a:alpha');
660
                $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('alpha'));
661
                $objWriter->endElement(); //end alpha
662
                $objWriter->endElement(); //end srgbClr
663
                $objWriter->endElement(); //end solidFill
664
665
                $objWriter->startElement('a:prstDash');
666
                $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash'));
667
                $objWriter->endElement();
668
669
                if ($minorGridlines->getLineStyleProperty('join') == 'miter') {
670
                    $objWriter->startElement('a:miter');
671
                    $objWriter->writeAttribute('lim', '800000');
672
                    $objWriter->endElement();
673
                } else {
674
                    $objWriter->startElement('a:bevel');
675
                    $objWriter->endElement();
676
                }
677
678
                if ($minorGridlines->getLineStyleProperty(['arrow', 'head', 'type']) !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getLine...ead', 'type')) !== null is always true.
Loading history...
679
                    $objWriter->startElement('a:headEnd');
680
                    $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(['arrow', 'head', 'type']));
681
                    $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('head', 'w'));
682
                    $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('head', 'len'));
683
                    $objWriter->endElement();
684
                }
685
686
                if ($minorGridlines->getLineStyleProperty(['arrow', 'end', 'type']) !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getLine...end', 'type')) !== null is always true.
Loading history...
687
                    $objWriter->startElement('a:tailEnd');
688
                    $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(['arrow', 'end', 'type']));
689
                    $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('end', 'w'));
690
                    $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('end', 'len'));
691
                    $objWriter->endElement();
692
                }
693
                $objWriter->endElement(); //end ln
694
            }
695
696
            $objWriter->startElement('a:effectLst');
697
698
            if ($minorGridlines->getGlowSize() !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getGlowSize() !== null is always true.
Loading history...
699
                $objWriter->startElement('a:glow');
700
                $objWriter->writeAttribute('rad', $minorGridlines->getGlowSize());
701
                $objWriter->startElement("a:{$minorGridlines->getGlowColor('type')}");
702
                $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('value'));
703
                $objWriter->startElement('a:alpha');
704
                $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('alpha'));
705
                $objWriter->endElement(); //end alpha
706
                $objWriter->endElement(); //end schemeClr
707
                $objWriter->endElement(); //end glow
708
            }
709
710
            if ($minorGridlines->getShadowProperty('presets') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...rty('presets') !== null is always true.
Loading history...
711
                $objWriter->startElement("a:{$minorGridlines->getShadowProperty('effect')}");
712
                if ($minorGridlines->getShadowProperty('blur') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...operty('blur') !== null is always true.
Loading history...
713
                    $objWriter->writeAttribute('blurRad', $minorGridlines->getShadowProperty('blur'));
714
                }
715
                if ($minorGridlines->getShadowProperty('distance') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...ty('distance') !== null is always true.
Loading history...
716
                    $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance'));
717
                }
718
                if ($minorGridlines->getShadowProperty('direction') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...y('direction') !== null is always true.
Loading history...
719
                    $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction'));
720
                }
721
                if ($minorGridlines->getShadowProperty('algn') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...operty('algn') !== null is always true.
Loading history...
722
                    $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn'));
723
                }
724
                if ($minorGridlines->getShadowProperty(['size', 'sx']) !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...'size', 'sx')) !== null is always true.
Loading history...
725
                    $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(['size', 'sx']));
726
                }
727
                if ($minorGridlines->getShadowProperty(['size', 'sy']) !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...'size', 'sy')) !== null is always true.
Loading history...
728
                    $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(['size', 'sy']));
729
                }
730
                if ($minorGridlines->getShadowProperty(['size', 'kx']) !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...'size', 'kx')) !== null is always true.
Loading history...
731
                    $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(['size', 'kx']));
732
                }
733
                if ($minorGridlines->getShadowProperty('rotWithShape') !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getShad...rotWithShape') !== null is always true.
Loading history...
734
                    $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape'));
735
                }
736
                $objWriter->startElement("a:{$minorGridlines->getShadowProperty(['color', 'type'])}");
737
                $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(['color', 'value']));
738
                $objWriter->startElement('a:alpha');
739
                $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(['color', 'alpha']));
740
                $objWriter->endElement(); //end alpha
741
                $objWriter->endElement(); //end color:type
742
                $objWriter->endElement(); //end shadow
743
            }
744
745
            if ($minorGridlines->getSoftEdgesSize() !== null) {
0 ignored issues
show
introduced by
The condition $minorGridlines->getSoftEdgesSize() !== null is always true.
Loading history...
746
                $objWriter->startElement('a:softEdge');
747
                $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize());
748
                $objWriter->endElement(); //end softEdge
749
            }
750
751
            $objWriter->endElement(); //end effectLst
752
            $objWriter->endElement(); //end spPr
753
            $objWriter->endElement(); //end minorGridLines
754
        }
755
756 13
        if ($yAxisLabel !== null) {
757 11
            $objWriter->startElement('c:title');
758 11
            $objWriter->startElement('c:tx');
759 11
            $objWriter->startElement('c:rich');
760
761 11
            $objWriter->startElement('a:bodyPr');
762 11
            $objWriter->endElement();
763
764 11
            $objWriter->startElement('a:lstStyle');
765 11
            $objWriter->endElement();
766
767 11
            $objWriter->startElement('a:p');
768 11
            $objWriter->startElement('a:r');
769
770 11
            $caption = $yAxisLabel->getCaption();
771 11
            if (is_array($caption)) {
0 ignored issues
show
introduced by
The condition is_array($caption) is always false.
Loading history...
772 2
                $caption = $caption[0];
773
            }
774
775 11
            $objWriter->startElement('a:t');
776 11
            $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($caption));
777 11
            $objWriter->endElement();
778
779 11
            $objWriter->endElement();
780 11
            $objWriter->endElement();
781 11
            $objWriter->endElement();
782 11
            $objWriter->endElement();
783
784 11
            if ($groupType !== DataSeries::TYPE_BUBBLECHART) {
785 11
                $layout = $yAxisLabel->getLayout();
786 11
                $this->writeLayout($objWriter, $layout);
787
            }
788
789 11
            $objWriter->startElement('c:overlay');
790 11
            $objWriter->writeAttribute('val', 0);
791 11
            $objWriter->endElement();
792
793 11
            $objWriter->endElement();
794
        }
795
796 13
        $objWriter->startElement('c:numFmt');
797 13
        $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat());
798 13
        $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked());
799 13
        $objWriter->endElement();
800
801 13
        $objWriter->startElement('c:majorTickMark');
802 13
        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark'));
803 13
        $objWriter->endElement();
804
805 13
        $objWriter->startElement('c:minorTickMark');
806 13
        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark'));
807 13
        $objWriter->endElement();
808
809 13
        $objWriter->startElement('c:tickLblPos');
810 13
        $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels'));
811 13
        $objWriter->endElement();
812
813 13
        $objWriter->startElement('c:spPr');
814
815 13
        if ($xAxis->getFillProperty('value') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getFillProperty('value') !== null is always true.
Loading history...
816
            $objWriter->startElement('a:solidFill');
817
            $objWriter->startElement('a:' . $xAxis->getFillProperty('type'));
818
            $objWriter->writeAttribute('val', $xAxis->getFillProperty('value'));
819
            $objWriter->startElement('a:alpha');
820
            $objWriter->writeAttribute('val', $xAxis->getFillProperty('alpha'));
821
            $objWriter->endElement();
822
            $objWriter->endElement();
823
            $objWriter->endElement();
824
        }
825
826 13
        $objWriter->startElement('a:ln');
827
828 13
        $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width'));
829 13
        $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap'));
830 13
        $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound'));
831
832 13
        if ($xAxis->getLineProperty('value') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getLineProperty('value') !== null is always true.
Loading history...
833
            $objWriter->startElement('a:solidFill');
834
            $objWriter->startElement('a:' . $xAxis->getLineProperty('type'));
835
            $objWriter->writeAttribute('val', $xAxis->getLineProperty('value'));
836
            $objWriter->startElement('a:alpha');
837
            $objWriter->writeAttribute('val', $xAxis->getLineProperty('alpha'));
838
            $objWriter->endElement();
839
            $objWriter->endElement();
840
            $objWriter->endElement();
841
        }
842
843 13
        $objWriter->startElement('a:prstDash');
844 13
        $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash'));
845 13
        $objWriter->endElement();
846
847 13
        if ($xAxis->getLineStyleProperty('join') == 'miter') {
848
            $objWriter->startElement('a:miter');
849
            $objWriter->writeAttribute('lim', '800000');
850
            $objWriter->endElement();
851
        } else {
852 13
            $objWriter->startElement('a:bevel');
853 13
            $objWriter->endElement();
854
        }
855
856 13
        if ($xAxis->getLineStyleProperty(['arrow', 'head', 'type']) !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getLineStyleProp...ead', 'type')) !== null is always true.
Loading history...
857
            $objWriter->startElement('a:headEnd');
858
            $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(['arrow', 'head', 'type']));
859
            $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('head'));
860
            $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('head'));
861
            $objWriter->endElement();
862
        }
863
864 13
        if ($xAxis->getLineStyleProperty(['arrow', 'end', 'type']) !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getLineStyleProp...end', 'type')) !== null is always true.
Loading history...
865
            $objWriter->startElement('a:tailEnd');
866
            $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(['arrow', 'end', 'type']));
867
            $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('end'));
868
            $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('end'));
869
            $objWriter->endElement();
870
        }
871
872 13
        $objWriter->endElement();
873
874 13
        $objWriter->startElement('a:effectLst');
875
876 13
        if ($xAxis->getGlowProperty('size') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getGlowProperty('size') !== null is always true.
Loading history...
877
            $objWriter->startElement('a:glow');
878
            $objWriter->writeAttribute('rad', $xAxis->getGlowProperty('size'));
879
            $objWriter->startElement("a:{$xAxis->getGlowProperty(['color', 'type'])}");
880
            $objWriter->writeAttribute('val', $xAxis->getGlowProperty(['color', 'value']));
881
            $objWriter->startElement('a:alpha');
882
            $objWriter->writeAttribute('val', $xAxis->getGlowProperty(['color', 'alpha']));
883
            $objWriter->endElement();
884
            $objWriter->endElement();
885
            $objWriter->endElement();
886
        }
887
888 13
        if ($xAxis->getShadowProperty('presets') !== null) {
889
            $objWriter->startElement("a:{$xAxis->getShadowProperty('effect')}");
890
891
            if ($xAxis->getShadowProperty('blur') !== null) {
892
                $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur'));
1 ignored issue
show
Bug introduced by
It seems like $xAxis->getShadowProperty('blur') can also be of type array; however, parameter $value of XMLWriter::writeAttribute() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

892
                $objWriter->writeAttribute('blurRad', /** @scrutinizer ignore-type */ $xAxis->getShadowProperty('blur'));
Loading history...
893
            }
894
            if ($xAxis->getShadowProperty('distance') !== null) {
895
                $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance'));
896
            }
897
            if ($xAxis->getShadowProperty('direction') !== null) {
898
                $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction'));
899
            }
900
            if ($xAxis->getShadowProperty('algn') !== null) {
901
                $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn'));
902
            }
903
            if ($xAxis->getShadowProperty(['size', 'sx']) !== null) {
904
                $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(['size', 'sx']));
905
            }
906
            if ($xAxis->getShadowProperty(['size', 'sy']) !== null) {
907
                $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(['size', 'sy']));
908
            }
909
            if ($xAxis->getShadowProperty(['size', 'kx']) !== null) {
910
                $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(['size', 'kx']));
911
            }
912
            if ($xAxis->getShadowProperty('rotWithShape') !== null) {
913
                $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape'));
914
            }
915
916
            $objWriter->startElement("a:{$xAxis->getShadowProperty(['color', 'type'])}");
917
            $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'value']));
918
            $objWriter->startElement('a:alpha');
919
            $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'alpha']));
920
            $objWriter->endElement();
921
            $objWriter->endElement();
922
923
            $objWriter->endElement();
924
        }
925
926 13
        if ($xAxis->getSoftEdgesSize() !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getSoftEdgesSize() !== null is always true.
Loading history...
927
            $objWriter->startElement('a:softEdge');
928
            $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize());
929
            $objWriter->endElement();
930
        }
931
932 13
        $objWriter->endElement(); //effectList
933 13
        $objWriter->endElement(); //end spPr
934
935 13
        if ($id1 > 0) {
936 13
            $objWriter->startElement('c:crossAx');
937 13
            $objWriter->writeAttribute('val', $id2);
938 13
            $objWriter->endElement();
939
940 13
            if ($xAxis->getAxisOptionsProperty('horizontal_crosses_value') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...rosses_value') !== null is always true.
Loading history...
941
                $objWriter->startElement('c:crossesAt');
942
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value'));
943
                $objWriter->endElement();
944
            } else {
945 13
                $objWriter->startElement('c:crosses');
946 13
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses'));
947 13
                $objWriter->endElement();
948
            }
949
950 13
            $objWriter->startElement('c:crossBetween');
951 13
            $objWriter->writeAttribute('val', 'midCat');
952 13
            $objWriter->endElement();
953
954 13
            if ($xAxis->getAxisOptionsProperty('major_unit') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...('major_unit') !== null is always true.
Loading history...
955
                $objWriter->startElement('c:majorUnit');
956
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));
957
                $objWriter->endElement();
958
            }
959
960 13
            if ($xAxis->getAxisOptionsProperty('minor_unit') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...('minor_unit') !== null is always true.
Loading history...
961
                $objWriter->startElement('c:minorUnit');
962
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit'));
963
                $objWriter->endElement();
964
            }
965
        }
966
967 13
        if ($isMultiLevelSeries) {
968 1
            if ($groupType !== DataSeries::TYPE_BUBBLECHART) {
969
                $objWriter->startElement('c:noMultiLvlLbl');
970
                $objWriter->writeAttribute('val', 0);
971
                $objWriter->endElement();
972
            }
973
        }
974
975 13
        $objWriter->endElement();
976 13
    }
977
978
    /**
979
     * Get the data series type(s) for a chart plot series.
980
     *
981
     * @param PlotArea $plotArea
982
     *
983
     * @return array|string
984
     */
985 15
    private static function getChartType($plotArea)
986
    {
987 15
        $groupCount = $plotArea->getPlotGroupCount();
988
989 15
        if ($groupCount == 1) {
990 14
            $chartType = [$plotArea->getPlotGroupByIndex(0)->getPlotType()];
991
        } else {
992 2
            $chartTypes = [];
993 2
            for ($i = 0; $i < $groupCount; ++$i) {
994 2
                $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType();
995
            }
996 2
            $chartType = array_unique($chartTypes);
997 2
            if (count($chartTypes) == 0) {
998
                throw new WriterException('Chart is not yet implemented');
999
            }
1000
        }
1001
1002 15
        return $chartType;
1003
    }
1004
1005
    /**
1006
     * Method writing plot series values.
1007
     *
1008
     * @param XMLWriter $objWriter XML Writer
1009
     * @param int       $val       value for idx (default: 3)
1010
     * @param string    $fillColor hex color (default: FF9900)
1011
     *
1012
     * @return XMLWriter XML Writer
1013
     */
1014 3
    private function writePlotSeriesValuesElement($objWriter, $val = 3, $fillColor = 'FF9900')
1015
    {
1016 3
        $objWriter->startElement('c:dPt');
1017 3
        $objWriter->startElement('c:idx');
1018 3
        $objWriter->writeAttribute('val', $val);
1019 3
        $objWriter->endElement();
1020
1021 3
        $objWriter->startElement('c:bubble3D');
1022 3
        $objWriter->writeAttribute('val', 0);
1023 3
        $objWriter->endElement();
1024
1025 3
        $objWriter->startElement('c:spPr');
1026 3
        $objWriter->startElement('a:solidFill');
1027 3
        $objWriter->startElement('a:srgbClr');
1028 3
        $objWriter->writeAttribute('val', $fillColor);
1029 3
        $objWriter->endElement();
1030 3
        $objWriter->endElement();
1031 3
        $objWriter->endElement();
1032 3
        $objWriter->endElement();
1033
1034 3
        return $objWriter;
1035
    }
1036
1037
    /**
1038
     * Write Plot Group (series of related plots).
1039
     *
1040
     * @param DataSeries $plotGroup
1041
     * @param string $groupType Type of plot for dataseries
1042
     * @param XMLWriter $objWriter XML Writer
1043
     * @param bool $catIsMultiLevelSeries Is category a multi-series category
1044
     * @param bool $valIsMultiLevelSeries Is value set a multi-series set
1045
     * @param string $plotGroupingType Type of grouping for multi-series values
1046
     */
1047 15
    private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType): void
1048
    {
1049 15
        if ($plotGroup === null) {
1050
            return;
1051
        }
1052
1053 15
        if (($groupType == DataSeries::TYPE_BARCHART) || ($groupType == DataSeries::TYPE_BARCHART_3D)) {
1054 8
            $objWriter->startElement('c:barDir');
1055 8
            $objWriter->writeAttribute('val', $plotGroup->getPlotDirection());
1056 8
            $objWriter->endElement();
1057
        }
1058
1059 15
        if ($plotGroup->getPlotGrouping() !== null) {
0 ignored issues
show
introduced by
The condition $plotGroup->getPlotGrouping() !== null is always true.
Loading history...
1060 10
            $plotGroupingType = $plotGroup->getPlotGrouping();
1061 10
            $objWriter->startElement('c:grouping');
1062 10
            $objWriter->writeAttribute('val', $plotGroupingType);
1063 10
            $objWriter->endElement();
1064
        }
1065
1066
        //    Get these details before the loop, because we can use the count to check for varyColors
1067 15
        $plotSeriesOrder = $plotGroup->getPlotOrder();
1068 15
        $plotSeriesCount = count($plotSeriesOrder);
1069
1070 15
        if (($groupType !== DataSeries::TYPE_RADARCHART) && ($groupType !== DataSeries::TYPE_STOCKCHART)) {
1071 13
            if ($groupType !== DataSeries::TYPE_LINECHART) {
1072 12
                if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) {
1073 11
                    $objWriter->startElement('c:varyColors');
1074 11
                    $objWriter->writeAttribute('val', 1);
1075 11
                    $objWriter->endElement();
1076
                } else {
1077 2
                    $objWriter->startElement('c:varyColors');
1078 2
                    $objWriter->writeAttribute('val', 0);
1079 2
                    $objWriter->endElement();
1080
                }
1081
            }
1082
        }
1083
1084 15
        $plotSeriesIdx = 0;
1085 15
        foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
1086 15
            $objWriter->startElement('c:ser');
1087
1088 15
            $plotLabel = $plotGroup->getPlotLabelByIndex($plotSeriesIdx);
1089 15
            if ($plotLabel) {
1090 15
                $fillColor = $plotLabel->getFillColor();
1091 15
                if ($fillColor !== null && !is_array($fillColor)) {
1092
                    $objWriter->startElement('c:spPr');
1093
                    $objWriter->startElement('a:solidFill');
1094
                    $objWriter->startElement('a:srgbClr');
1095
                    $objWriter->writeAttribute('val', $fillColor);
1096
                    $objWriter->endElement();
1097
                    $objWriter->endElement();
1098
                    $objWriter->endElement();
1099
                }
1100
            }
1101
1102 15
            $objWriter->startElement('c:idx');
1103 15
            $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesIdx);
1104 15
            $objWriter->endElement();
1105
1106 15
            $objWriter->startElement('c:order');
1107 15
            $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesRef);
1108 15
            $objWriter->endElement();
1109
1110
            //    Values
1111 15
            $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef);
1112
1113 15
            if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) {
1114 3
                $fillColorValues = $plotSeriesValues->getFillColor();
1115 3
                if ($fillColorValues !== null && is_array($fillColorValues)) {
1116 1
                    foreach ($plotSeriesValues->getDataValues() as $dataKey => $dataValue) {
1117 1
                        $this->writePlotSeriesValuesElement($objWriter, $dataKey, ($fillColorValues[$dataKey] ?? 'FF9900'));
1118
                    }
1119
                } else {
1120 2
                    $this->writePlotSeriesValuesElement($objWriter);
1121
                }
1122
            }
1123
1124
            //    Labels
1125 15
            $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef);
1126 15
            if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) {
1127 15
                $objWriter->startElement('c:tx');
1128 15
                $objWriter->startElement('c:strRef');
1129 15
                $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter);
1130 15
                $objWriter->endElement();
1131 15
                $objWriter->endElement();
1132
            }
1133
1134
            //    Formatting for the points
1135 15
            if (($groupType == DataSeries::TYPE_LINECHART) || ($groupType == DataSeries::TYPE_STOCKCHART)) {
1136 4
                $plotLineWidth = 12700;
1137 4
                if ($plotSeriesValues) {
1138 4
                    $plotLineWidth = $plotSeriesValues->getLineWidth();
1139
                }
1140
1141 4
                $objWriter->startElement('c:spPr');
1142 4
                $objWriter->startElement('a:ln');
1143 4
                $objWriter->writeAttribute('w', $plotLineWidth);
1144 4
                if ($groupType == DataSeries::TYPE_STOCKCHART) {
1145 2
                    $objWriter->startElement('a:noFill');
1146 2
                    $objWriter->endElement();
1147
                }
1148 4
                $objWriter->endElement();
1149 4
                $objWriter->endElement();
1150
            }
1151
1152 15
            if ($plotSeriesValues) {
1153 15
                $plotSeriesMarker = $plotSeriesValues->getPointMarker();
1154 15
                if ($plotSeriesMarker) {
1155 1
                    $objWriter->startElement('c:marker');
1156 1
                    $objWriter->startElement('c:symbol');
1157 1
                    $objWriter->writeAttribute('val', $plotSeriesMarker);
1158 1
                    $objWriter->endElement();
1159
1160 1
                    if ($plotSeriesMarker !== 'none') {
1161 1
                        $objWriter->startElement('c:size');
1162 1
                        $objWriter->writeAttribute('val', 3);
1163 1
                        $objWriter->endElement();
1164
                    }
1165
1166 1
                    $objWriter->endElement();
1167
                }
1168
            }
1169
1170 15
            if (($groupType === DataSeries::TYPE_BARCHART) || ($groupType === DataSeries::TYPE_BARCHART_3D) || ($groupType === DataSeries::TYPE_BUBBLECHART)) {
1171 8
                $objWriter->startElement('c:invertIfNegative');
1172 8
                $objWriter->writeAttribute('val', 0);
1173 8
                $objWriter->endElement();
1174
            }
1175
1176
            //    Category Labels
1177 15
            $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef);
1178 15
            if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) {
1179 15
                $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
1180
1181 15
                if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) {
1182 3
                    if ($plotGroup->getPlotStyle() !== null) {
1183 1
                        $plotStyle = $plotGroup->getPlotStyle();
1184 1
                        if ($plotStyle) {
1185 1
                            $objWriter->startElement('c:explosion');
1186 1
                            $objWriter->writeAttribute('val', 25);
1187 1
                            $objWriter->endElement();
1188
                        }
1189
                    }
1190
                }
1191
1192 15
                if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) {
1193 2
                    $objWriter->startElement('c:xVal');
1194
                } else {
1195 14
                    $objWriter->startElement('c:cat');
1196
                }
1197
1198 15
                $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str');
1199 15
                $objWriter->endElement();
1200
            }
1201
1202
            //    Values
1203 15
            if ($plotSeriesValues) {
1204 15
                $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries();
1205
1206 15
                if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) {
1207 2
                    $objWriter->startElement('c:yVal');
1208
                } else {
1209 14
                    $objWriter->startElement('c:val');
1210
                }
1211
1212 15
                $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num');
1213 15
                $objWriter->endElement();
1214
            }
1215
1216 15
            if ($groupType === DataSeries::TYPE_BUBBLECHART) {
1217 1
                $this->writeBubbles($plotSeriesValues, $objWriter);
1218
            }
1219
1220 15
            $objWriter->endElement();
1221
        }
1222
1223 15
        $this->seriesIndex += $plotSeriesIdx + 1;
1224 15
    }
1225
1226
    /**
1227
     * Write Plot Series Label.
1228
     *
1229
     * @param DataSeriesValues $plotSeriesLabel
1230
     * @param XMLWriter $objWriter XML Writer
1231
     */
1232 15
    private function writePlotSeriesLabel($plotSeriesLabel, $objWriter): void
1233
    {
1234 15
        if ($plotSeriesLabel === null) {
1235
            return;
1236
        }
1237
1238 15
        $objWriter->startElement('c:f');
1239 15
        $objWriter->writeRawData($plotSeriesLabel->getDataSource());
1240 15
        $objWriter->endElement();
1241
1242 15
        $objWriter->startElement('c:strCache');
1243 15
        $objWriter->startElement('c:ptCount');
1244 15
        $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount());
1245 15
        $objWriter->endElement();
1246
1247 15
        foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) {
1248 15
            $objWriter->startElement('c:pt');
1249 15
            $objWriter->writeAttribute('idx', $plotLabelKey);
1250
1251 15
            $objWriter->startElement('c:v');
1252 15
            $objWriter->writeRawData($plotLabelValue);
1253 15
            $objWriter->endElement();
1254 15
            $objWriter->endElement();
1255
        }
1256 15
        $objWriter->endElement();
1257 15
    }
1258
1259
    /**
1260
     * Write Plot Series Values.
1261
     *
1262
     * @param DataSeriesValues $plotSeriesValues
1263
     * @param XMLWriter $objWriter XML Writer
1264
     * @param string $groupType Type of plot for dataseries
1265
     * @param string $dataType Datatype of series values
1266
     */
1267 15
    private function writePlotSeriesValues($plotSeriesValues, XMLWriter $objWriter, $groupType, $dataType = 'str'): void
1268
    {
1269 15
        if ($plotSeriesValues === null) {
1270
            return;
1271
        }
1272
1273 15
        if ($plotSeriesValues->isMultiLevelSeries()) {
1274 2
            $levelCount = $plotSeriesValues->multiLevelCount();
1275
1276 2
            $objWriter->startElement('c:multiLvlStrRef');
1277
1278 2
            $objWriter->startElement('c:f');
1279 2
            $objWriter->writeRawData($plotSeriesValues->getDataSource());
1280 2
            $objWriter->endElement();
1281
1282 2
            $objWriter->startElement('c:multiLvlStrCache');
1283
1284 2
            $objWriter->startElement('c:ptCount');
1285 2
            $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1286 2
            $objWriter->endElement();
1287
1288 2
            for ($level = 0; $level < $levelCount; ++$level) {
1289 2
                $objWriter->startElement('c:lvl');
1290
1291 2
                foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
1292 2
                    if (isset($plotSeriesValue[$level])) {
1293 2
                        $objWriter->startElement('c:pt');
1294 2
                        $objWriter->writeAttribute('idx', $plotSeriesKey);
1295
1296 2
                        $objWriter->startElement('c:v');
1297 2
                        $objWriter->writeRawData($plotSeriesValue[$level]);
1298 2
                        $objWriter->endElement();
1299 2
                        $objWriter->endElement();
1300
                    }
1301
                }
1302
1303 2
                $objWriter->endElement();
1304
            }
1305
1306 2
            $objWriter->endElement();
1307
1308 2
            $objWriter->endElement();
1309
        } else {
1310 15
            $objWriter->startElement('c:' . $dataType . 'Ref');
1311
1312 15
            $objWriter->startElement('c:f');
1313 15
            $objWriter->writeRawData($plotSeriesValues->getDataSource());
1314 15
            $objWriter->endElement();
1315
1316 15
            $objWriter->startElement('c:' . $dataType . 'Cache');
1317
1318 15
            if (($groupType != DataSeries::TYPE_PIECHART) && ($groupType != DataSeries::TYPE_PIECHART_3D) && ($groupType != DataSeries::TYPE_DONUTCHART)) {
1319 13
                if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) {
1320 1
                    $objWriter->startElement('c:formatCode');
1321 1
                    $objWriter->writeRawData($plotSeriesValues->getFormatCode());
1322 1
                    $objWriter->endElement();
1323
                }
1324
            }
1325
1326 15
            $objWriter->startElement('c:ptCount');
1327 15
            $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1328 15
            $objWriter->endElement();
1329
1330 15
            $dataValues = $plotSeriesValues->getDataValues();
1331 15
            if (!empty($dataValues)) {
1332 15
                if (is_array($dataValues)) {
0 ignored issues
show
introduced by
The condition is_array($dataValues) is always true.
Loading history...
1333 15
                    foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {
1334 15
                        $objWriter->startElement('c:pt');
1335 15
                        $objWriter->writeAttribute('idx', $plotSeriesKey);
1336
1337 15
                        $objWriter->startElement('c:v');
1338 15
                        $objWriter->writeRawData($plotSeriesValue);
1339 15
                        $objWriter->endElement();
1340 15
                        $objWriter->endElement();
1341
                    }
1342
                }
1343
            }
1344
1345 15
            $objWriter->endElement();
1346
1347 15
            $objWriter->endElement();
1348
        }
1349 15
    }
1350
1351
    /**
1352
     * Write Bubble Chart Details.
1353
     *
1354
     * @param DataSeriesValues $plotSeriesValues
1355
     * @param XMLWriter $objWriter XML Writer
1356
     */
1357 1
    private function writeBubbles($plotSeriesValues, $objWriter): void
1358
    {
1359 1
        if ($plotSeriesValues === null) {
1360
            return;
1361
        }
1362
1363 1
        $objWriter->startElement('c:bubbleSize');
1364 1
        $objWriter->startElement('c:numLit');
1365
1366 1
        $objWriter->startElement('c:formatCode');
1367 1
        $objWriter->writeRawData('General');
1368 1
        $objWriter->endElement();
1369
1370 1
        $objWriter->startElement('c:ptCount');
1371 1
        $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1372 1
        $objWriter->endElement();
1373
1374 1
        $dataValues = $plotSeriesValues->getDataValues();
1375 1
        if (!empty($dataValues)) {
1376 1
            if (is_array($dataValues)) {
0 ignored issues
show
introduced by
The condition is_array($dataValues) is always true.
Loading history...
1377 1
                foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {
1378 1
                    $objWriter->startElement('c:pt');
1379 1
                    $objWriter->writeAttribute('idx', $plotSeriesKey);
1380 1
                    $objWriter->startElement('c:v');
1381 1
                    $objWriter->writeRawData(1);
1382 1
                    $objWriter->endElement();
1383 1
                    $objWriter->endElement();
1384
                }
1385
            }
1386
        }
1387
1388 1
        $objWriter->endElement();
1389 1
        $objWriter->endElement();
1390
1391 1
        $objWriter->startElement('c:bubble3D');
1392 1
        $objWriter->writeAttribute('val', 0);
1393 1
        $objWriter->endElement();
1394 1
    }
1395
1396
    /**
1397
     * Write Layout.
1398
     *
1399
     * @param XMLWriter $objWriter XML Writer
1400
     * @param Layout $layout
1401
     */
1402 15
    private function writeLayout(XMLWriter $objWriter, ?Layout $layout = null): void
1403
    {
1404 15
        $objWriter->startElement('c:layout');
1405
1406 15
        if ($layout !== null) {
1407 5
            $objWriter->startElement('c:manualLayout');
1408
1409 5
            $layoutTarget = $layout->getLayoutTarget();
1410 5
            if ($layoutTarget !== null) {
0 ignored issues
show
introduced by
The condition $layoutTarget !== null is always true.
Loading history...
1411 1
                $objWriter->startElement('c:layoutTarget');
1412 1
                $objWriter->writeAttribute('val', $layoutTarget);
1413 1
                $objWriter->endElement();
1414
            }
1415
1416 5
            $xMode = $layout->getXMode();
1417 5
            if ($xMode !== null) {
0 ignored issues
show
introduced by
The condition $xMode !== null is always true.
Loading history...
1418 1
                $objWriter->startElement('c:xMode');
1419 1
                $objWriter->writeAttribute('val', $xMode);
1420 1
                $objWriter->endElement();
1421
            }
1422
1423 5
            $yMode = $layout->getYMode();
1424 5
            if ($yMode !== null) {
0 ignored issues
show
introduced by
The condition $yMode !== null is always true.
Loading history...
1425 1
                $objWriter->startElement('c:yMode');
1426 1
                $objWriter->writeAttribute('val', $yMode);
1427 1
                $objWriter->endElement();
1428
            }
1429
1430 5
            $x = $layout->getXPosition();
1431 5
            if ($x !== null) {
0 ignored issues
show
introduced by
The condition $x !== null is always true.
Loading history...
1432 1
                $objWriter->startElement('c:x');
1433 1
                $objWriter->writeAttribute('val', $x);
1434 1
                $objWriter->endElement();
1435
            }
1436
1437 5
            $y = $layout->getYPosition();
1438 5
            if ($y !== null) {
0 ignored issues
show
introduced by
The condition $y !== null is always true.
Loading history...
1439 1
                $objWriter->startElement('c:y');
1440 1
                $objWriter->writeAttribute('val', $y);
1441 1
                $objWriter->endElement();
1442
            }
1443
1444 5
            $w = $layout->getWidth();
1445 5
            if ($w !== null) {
0 ignored issues
show
introduced by
The condition $w !== null is always true.
Loading history...
1446 1
                $objWriter->startElement('c:w');
1447 1
                $objWriter->writeAttribute('val', $w);
1448 1
                $objWriter->endElement();
1449
            }
1450
1451 5
            $h = $layout->getHeight();
1452 5
            if ($h !== null) {
0 ignored issues
show
introduced by
The condition $h !== null is always true.
Loading history...
1453 1
                $objWriter->startElement('c:h');
1454 1
                $objWriter->writeAttribute('val', $h);
1455 1
                $objWriter->endElement();
1456
            }
1457
1458 5
            $objWriter->endElement();
1459
        }
1460
1461 15
        $objWriter->endElement();
1462 15
    }
1463
1464
    /**
1465
     * Write Alternate Content block.
1466
     *
1467
     * @param XMLWriter $objWriter XML Writer
1468
     */
1469 15
    private function writeAlternateContent($objWriter): void
1470
    {
1471 15
        $objWriter->startElement('mc:AlternateContent');
1472 15
        $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
1473
1474 15
        $objWriter->startElement('mc:Choice');
1475 15
        $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart');
1476 15
        $objWriter->writeAttribute('Requires', 'c14');
1477
1478 15
        $objWriter->startElement('c14:style');
1479 15
        $objWriter->writeAttribute('val', '102');
1480 15
        $objWriter->endElement();
1481 15
        $objWriter->endElement();
1482
1483 15
        $objWriter->startElement('mc:Fallback');
1484 15
        $objWriter->startElement('c:style');
1485 15
        $objWriter->writeAttribute('val', '2');
1486 15
        $objWriter->endElement();
1487 15
        $objWriter->endElement();
1488
1489 15
        $objWriter->endElement();
1490 15
    }
1491
1492
    /**
1493
     * Write Printer Settings.
1494
     *
1495
     * @param XMLWriter $objWriter XML Writer
1496
     */
1497 15
    private function writePrintSettings($objWriter): void
1498
    {
1499 15
        $objWriter->startElement('c:printSettings');
1500
1501 15
        $objWriter->startElement('c:headerFooter');
1502 15
        $objWriter->endElement();
1503
1504 15
        $objWriter->startElement('c:pageMargins');
1505 15
        $objWriter->writeAttribute('footer', 0.3);
1506 15
        $objWriter->writeAttribute('header', 0.3);
1507 15
        $objWriter->writeAttribute('r', 0.7);
1508 15
        $objWriter->writeAttribute('l', 0.7);
1509 15
        $objWriter->writeAttribute('t', 0.75);
1510 15
        $objWriter->writeAttribute('b', 0.75);
1511 15
        $objWriter->endElement();
1512
1513 15
        $objWriter->startElement('c:pageSetup');
1514 15
        $objWriter->writeAttribute('orientation', 'portrait');
1515 15
        $objWriter->endElement();
1516
1517 15
        $objWriter->endElement();
1518 15
    }
1519
}
1520