Failed Conditions
Push — master ( 0c93bb...a2be57 )
by Adrien
29:37 queued 19:11
created

Chart::writeValueAxis()   F

Complexity

Conditions 60
Paths 0

Size

Total Lines 471
Code Lines 340

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 108
CRAP Score 1189.46

Importance

Changes 0
Metric Value
cc 60
eloc 340
nc 0
nop 9
dl 0
loc 471
ccs 108
cts 337
cp 0.3205
crap 1189.46
rs 3.3333
c 0
b 0
f 0

How to fix   Long Method    Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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 17
    public function writeChart(\PhpOffice\PhpSpreadsheet\Chart\Chart $chart, $calculateCellValues = true)
34
    {
35 17
        $this->calculateCellValues = $calculateCellValues;
36
37
        // Create XML writer
38 17
        $objWriter = null;
39 17
        if ($this->getParentWriter()->getUseDiskCaching()) {
40
            $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
41
        } else {
42 17
            $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
43
        }
44
        //    Ensure that data series values are up-to-date before we save
45 17
        if ($this->calculateCellValues) {
46 17
            $chart->refresh();
47
        }
48
49
        // XML header
50 17
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
51
52
        // c:chartSpace
53 17
        $objWriter->startElement('c:chartSpace');
54 17
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
55 17
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
56 17
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
57
58 17
        $objWriter->startElement('c:date1904');
59 17
        $objWriter->writeAttribute('val', 0);
60 17
        $objWriter->endElement();
61 17
        $objWriter->startElement('c:lang');
62 17
        $objWriter->writeAttribute('val', 'en-GB');
63 17
        $objWriter->endElement();
64 17
        $objWriter->startElement('c:roundedCorners');
65 17
        $objWriter->writeAttribute('val', 0);
66 17
        $objWriter->endElement();
67
68 17
        $this->writeAlternateContent($objWriter);
69
70 17
        $objWriter->startElement('c:chart');
71
72 17
        $this->writeTitle($objWriter, $chart->getTitle());
73
74 17
        $objWriter->startElement('c:autoTitleDeleted');
75 17
        $objWriter->writeAttribute('val', 0);
76 17
        $objWriter->endElement();
77
78 17
        $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart->getXAxisLabel(), $chart->getYAxisLabel(), $chart->getChartAxisX(), $chart->getChartAxisY(), $chart->getMajorGridlines(), $chart->getMinorGridlines());
79
80 17
        $this->writeLegend($objWriter, $chart->getLegend());
81
82 17
        $objWriter->startElement('c:plotVisOnly');
83 17
        $objWriter->writeAttribute('val', (int) $chart->getPlotVisibleOnly());
84 17
        $objWriter->endElement();
85
86 17
        $objWriter->startElement('c:dispBlanksAs');
87 17
        $objWriter->writeAttribute('val', $chart->getDisplayBlanksAs());
88 17
        $objWriter->endElement();
89
90 17
        $objWriter->startElement('c:showDLblsOverMax');
91 17
        $objWriter->writeAttribute('val', 0);
92 17
        $objWriter->endElement();
93
94 17
        $objWriter->endElement();
95
96 17
        $this->writePrintSettings($objWriter);
97
98 17
        $objWriter->endElement();
99
100
        // Return
101 17
        return $objWriter->getData();
102
    }
103
104
    /**
105
     * Write Chart Title.
106
     */
107 17
    private function writeTitle(XMLWriter $objWriter, ?Title $title = null): void
108
    {
109 17
        if ($title === null) {
110 3
            return;
111
        }
112
113 15
        $objWriter->startElement('c:title');
114 15
        $objWriter->startElement('c:tx');
115 15
        $objWriter->startElement('c:rich');
116
117 15
        $objWriter->startElement('a:bodyPr');
118 15
        $objWriter->endElement();
119
120 15
        $objWriter->startElement('a:lstStyle');
121 15
        $objWriter->endElement();
122
123 15
        $objWriter->startElement('a:p');
124
125 15
        $caption = $title->getCaption();
126 15
        if ((is_array($caption)) && (count($caption) > 0)) {
127 2
            $caption = $caption[0];
128
        }
129 15
        $this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a');
130
131 15
        $objWriter->endElement();
132 15
        $objWriter->endElement();
133 15
        $objWriter->endElement();
134
135 15
        $this->writeLayout($objWriter, $title->getLayout());
136
137 15
        $objWriter->startElement('c:overlay');
138 15
        $objWriter->writeAttribute('val', 0);
139 15
        $objWriter->endElement();
140
141 15
        $objWriter->endElement();
142 15
    }
143
144
    /**
145
     * Write Chart Legend.
146
     */
147 17
    private function writeLegend(XMLWriter $objWriter, ?Legend $legend = null): void
148
    {
149 17
        if ($legend === null) {
150 5
            return;
151
        }
152
153 15
        $objWriter->startElement('c:legend');
154
155 15
        $objWriter->startElement('c:legendPos');
156 15
        $objWriter->writeAttribute('val', $legend->getPosition());
157 15
        $objWriter->endElement();
158
159 15
        $this->writeLayout($objWriter, $legend->getLayout());
160
161 15
        $objWriter->startElement('c:overlay');
162 15
        $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0');
163 15
        $objWriter->endElement();
164
165 15
        $objWriter->startElement('c:txPr');
166 15
        $objWriter->startElement('a:bodyPr');
167 15
        $objWriter->endElement();
168
169 15
        $objWriter->startElement('a:lstStyle');
170 15
        $objWriter->endElement();
171
172 15
        $objWriter->startElement('a:p');
173 15
        $objWriter->startElement('a:pPr');
174 15
        $objWriter->writeAttribute('rtl', 0);
175
176 15
        $objWriter->startElement('a:defRPr');
177 15
        $objWriter->endElement();
178 15
        $objWriter->endElement();
179
180 15
        $objWriter->startElement('a:endParaRPr');
181 15
        $objWriter->writeAttribute('lang', 'en-US');
182 15
        $objWriter->endElement();
183
184 15
        $objWriter->endElement();
185 15
        $objWriter->endElement();
186
187 15
        $objWriter->endElement();
188 15
    }
189
190
    /**
191
     * Write Chart Plot Area.
192
     */
193 17
    private function writePlotArea(XMLWriter $objWriter, PlotArea $plotArea, ?Title $xAxisLabel = null, ?Title $yAxisLabel = null, ?Axis $xAxis = null, ?Axis $yAxis = null, ?GridLines $majorGridlines = null, ?GridLines $minorGridlines = null): void
194
    {
195 17
        if ($plotArea === null) {
196
            return;
197
        }
198
199 17
        $id1 = $id2 = 0;
200 17
        $this->seriesIndex = 0;
201 17
        $objWriter->startElement('c:plotArea');
202
203 17
        $layout = $plotArea->getLayout();
204
205 17
        $this->writeLayout($objWriter, $layout);
206
207 17
        $chartTypes = self::getChartType($plotArea);
208 17
        $catIsMultiLevelSeries = $valIsMultiLevelSeries = false;
209 17
        $plotGroupingType = '';
210 17
        $chartType = null;
211 17
        foreach ($chartTypes as $chartType) {
212 17
            $objWriter->startElement('c:' . $chartType);
213
214 17
            $groupCount = $plotArea->getPlotGroupCount();
215 17
            $plotGroup = null;
216 17
            for ($i = 0; $i < $groupCount; ++$i) {
217 17
                $plotGroup = $plotArea->getPlotGroupByIndex($i);
218 17
                $groupType = $plotGroup->getPlotType();
219 17
                if ($groupType == $chartType) {
220 17
                    $plotStyle = $plotGroup->getPlotStyle();
221 17
                    if ($groupType === DataSeries::TYPE_RADARCHART) {
222 2
                        $objWriter->startElement('c:radarStyle');
223 2
                        $objWriter->writeAttribute('val', $plotStyle);
224 2
                        $objWriter->endElement();
225 16
                    } elseif ($groupType === DataSeries::TYPE_SCATTERCHART) {
226 2
                        $objWriter->startElement('c:scatterStyle');
227 2
                        $objWriter->writeAttribute('val', $plotStyle);
228 2
                        $objWriter->endElement();
229
                    }
230
231 17
                    $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType);
232
                }
233
            }
234
235 17
            $this->writeDataLabels($objWriter, $layout);
236
237 17
            if ($chartType === DataSeries::TYPE_LINECHART && $plotGroup) {
238
                //    Line only, Line3D can't be smoothed
239 5
                $objWriter->startElement('c:smooth');
240 5
                $objWriter->writeAttribute('val', (int) $plotGroup->getSmoothLine());
241 5
                $objWriter->endElement();
242 14
            } elseif (($chartType === DataSeries::TYPE_BARCHART) || ($chartType === DataSeries::TYPE_BARCHART_3D)) {
243 8
                $objWriter->startElement('c:gapWidth');
244 8
                $objWriter->writeAttribute('val', 150);
245 8
                $objWriter->endElement();
246
247 8
                if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') {
248 2
                    $objWriter->startElement('c:overlap');
249 2
                    $objWriter->writeAttribute('val', 100);
250 8
                    $objWriter->endElement();
251
                }
252 9
            } elseif ($chartType === DataSeries::TYPE_BUBBLECHART) {
253 1
                $objWriter->startElement('c:bubbleScale');
254 1
                $objWriter->writeAttribute('val', 25);
255 1
                $objWriter->endElement();
256
257 1
                $objWriter->startElement('c:showNegBubbles');
258 1
                $objWriter->writeAttribute('val', 0);
259 1
                $objWriter->endElement();
260 9
            } elseif ($chartType === DataSeries::TYPE_STOCKCHART) {
261 2
                $objWriter->startElement('c:hiLowLines');
262 2
                $objWriter->endElement();
263
264 2
                $objWriter->startElement('c:upDownBars');
265
266 2
                $objWriter->startElement('c:gapWidth');
267 2
                $objWriter->writeAttribute('val', 300);
268 2
                $objWriter->endElement();
269
270 2
                $objWriter->startElement('c:upBars');
271 2
                $objWriter->endElement();
272
273 2
                $objWriter->startElement('c:downBars');
274 2
                $objWriter->endElement();
275
276 2
                $objWriter->endElement();
277
            }
278
279
            //    Generate 2 unique numbers to use for axId values
280 17
            $id1 = '75091328';
281 17
            $id2 = '75089408';
282
283 17
            if (($chartType !== DataSeries::TYPE_PIECHART) && ($chartType !== DataSeries::TYPE_PIECHART_3D) && ($chartType !== DataSeries::TYPE_DONUTCHART)) {
284 15
                $objWriter->startElement('c:axId');
285 15
                $objWriter->writeAttribute('val', $id1);
286 15
                $objWriter->endElement();
287 15
                $objWriter->startElement('c:axId');
288 15
                $objWriter->writeAttribute('val', $id2);
289 15
                $objWriter->endElement();
290
            } else {
291 3
                $objWriter->startElement('c:firstSliceAng');
292 3
                $objWriter->writeAttribute('val', 0);
293 3
                $objWriter->endElement();
294
295 3
                if ($chartType === DataSeries::TYPE_DONUTCHART) {
296 3
                    $objWriter->startElement('c:holeSize');
297 3
                    $objWriter->writeAttribute('val', 50);
298 3
                    $objWriter->endElement();
299
                }
300
            }
301
302 17
            $objWriter->endElement();
303
        }
304
305 17
        if (($chartType !== DataSeries::TYPE_PIECHART) && ($chartType !== DataSeries::TYPE_PIECHART_3D) && ($chartType !== DataSeries::TYPE_DONUTCHART)) {
306 15
            if ($chartType === DataSeries::TYPE_BUBBLECHART) {
307 1
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $majorGridlines, $minorGridlines);
3 ignored issues
show
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

307
                $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

307
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $majorGridlines, /** @scrutinizer ignore-type */ $minorGridlines);
Loading history...
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

307
                $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, /** @scrutinizer ignore-type */ $xAxis, $majorGridlines, $minorGridlines);
Loading history...
308
            } else {
309 15
                $this->writeCategoryAxis($objWriter, $xAxisLabel, $id1, $id2, $catIsMultiLevelSeries, $xAxis);
1 ignored issue
show
Bug introduced by
It seems like $xAxis 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

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

873
                $objWriter->writeAttribute('blurRad', /** @scrutinizer ignore-type */ $xAxis->getShadowProperty('blur'));
Loading history...
874
            }
875
            if ($xAxis->getShadowProperty('distance') !== null) {
876
                $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance'));
877
            }
878
            if ($xAxis->getShadowProperty('direction') !== null) {
879
                $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction'));
880
            }
881
            if ($xAxis->getShadowProperty('algn') !== null) {
882
                $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn'));
883
            }
884
            if ($xAxis->getShadowProperty(['size', 'sx']) !== null) {
885
                $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(['size', 'sx']));
886
            }
887
            if ($xAxis->getShadowProperty(['size', 'sy']) !== null) {
888
                $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(['size', 'sy']));
889
            }
890
            if ($xAxis->getShadowProperty(['size', 'kx']) !== null) {
891
                $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(['size', 'kx']));
892
            }
893
            if ($xAxis->getShadowProperty('rotWithShape') !== null) {
894
                $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape'));
895
            }
896
897
            $objWriter->startElement("a:{$xAxis->getShadowProperty(['color', 'type'])}");
898
            $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'value']));
899
            $objWriter->startElement('a:alpha');
900
            $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'alpha']));
901
            $objWriter->endElement();
902
            $objWriter->endElement();
903
904
            $objWriter->endElement();
905
        }
906
907 15
        if ($xAxis->getSoftEdgesSize() !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getSoftEdgesSize() !== null is always true.
Loading history...
908
            $objWriter->startElement('a:softEdge');
909
            $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize());
910
            $objWriter->endElement();
911
        }
912
913 15
        $objWriter->endElement(); //effectList
914 15
        $objWriter->endElement(); //end spPr
915
916 15
        if ($id1 > 0) {
917 15
            $objWriter->startElement('c:crossAx');
918 15
            $objWriter->writeAttribute('val', $id2);
919 15
            $objWriter->endElement();
920
921 15
            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...
922
                $objWriter->startElement('c:crossesAt');
923
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value'));
924
                $objWriter->endElement();
925
            } else {
926 15
                $objWriter->startElement('c:crosses');
927 15
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses'));
928 15
                $objWriter->endElement();
929
            }
930
931 15
            $objWriter->startElement('c:crossBetween');
932 15
            $objWriter->writeAttribute('val', 'midCat');
933 15
            $objWriter->endElement();
934
935 15
            if ($xAxis->getAxisOptionsProperty('major_unit') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...('major_unit') !== null is always true.
Loading history...
936
                $objWriter->startElement('c:majorUnit');
937
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));
938
                $objWriter->endElement();
939
            }
940
941 15
            if ($xAxis->getAxisOptionsProperty('minor_unit') !== null) {
0 ignored issues
show
introduced by
The condition $xAxis->getAxisOptionsPr...('minor_unit') !== null is always true.
Loading history...
942
                $objWriter->startElement('c:minorUnit');
943
                $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit'));
944
                $objWriter->endElement();
945
            }
946
        }
947
948 15
        if ($isMultiLevelSeries) {
949 1
            if ($groupType !== DataSeries::TYPE_BUBBLECHART) {
950
                $objWriter->startElement('c:noMultiLvlLbl');
951
                $objWriter->writeAttribute('val', 0);
952
                $objWriter->endElement();
953
            }
954
        }
955
956 15
        $objWriter->endElement();
957 15
    }
958
959
    /**
960
     * Get the data series type(s) for a chart plot series.
961
     *
962
     * @return string[]
963
     */
964 17
    private static function getChartType(PlotArea $plotArea): array
965
    {
966 17
        $groupCount = $plotArea->getPlotGroupCount();
967
968 17
        if ($groupCount == 1) {
969 16
            $chartType = [$plotArea->getPlotGroupByIndex(0)->getPlotType()];
970
        } else {
971 2
            $chartTypes = [];
972 2
            for ($i = 0; $i < $groupCount; ++$i) {
973 2
                $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType();
974
            }
975 2
            $chartType = array_unique($chartTypes);
976 2
            if (count($chartTypes) == 0) {
977
                throw new WriterException('Chart is not yet implemented');
978
            }
979
        }
980
981 17
        return $chartType;
982
    }
983
984
    /**
985
     * Method writing plot series values.
986
     *
987
     * @param int $val value for idx (default: 3)
988
     * @param string $fillColor hex color (default: FF9900)
989
     */
990 3
    private function writePlotSeriesValuesElement(XMLWriter $objWriter, $val = 3, $fillColor = 'FF9900'): void
991
    {
992 3
        $objWriter->startElement('c:dPt');
993 3
        $objWriter->startElement('c:idx');
994 3
        $objWriter->writeAttribute('val', $val);
995 3
        $objWriter->endElement();
996
997 3
        $objWriter->startElement('c:bubble3D');
998 3
        $objWriter->writeAttribute('val', 0);
999 3
        $objWriter->endElement();
1000
1001 3
        $objWriter->startElement('c:spPr');
1002 3
        $objWriter->startElement('a:solidFill');
1003 3
        $objWriter->startElement('a:srgbClr');
1004 3
        $objWriter->writeAttribute('val', $fillColor);
1005 3
        $objWriter->endElement();
1006 3
        $objWriter->endElement();
1007 3
        $objWriter->endElement();
1008 3
        $objWriter->endElement();
1009 3
    }
1010
1011
    /**
1012
     * Write Plot Group (series of related plots).
1013
     *
1014
     * @param string $groupType Type of plot for dataseries
1015
     * @param bool $catIsMultiLevelSeries Is category a multi-series category
1016
     * @param bool $valIsMultiLevelSeries Is value set a multi-series set
1017
     * @param string $plotGroupingType Type of grouping for multi-series values
1018
     */
1019 17
    private function writePlotGroup(?DataSeries $plotGroup, $groupType, XMLWriter $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType): void
1020
    {
1021 17
        if ($plotGroup === null) {
1022
            return;
1023
        }
1024
1025 17
        if (($groupType == DataSeries::TYPE_BARCHART) || ($groupType == DataSeries::TYPE_BARCHART_3D)) {
1026 8
            $objWriter->startElement('c:barDir');
1027 8
            $objWriter->writeAttribute('val', $plotGroup->getPlotDirection());
1028 8
            $objWriter->endElement();
1029
        }
1030
1031 17
        if ($plotGroup->getPlotGrouping() !== null) {
0 ignored issues
show
introduced by
The condition $plotGroup->getPlotGrouping() !== null is always true.
Loading history...
1032 12
            $plotGroupingType = $plotGroup->getPlotGrouping();
1033 12
            $objWriter->startElement('c:grouping');
1034 12
            $objWriter->writeAttribute('val', $plotGroupingType);
1035 12
            $objWriter->endElement();
1036
        }
1037
1038
        //    Get these details before the loop, because we can use the count to check for varyColors
1039 17
        $plotSeriesOrder = $plotGroup->getPlotOrder();
1040 17
        $plotSeriesCount = count($plotSeriesOrder);
1041
1042 17
        if (($groupType !== DataSeries::TYPE_RADARCHART) && ($groupType !== DataSeries::TYPE_STOCKCHART)) {
1043 15
            if ($groupType !== DataSeries::TYPE_LINECHART) {
1044 12
                if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) {
1045 11
                    $objWriter->startElement('c:varyColors');
1046 11
                    $objWriter->writeAttribute('val', 1);
1047 11
                    $objWriter->endElement();
1048
                } else {
1049 2
                    $objWriter->startElement('c:varyColors');
1050 2
                    $objWriter->writeAttribute('val', 0);
1051 2
                    $objWriter->endElement();
1052
                }
1053
            }
1054
        }
1055
1056 17
        $plotSeriesIdx = 0;
1057 17
        foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
1058 17
            $objWriter->startElement('c:ser');
1059
1060 17
            $plotLabel = $plotGroup->getPlotLabelByIndex($plotSeriesIdx);
1061 17
            if ($plotLabel && $groupType !== DataSeries::TYPE_LINECHART) {
1062 14
                $fillColor = $plotLabel->getFillColor();
1063 14
                if ($fillColor !== null && !is_array($fillColor)) {
1064
                    $objWriter->startElement('c:spPr');
1065
                    $objWriter->startElement('a:solidFill');
1066
                    $objWriter->startElement('a:srgbClr');
1067
                    $objWriter->writeAttribute('val', $fillColor);
1068
                    $objWriter->endElement();
1069
                    $objWriter->endElement();
1070
                    $objWriter->endElement();
1071
                }
1072
            }
1073
1074 17
            $objWriter->startElement('c:idx');
1075 17
            $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesIdx);
1076 17
            $objWriter->endElement();
1077
1078 17
            $objWriter->startElement('c:order');
1079 17
            $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesRef);
1080 17
            $objWriter->endElement();
1081
1082
            //    Values
1083 17
            $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef);
1084
1085 17
            if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) {
1086 3
                $fillColorValues = $plotSeriesValues->getFillColor();
1087 3
                if ($fillColorValues !== null && is_array($fillColorValues)) {
1088 1
                    foreach ($plotSeriesValues->getDataValues() as $dataKey => $dataValue) {
1089 1
                        $this->writePlotSeriesValuesElement($objWriter, $dataKey, ($fillColorValues[$dataKey] ?? 'FF9900'));
1090
                    }
1091
                } else {
1092 2
                    $this->writePlotSeriesValuesElement($objWriter);
1093
                }
1094
            }
1095
1096
            //    Labels
1097 17
            $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef);
1098 17
            if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) {
1099 17
                $objWriter->startElement('c:tx');
1100 17
                $objWriter->startElement('c:strRef');
1101 17
                $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter);
1102 17
                $objWriter->endElement();
1103 17
                $objWriter->endElement();
1104
            }
1105
1106
            //    Formatting for the points
1107 17
            if (($groupType == DataSeries::TYPE_LINECHART) || ($groupType == DataSeries::TYPE_STOCKCHART)) {
1108 6
                $plotLineWidth = 12700;
1109 6
                if ($plotSeriesValues) {
1110 6
                    $plotLineWidth = $plotSeriesValues->getLineWidth();
1111
                }
1112
1113 6
                $objWriter->startElement('c:spPr');
1114 6
                $objWriter->startElement('a:ln');
1115 6
                $objWriter->writeAttribute('w', $plotLineWidth);
1116 6
                if ($groupType == DataSeries::TYPE_STOCKCHART) {
1117 2
                    $objWriter->startElement('a:noFill');
1118 2
                    $objWriter->endElement();
1119 5
                } elseif ($plotLabel) {
1120 5
                    $fillColor = $plotLabel->getFillColor();
1121 5
                    if (is_string($fillColor)) {
1122 1
                        $objWriter->startElement('a:solidFill');
1123 1
                        $objWriter->startElement('a:srgbClr');
1124 1
                        $objWriter->writeAttribute('val', $fillColor);
1125 1
                        $objWriter->endElement();
1126 1
                        $objWriter->endElement();
1127
                    }
1128
                }
1129 6
                $objWriter->endElement();
1130 6
                $objWriter->endElement();
1131
            }
1132
1133 17
            if ($plotSeriesValues) {
1134 17
                $plotSeriesMarker = $plotSeriesValues->getPointMarker();
1135 17
                if ($plotSeriesMarker) {
1136 1
                    $objWriter->startElement('c:marker');
1137 1
                    $objWriter->startElement('c:symbol');
1138 1
                    $objWriter->writeAttribute('val', $plotSeriesMarker);
1139 1
                    $objWriter->endElement();
1140
1141 1
                    if ($plotSeriesMarker !== 'none') {
1142 1
                        $objWriter->startElement('c:size');
1143 1
                        $objWriter->writeAttribute('val', 3);
1144 1
                        $objWriter->endElement();
1145
                    }
1146
1147 1
                    $objWriter->endElement();
1148
                }
1149
            }
1150
1151 17
            if (($groupType === DataSeries::TYPE_BARCHART) || ($groupType === DataSeries::TYPE_BARCHART_3D) || ($groupType === DataSeries::TYPE_BUBBLECHART)) {
1152 8
                $objWriter->startElement('c:invertIfNegative');
1153 8
                $objWriter->writeAttribute('val', 0);
1154 8
                $objWriter->endElement();
1155
            }
1156
1157
            //    Category Labels
1158 17
            $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef);
1159 17
            if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) {
1160 15
                $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
1161
1162 15
                if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) {
1163 3
                    if ($plotGroup->getPlotStyle() !== null) {
1164 1
                        $plotStyle = $plotGroup->getPlotStyle();
1165 1
                        if ($plotStyle) {
1166 1
                            $objWriter->startElement('c:explosion');
1167 1
                            $objWriter->writeAttribute('val', 25);
1168 1
                            $objWriter->endElement();
1169
                        }
1170
                    }
1171
                }
1172
1173 15
                if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) {
1174 2
                    $objWriter->startElement('c:xVal');
1175
                } else {
1176 14
                    $objWriter->startElement('c:cat');
1177
                }
1178
1179 15
                $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str');
1180 15
                $objWriter->endElement();
1181
            }
1182
1183
            //    Values
1184 17
            if ($plotSeriesValues) {
1185 17
                $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries();
1186
1187 17
                if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) {
1188 2
                    $objWriter->startElement('c:yVal');
1189
                } else {
1190 16
                    $objWriter->startElement('c:val');
1191
                }
1192
1193 17
                $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num');
1194 17
                $objWriter->endElement();
1195
            }
1196
1197 17
            if ($groupType === DataSeries::TYPE_BUBBLECHART) {
1198 1
                $this->writeBubbles($plotSeriesValues, $objWriter);
1 ignored issue
show
Bug introduced by
It seems like $plotSeriesValues can also be of type false; however, parameter $plotSeriesValues of PhpOffice\PhpSpreadsheet...x\Chart::writeBubbles() does only seem to accept PhpOffice\PhpSpreadsheet...t\DataSeriesValues|null, 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

1198
                $this->writeBubbles(/** @scrutinizer ignore-type */ $plotSeriesValues, $objWriter);
Loading history...
1199
            }
1200
1201 17
            $objWriter->endElement();
1202
        }
1203
1204 17
        $this->seriesIndex += $plotSeriesIdx + 1;
1205 17
    }
1206
1207
    /**
1208
     * Write Plot Series Label.
1209
     */
1210 17
    private function writePlotSeriesLabel(?DataSeriesValues $plotSeriesLabel, XMLWriter $objWriter): void
1211
    {
1212 17
        if ($plotSeriesLabel === null) {
1213
            return;
1214
        }
1215
1216 17
        $objWriter->startElement('c:f');
1217 17
        $objWriter->writeRawData($plotSeriesLabel->getDataSource());
1218 17
        $objWriter->endElement();
1219
1220 17
        $objWriter->startElement('c:strCache');
1221 17
        $objWriter->startElement('c:ptCount');
1222 17
        $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount());
1223 17
        $objWriter->endElement();
1224
1225 17
        foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) {
1226 17
            $objWriter->startElement('c:pt');
1227 17
            $objWriter->writeAttribute('idx', $plotLabelKey);
1228
1229 17
            $objWriter->startElement('c:v');
1230 17
            $objWriter->writeRawData($plotLabelValue);
1231 17
            $objWriter->endElement();
1232 17
            $objWriter->endElement();
1233
        }
1234 17
        $objWriter->endElement();
1235 17
    }
1236
1237
    /**
1238
     * Write Plot Series Values.
1239
     *
1240
     * @param string $groupType Type of plot for dataseries
1241
     * @param string $dataType Datatype of series values
1242
     */
1243 17
    private function writePlotSeriesValues(?DataSeriesValues $plotSeriesValues, XMLWriter $objWriter, $groupType, $dataType = 'str'): void
1244
    {
1245 17
        if ($plotSeriesValues === null) {
1246
            return;
1247
        }
1248
1249 17
        if ($plotSeriesValues->isMultiLevelSeries()) {
1250 2
            $levelCount = $plotSeriesValues->multiLevelCount();
1251
1252 2
            $objWriter->startElement('c:multiLvlStrRef');
1253
1254 2
            $objWriter->startElement('c:f');
1255 2
            $objWriter->writeRawData($plotSeriesValues->getDataSource());
1256 2
            $objWriter->endElement();
1257
1258 2
            $objWriter->startElement('c:multiLvlStrCache');
1259
1260 2
            $objWriter->startElement('c:ptCount');
1261 2
            $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1262 2
            $objWriter->endElement();
1263
1264 2
            for ($level = 0; $level < $levelCount; ++$level) {
1265 2
                $objWriter->startElement('c:lvl');
1266
1267 2
                foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
1268 2
                    if (isset($plotSeriesValue[$level])) {
1269 2
                        $objWriter->startElement('c:pt');
1270 2
                        $objWriter->writeAttribute('idx', $plotSeriesKey);
1271
1272 2
                        $objWriter->startElement('c:v');
1273 2
                        $objWriter->writeRawData($plotSeriesValue[$level]);
1274 2
                        $objWriter->endElement();
1275 2
                        $objWriter->endElement();
1276
                    }
1277
                }
1278
1279 2
                $objWriter->endElement();
1280
            }
1281
1282 2
            $objWriter->endElement();
1283
1284 2
            $objWriter->endElement();
1285
        } else {
1286 17
            $objWriter->startElement('c:' . $dataType . 'Ref');
1287
1288 17
            $objWriter->startElement('c:f');
1289 17
            $objWriter->writeRawData($plotSeriesValues->getDataSource());
1290 17
            $objWriter->endElement();
1291
1292 17
            $objWriter->startElement('c:' . $dataType . 'Cache');
1293
1294 17
            if (($groupType != DataSeries::TYPE_PIECHART) && ($groupType != DataSeries::TYPE_PIECHART_3D) && ($groupType != DataSeries::TYPE_DONUTCHART)) {
1295 15
                if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) {
1296 1
                    $objWriter->startElement('c:formatCode');
1297 1
                    $objWriter->writeRawData($plotSeriesValues->getFormatCode());
1298 1
                    $objWriter->endElement();
1299
                }
1300
            }
1301
1302 17
            $objWriter->startElement('c:ptCount');
1303 17
            $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1304 17
            $objWriter->endElement();
1305
1306 17
            $dataValues = $plotSeriesValues->getDataValues();
1307 17
            if (!empty($dataValues)) {
1308 17
                if (is_array($dataValues)) {
0 ignored issues
show
introduced by
The condition is_array($dataValues) is always true.
Loading history...
1309 17
                    foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {
1310 17
                        $objWriter->startElement('c:pt');
1311 17
                        $objWriter->writeAttribute('idx', $plotSeriesKey);
1312
1313 17
                        $objWriter->startElement('c:v');
1314 17
                        $objWriter->writeRawData($plotSeriesValue);
1315 17
                        $objWriter->endElement();
1316 17
                        $objWriter->endElement();
1317
                    }
1318
                }
1319
            }
1320
1321 17
            $objWriter->endElement();
1322
1323 17
            $objWriter->endElement();
1324
        }
1325 17
    }
1326
1327
    /**
1328
     * Write Bubble Chart Details.
1329
     */
1330 1
    private function writeBubbles(?DataSeriesValues $plotSeriesValues, XMLWriter $objWriter): void
1331
    {
1332 1
        if ($plotSeriesValues === null) {
1333
            return;
1334
        }
1335
1336 1
        $objWriter->startElement('c:bubbleSize');
1337 1
        $objWriter->startElement('c:numLit');
1338
1339 1
        $objWriter->startElement('c:formatCode');
1340 1
        $objWriter->writeRawData('General');
1341 1
        $objWriter->endElement();
1342
1343 1
        $objWriter->startElement('c:ptCount');
1344 1
        $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1345 1
        $objWriter->endElement();
1346
1347 1
        $dataValues = $plotSeriesValues->getDataValues();
1348 1
        if (!empty($dataValues)) {
1349 1
            if (is_array($dataValues)) {
0 ignored issues
show
introduced by
The condition is_array($dataValues) is always true.
Loading history...
1350 1
                foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {
1351 1
                    $objWriter->startElement('c:pt');
1352 1
                    $objWriter->writeAttribute('idx', $plotSeriesKey);
1353 1
                    $objWriter->startElement('c:v');
1354 1
                    $objWriter->writeRawData(1);
1355 1
                    $objWriter->endElement();
1356 1
                    $objWriter->endElement();
1357
                }
1358
            }
1359
        }
1360
1361 1
        $objWriter->endElement();
1362 1
        $objWriter->endElement();
1363
1364 1
        $objWriter->startElement('c:bubble3D');
1365 1
        $objWriter->writeAttribute('val', 0);
1366 1
        $objWriter->endElement();
1367 1
    }
1368
1369
    /**
1370
     * Write Layout.
1371
     */
1372 17
    private function writeLayout(XMLWriter $objWriter, ?Layout $layout = null): void
1373
    {
1374 17
        $objWriter->startElement('c:layout');
1375
1376 17
        if ($layout !== null) {
1377 5
            $objWriter->startElement('c:manualLayout');
1378
1379 5
            $layoutTarget = $layout->getLayoutTarget();
1380 5
            if ($layoutTarget !== null) {
0 ignored issues
show
introduced by
The condition $layoutTarget !== null is always true.
Loading history...
1381 1
                $objWriter->startElement('c:layoutTarget');
1382 1
                $objWriter->writeAttribute('val', $layoutTarget);
1383 1
                $objWriter->endElement();
1384
            }
1385
1386 5
            $xMode = $layout->getXMode();
1387 5
            if ($xMode !== null) {
0 ignored issues
show
introduced by
The condition $xMode !== null is always true.
Loading history...
1388 1
                $objWriter->startElement('c:xMode');
1389 1
                $objWriter->writeAttribute('val', $xMode);
1390 1
                $objWriter->endElement();
1391
            }
1392
1393 5
            $yMode = $layout->getYMode();
1394 5
            if ($yMode !== null) {
0 ignored issues
show
introduced by
The condition $yMode !== null is always true.
Loading history...
1395 1
                $objWriter->startElement('c:yMode');
1396 1
                $objWriter->writeAttribute('val', $yMode);
1397 1
                $objWriter->endElement();
1398
            }
1399
1400 5
            $x = $layout->getXPosition();
1401 5
            if ($x !== null) {
0 ignored issues
show
introduced by
The condition $x !== null is always true.
Loading history...
1402 1
                $objWriter->startElement('c:x');
1403 1
                $objWriter->writeAttribute('val', $x);
1404 1
                $objWriter->endElement();
1405
            }
1406
1407 5
            $y = $layout->getYPosition();
1408 5
            if ($y !== null) {
0 ignored issues
show
introduced by
The condition $y !== null is always true.
Loading history...
1409 1
                $objWriter->startElement('c:y');
1410 1
                $objWriter->writeAttribute('val', $y);
1411 1
                $objWriter->endElement();
1412
            }
1413
1414 5
            $w = $layout->getWidth();
1415 5
            if ($w !== null) {
0 ignored issues
show
introduced by
The condition $w !== null is always true.
Loading history...
1416 1
                $objWriter->startElement('c:w');
1417 1
                $objWriter->writeAttribute('val', $w);
1418 1
                $objWriter->endElement();
1419
            }
1420
1421 5
            $h = $layout->getHeight();
1422 5
            if ($h !== null) {
0 ignored issues
show
introduced by
The condition $h !== null is always true.
Loading history...
1423 1
                $objWriter->startElement('c:h');
1424 1
                $objWriter->writeAttribute('val', $h);
1425 1
                $objWriter->endElement();
1426
            }
1427
1428 5
            $objWriter->endElement();
1429
        }
1430
1431 17
        $objWriter->endElement();
1432 17
    }
1433
1434
    /**
1435
     * Write Alternate Content block.
1436
     */
1437 17
    private function writeAlternateContent(XMLWriter $objWriter): void
1438
    {
1439 17
        $objWriter->startElement('mc:AlternateContent');
1440 17
        $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
1441
1442 17
        $objWriter->startElement('mc:Choice');
1443 17
        $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart');
1444 17
        $objWriter->writeAttribute('Requires', 'c14');
1445
1446 17
        $objWriter->startElement('c14:style');
1447 17
        $objWriter->writeAttribute('val', '102');
1448 17
        $objWriter->endElement();
1449 17
        $objWriter->endElement();
1450
1451 17
        $objWriter->startElement('mc:Fallback');
1452 17
        $objWriter->startElement('c:style');
1453 17
        $objWriter->writeAttribute('val', '2');
1454 17
        $objWriter->endElement();
1455 17
        $objWriter->endElement();
1456
1457 17
        $objWriter->endElement();
1458 17
    }
1459
1460
    /**
1461
     * Write Printer Settings.
1462
     */
1463 17
    private function writePrintSettings(XMLWriter $objWriter): void
1464
    {
1465 17
        $objWriter->startElement('c:printSettings');
1466
1467 17
        $objWriter->startElement('c:headerFooter');
1468 17
        $objWriter->endElement();
1469
1470 17
        $objWriter->startElement('c:pageMargins');
1471 17
        $objWriter->writeAttribute('footer', 0.3);
1472 17
        $objWriter->writeAttribute('header', 0.3);
1473 17
        $objWriter->writeAttribute('r', 0.7);
1474 17
        $objWriter->writeAttribute('l', 0.7);
1475 17
        $objWriter->writeAttribute('t', 0.75);
1476 17
        $objWriter->writeAttribute('b', 0.75);
1477 17
        $objWriter->endElement();
1478
1479 17
        $objWriter->startElement('c:pageSetup');
1480 17
        $objWriter->writeAttribute('orientation', 'portrait');
1481 17
        $objWriter->endElement();
1482
1483 17
        $objWriter->endElement();
1484 17
    }
1485
}
1486