Completed
Push — develop ( bd86d7...a84e72 )
by Franck
15s
created

PptCharts::writeLayout()   B

Complexity

Conditions 5
Paths 16

Size

Total Lines 48
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 5.3906

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 48
ccs 24
cts 32
cp 0.75
rs 8.551
cc 5
eloc 27
nc 16
nop 2
crap 5.3906
1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\XMLWriter;
7
use PhpOffice\PhpPresentation\PhpPresentation;
8
use PhpOffice\PhpPresentation\Shape\Chart;
9
use PhpOffice\PhpPresentation\Shape\Chart\Gridlines;
10
use PhpOffice\PhpPresentation\Shape\Chart\Legend;
11
use PhpOffice\PhpPresentation\Shape\Chart\PlotArea;
12
use PhpOffice\PhpPresentation\Shape\Chart\Title;
13
use PhpOffice\PhpPresentation\Shape\Chart\Type\Area;
14
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar;
15
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D;
16
use PhpOffice\PhpPresentation\Shape\Chart\Type\Line;
17
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie;
18
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D;
19
use PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter;
20
use PhpOffice\PhpPresentation\Style\Border;
21
use PhpOffice\PhpPresentation\Style\Fill;
22
23
class PptCharts extends AbstractDecoratorWriter
24
{
25
    /**
26
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
27
     * @throws \Exception
28
     */
29 95
    public function render()
30
    {
31 95
        for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
32 33
            $shape = $this->getDrawingHashTable()->getByIndex($i);
33 33
            if ($shape instanceof Chart) {
34 25
                $this->getZip()->addFromString('ppt/charts/' . $shape->getIndexedFilename(), $this->writeChart($shape));
35
36
                // Chart relations?
37 24
                if ($shape->hasIncludedSpreadsheet()) {
38
                    $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape));
39
                    $pFilename = 'PHPExcel';
40
                    $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx'));
41
                }
42 24
            }
43 32
        }
44 94
        return $this->getZip();
45
    }
46
47
48
    /**
49
     * Write chart to XML format
50
     *
51
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
52
     * @return string                    XML Output
53
     * @throws \Exception
54
     */
55 25
    public function writeChart(Chart $chart)
56
    {
57
        // Create XML writer
58 25
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
59
60
        // XML header
61 25
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
62
63
        // c:chartSpace
64 25
        $objWriter->startElement('c:chartSpace');
65 25
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
66 25
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
67 25
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
68
69
        // c:date1904
70 25
        $objWriter->startElement('c:date1904');
71 25
        $objWriter->writeAttribute('val', '1');
72 25
        $objWriter->endElement();
73
74
        // c:lang
75 25
        $objWriter->startElement('c:lang');
76 25
        $objWriter->writeAttribute('val', 'en-US');
77 25
        $objWriter->endElement();
78
79
        // c:chart
80 25
        $objWriter->startElement('c:chart');
81
82
        // Title?
83 25
        if ($chart->getTitle()->isVisible()) {
84
            // Write title
85 25
            $this->writeTitle($objWriter, $chart->getTitle());
86 25
        }
87
88
        // c:autoTitleDeleted
89 25
        $objWriter->startElement('c:autoTitleDeleted');
90 25
        $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1');
91 25
        $objWriter->endElement();
92
93
        // c:view3D
94 25
        $objWriter->startElement('c:view3D');
95
96
        // c:rotX
97 25
        $objWriter->startElement('c:rotX');
98 25
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
99 25
        $objWriter->endElement();
100
101
        // c:hPercent
102 25
        $objWriter->startElement('c:hPercent');
103 25
        $objWriter->writeAttribute('val', $chart->getView3D()->getHeightPercent());
104 25
        $objWriter->endElement();
105
106
        // c:rotY
107 25
        $objWriter->startElement('c:rotY');
108 25
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
109 25
        $objWriter->endElement();
110
111
        // c:depthPercent
112 25
        $objWriter->startElement('c:depthPercent');
113 25
        $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
114 25
        $objWriter->endElement();
115
116
        // c:rAngAx
117 25
        $objWriter->startElement('c:rAngAx');
118 25
        $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
119 25
        $objWriter->endElement();
120
121
        // c:perspective
122 25
        $objWriter->startElement('c:perspective');
123 25
        $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
124 25
        $objWriter->endElement();
125
126 25
        $objWriter->endElement();
127
128
        // Write plot area
129 25
        $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart);
130
131
        // Legend?
132 24
        if ($chart->getLegend()->isVisible()) {
133
            // Write legend
134 24
            $this->writeLegend($objWriter, $chart->getLegend());
135 24
        }
136
137
        // c:plotVisOnly
138 24
        $objWriter->startElement('c:plotVisOnly');
139 24
        $objWriter->writeAttribute('val', '1');
140 24
        $objWriter->endElement();
141
142 24
        $objWriter->endElement();
143
144
        // c:spPr
145 24
        $objWriter->startElement('c:spPr');
146
147
        // Fill
148 24
        $this->writeFill($objWriter, $chart->getFill());
149
150
        // Border
151 24
        if ($chart->getBorder()->getLineStyle() != Border::LINE_NONE) {
152
            $this->writeBorder($objWriter, $chart->getBorder(), '');
153
        }
154
155
        // Shadow
156 24
        if ($chart->getShadow()->isVisible()) {
157
            // a:effectLst
158
            $objWriter->startElement('a:effectLst');
159
160
            // a:outerShdw
161
            $objWriter->startElement('a:outerShdw');
162
            $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius()));
163
            $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance()));
164
            $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($chart->getShadow()->getDirection()));
165
            $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment());
166
            $objWriter->writeAttribute('rotWithShape', '0');
167
168
            $this->writeColor($objWriter, $chart->getShadow()->getColor(), $chart->getShadow()->getAlpha());
169
170
            $objWriter->endElement();
171
172
            $objWriter->endElement();
173
        }
174
175 24
        $objWriter->endElement();
176
177
        // External data?
178 24
        if ($chart->hasIncludedSpreadsheet()) {
179
            // c:externalData
180
            $objWriter->startElement('c:externalData');
181
            $objWriter->writeAttribute('r:id', 'rId1');
182
183
            // c:autoUpdate
184
            $objWriter->startElement('c:autoUpdate');
185
            $objWriter->writeAttribute('val', '0');
186
            $objWriter->endElement();
187
188
            $objWriter->endElement();
189
        }
190
191 24
        $objWriter->endElement();
192
193
        // Return
194 24
        return $objWriter->getData();
195
    }
196
197
    /**
198
     * Write chart to XML format
199
     *
200
     * @param  PhpPresentation             $presentation
201
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
202
     * @param  string                    $tempName
203
     * @return string                    String output
204
     * @throws \Exception
205
     */
206
    public function writeSpreadsheet(PhpPresentation $presentation, $chart, $tempName)
207
    {
208
        // Need output?
209
        if (!$chart->hasIncludedSpreadsheet()) {
210
            throw new \Exception('No spreadsheet output is required for the given chart.');
211
        }
212
213
        // Verify PHPExcel
214
        if (!class_exists('PHPExcel')) {
215
            throw new \Exception('PHPExcel has not been loaded. Include PHPExcel.php in your script, e.g. require_once \'PHPExcel.php\'.');
216
        }
217
218
        // Create new spreadsheet
219
        $workbook = new \PHPExcel();
220
221
        // Set properties
222
        $title = $chart->getTitle()->getText();
223
        if (strlen($title) == 0) {
224
            $title = 'Chart';
225
        }
226
        $workbook->getProperties()->setCreator($presentation->getProperties()->getCreator())->setLastModifiedBy($presentation->getProperties()->getLastModifiedBy())->setTitle($title);
0 ignored issues
show
Deprecated Code introduced by
The method PhpOffice\PhpPresentatio...tation::getProperties() has been deprecated with message: for getDocumentProperties

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
227
228
        // Add chart data
229
        $sheet = $workbook->setActiveSheetIndex(0);
230
        $sheet->setTitle('Sheet1');
231
232
        // Write series
233
        $seriesIndex = 0;
234
        foreach ($chart->getPlotArea()->getType()->getSeries() as $series) {
235
            // Title
236
            $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, 1, $series->getTitle());
237
238
            // X-axis
239
            $axisXData = array_keys($series->getValues());
240
            $numAxisXData = count($axisXData);
241
            for ($i = 0; $i < $numAxisXData; $i++) {
242
                $sheet->setCellValueByColumnAndRow(0, $i + 2, $axisXData[$i]);
243
            }
244
245
            // Y-axis
246
            $axisYData = array_values($series->getValues());
247
            $numAxisYData = count($axisYData);
248
            for ($i = 0; $i < $numAxisYData; $i++) {
249
                $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, $i + 2, $axisYData[$i]);
250
            }
251
252
            ++$seriesIndex;
253
        }
254
255
        // Save to string
256
        $writer = \PHPExcel_IOFactory::createWriter($workbook, 'Excel2007');
257
        $writer->save($tempName);
258
259
        // Load file in memory
260
        $returnValue = file_get_contents($tempName);
261
        if (@unlink($tempName) === false) {
262
            throw new \Exception('The file '.$tempName.' could not removed.');
263
        }
264
265
        return $returnValue;
266
    }
267
268
    /**
269
     * Write element with value attribute
270
     *
271
     * @param \PhpOffice\Common\XMLWriter $objWriter   XML Writer
272
     * @param string                         $elementName
273
     * @param string                         $value
274
     */
275 23
    protected function writeElementWithValAttribute($objWriter, $elementName, $value)
276
    {
277 23
        $objWriter->startElement($elementName);
278 23
        $objWriter->writeAttribute('val', $value);
279 23
        $objWriter->endElement();
280 23
    }
281
282
    /**
283
     * Write single value or reference
284
     *
285
     * @param \PhpOffice\Common\XMLWriter $objWriter   XML Writer
286
     * @param boolean                        $isReference
287
     * @param mixed                          $value
288
     * @param string                         $reference
289
     */
290 23
    protected function writeSingleValueOrReference($objWriter, $isReference, $value, $reference)
291
    {
292 23
        if (!$isReference) {
293
            // Value
294 23
            $objWriter->writeElement('c:v', $value);
295 23
        } else {
296
            // Reference and cache
297
            $objWriter->startElement('c:strRef');
298
            $objWriter->writeElement('c:f', $reference);
299
            $objWriter->startElement('c:strCache');
300
            $objWriter->startElement('c:ptCount');
301
            $objWriter->writeAttribute('val', '1');
302
            $objWriter->endElement();
303
304
            $objWriter->startElement('c:pt');
305
            $objWriter->writeAttribute('idx', '0');
306
            $objWriter->writeElement('c:v', $value);
307
            $objWriter->endElement();
308
            $objWriter->endElement();
309
            $objWriter->endElement();
310
        }
311 23
    }
312
313
    /**
314
     * Write series value or reference
315
     *
316
     * @param \PhpOffice\Common\XMLWriter $objWriter   XML Writer
317
     * @param boolean                        $isReference
318
     * @param mixed                          $values
319
     * @param string                         $reference
320
     */
321 23
    protected function writeMultipleValuesOrReference($objWriter, $isReference, $values, $reference)
322
    {
323
        // c:strLit / c:numLit
324
        // c:strRef / c:numRef
325 23
        $referenceType = ($isReference ? 'Ref' : 'Lit');
326 23
        if (is_int($values[0]) || is_float($values[0])) {
327 23
            $dataType = 'num';
328 23
        } else {
329 23
            $dataType = 'str';
330
        }
331 23
        $objWriter->startElement('c:' . $dataType . $referenceType);
332
333 23
        $numValues = count($values);
334 23
        if (!$isReference) {
335
            // Value
336
337
            // c:ptCount
338 23
            $objWriter->startElement('c:ptCount');
339 23
            $objWriter->writeAttribute('val', count($values));
340 23
            $objWriter->endElement();
341
342
            // Add points
343 23
            for ($i = 0; $i < $numValues; $i++) {
344
                // c:pt
345 23
                $objWriter->startElement('c:pt');
346 23
                $objWriter->writeAttribute('idx', $i);
347 23
                $objWriter->writeElement('c:v', $values[$i]);
348 23
                $objWriter->endElement();
349 23
            }
350 23
        } else {
351
            // Reference
352
            $objWriter->writeElement('c:f', $reference);
353
            $objWriter->startElement('c:' . $dataType . 'Cache');
354
355
            // c:ptCount
356
            $objWriter->startElement('c:ptCount');
357
            $objWriter->writeAttribute('val', count($values));
358
            $objWriter->endElement();
359
360
            // Add points
361
            for ($i = 0; $i < $numValues; $i++) {
362
                // c:pt
363
                $objWriter->startElement('c:pt');
364
                $objWriter->writeAttribute('idx', $i);
365
                $objWriter->writeElement('c:v', $values[$i]);
366
                $objWriter->endElement();
367
            }
368
369
            $objWriter->endElement();
370
        }
371
372 23
        $objWriter->endElement();
373 23
    }
374
375
    /**
376
     * Write Title
377
     *
378
     * @param  \PhpOffice\Common\XMLWriter  $objWriter XML Writer
379
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Title $subject
380
     * @throws \Exception
381
     */
382 25
    protected function writeTitle(XMLWriter $objWriter, Title $subject)
383
    {
384
        // c:title
385 25
        $objWriter->startElement('c:title');
386
387
        // c:tx
388 25
        $objWriter->startElement('c:tx');
389
390
        // c:rich
391 25
        $objWriter->startElement('c:rich');
392
393
        // a:bodyPr
394 25
        $objWriter->writeElement('a:bodyPr', null);
395
396
        // a:lstStyle
397 25
        $objWriter->writeElement('a:lstStyle', null);
398
399
        // a:p
400 25
        $objWriter->startElement('a:p');
401
402
        // a:pPr
403 25
        $objWriter->startElement('a:pPr');
404 25
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
405 25
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
406 25
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
407 25
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
408 25
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
409 25
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
410
411
        // a:defRPr
412 25
        $objWriter->writeElement('a:defRPr', null);
413
414 25
        $objWriter->endElement();
415
416
        // a:r
417 25
        $objWriter->startElement('a:r');
418
419
        // a:rPr
420 25
        $objWriter->startElement('a:rPr');
421 25
        $objWriter->writeAttribute('lang', 'en-US');
422 25
        $objWriter->writeAttribute('dirty', '0');
423
424 25
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
425 25
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
426 25
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
427 25
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
428 25
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
429
430 25
        if ($subject->getFont()->isSuperScript() || $subject->getFont()->isSubScript()) {
431
            if ($subject->getFont()->isSuperScript()) {
432
                $objWriter->writeAttribute('baseline', '30000');
433
            } elseif ($subject->getFont()->isSubScript()) {
434
                $objWriter->writeAttribute('baseline', '-25000');
435
            }
436
        }
437
438
        // Font - a:solidFill
439 25
        $objWriter->startElement('a:solidFill');
440
441 25
        $this->writeColor($objWriter, $subject->getFont()->getColor());
442
443 25
        $objWriter->endElement();
444
445
        // Font - a:latin
446 25
        $objWriter->startElement('a:latin');
447 25
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
448 25
        $objWriter->endElement();
449
450 25
        $objWriter->endElement();
451
452
        // a:t
453 25
        $objWriter->writeElement('a:t', $subject->getText());
454
455 25
        $objWriter->endElement();
456
457
        // a:endParaRPr
458 25
        $objWriter->startElement('a:endParaRPr');
459 25
        $objWriter->writeAttribute('lang', 'en-US');
460 25
        $objWriter->writeAttribute('dirty', '0');
461 25
        $objWriter->endElement();
462
463 25
        $objWriter->endElement();
464
465 25
        $objWriter->endElement();
466
467 25
        $objWriter->endElement();
468
469
        // Write layout
470 25
        $this->writeLayout($objWriter, $subject);
471
472
        // c:overlay
473 25
        $objWriter->startElement('c:overlay');
474 25
        $objWriter->writeAttribute('val', '0');
475 25
        $objWriter->endElement();
476
477 25
        $objWriter->endElement();
478 25
    }
479
480
    /**
481
     * Write Plot Area
482
     *
483
     * @param  \PhpOffice\Common\XMLWriter     $objWriter XML Writer
484
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\PlotArea $subject
485
     * @param  \PhpOffice\PhpPresentation\Shape\Chart          $chart
486
     * @throws \Exception
487
     */
488 25
    protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart)
489
    {
490
        // c:plotArea
491 25
        $objWriter->startElement('c:plotArea');
492
493
        // Write layout
494 25
        $this->writeLayout($objWriter, $subject);
495
496
        // Write chart
497 25
        $chartType = $subject->getType();
498 25
        if ($chartType instanceof Area) {
499 1
            $this->writeTypeArea($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
500 25
        } elseif ($chartType instanceof Bar) {
501 2
            $this->writeTypeBar($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
502 24
        } elseif ($chartType instanceof Bar3D) {
503 4
            $this->writeTypeBar3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
504 22
        } elseif ($chartType instanceof Pie) {
505 1
            $this->writeTypePie($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
506 18
        } elseif ($chartType instanceof Pie3D) {
507 4
            $this->writeTypePie3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
508 17
        } elseif ($chartType instanceof Line) {
509 7
            $this->writeTypeLine($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
510 13
        } elseif ($chartType instanceof Scatter) {
511 5
            $this->writeTypeScatter($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
512 5
        } else {
513 1
            throw new \Exception('The chart type provided could not be rendered.');
514
        }
515
516
        // Write X axis?
517 24
        if ($chartType->hasAxisX()) {
518 19
            $this->writeAxis($objWriter, $subject->getAxisX(), Chart\Axis::AXIS_X);
519 19
        }
520
521
        // Write Y axis?
522 24
        if ($chartType->hasAxisY()) {
523 19
            $this->writeAxis($objWriter, $subject->getAxisY(), Chart\Axis::AXIS_Y);
524 19
        }
525
526 24
        $objWriter->endElement();
527 24
    }
528
529
    /**
530
     * Write Legend
531
     *
532
     * @param  \PhpOffice\Common\XMLWriter   $objWriter XML Writer
533
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Legend $subject
534
     * @throws \Exception
535
     */
536 24
    protected function writeLegend(XMLWriter $objWriter, Legend $subject)
537
    {
538
        // c:legend
539 24
        $objWriter->startElement('c:legend');
540
541
        // c:legendPos
542 24
        $objWriter->startElement('c:legendPos');
543 24
        $objWriter->writeAttribute('val', $subject->getPosition());
544 24
        $objWriter->endElement();
545
546
        // Write layout
547 24
        $this->writeLayout($objWriter, $subject);
548
549
        // c:overlay
550 24
        $objWriter->startElement('c:overlay');
551 24
        $objWriter->writeAttribute('val', '0');
552 24
        $objWriter->endElement();
553
554
        // c:spPr
555 24
        $objWriter->startElement('c:spPr');
556
557
        // Fill
558 24
        $this->writeFill($objWriter, $subject->getFill());
559
560
        // Border
561 24
        if ($subject->getBorder()->getLineStyle() != Border::LINE_NONE) {
562 24
            $this->writeBorder($objWriter, $subject->getBorder(), '');
563 24
        }
564
565 24
        $objWriter->endElement();
566
567
        // c:txPr
568 24
        $objWriter->startElement('c:txPr');
569
570
        // a:bodyPr
571 24
        $objWriter->writeElement('a:bodyPr', null);
572
573
        // a:lstStyle
574 24
        $objWriter->writeElement('a:lstStyle', null);
575
576
        // a:p
577 24
        $objWriter->startElement('a:p');
578
579
        // a:pPr
580 24
        $objWriter->startElement('a:pPr');
581 24
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
582 24
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
583 24
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
584 24
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
585 24
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
586 24
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
587
588
        // a:defRPr
589 24
        $objWriter->startElement('a:defRPr');
590
591 24
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
592 24
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
593 24
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
594 24
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
595 24
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
596
597 24
        if ($subject->getFont()->isSuperScript() || $subject->getFont()->isSubScript()) {
598
            if ($subject->getFont()->isSuperScript()) {
599
                $objWriter->writeAttribute('baseline', '30000');
600
            } elseif ($subject->getFont()->isSubScript()) {
601
                $objWriter->writeAttribute('baseline', '-25000');
602
            }
603
        }
604
605
        // Font - a:solidFill
606 24
        $objWriter->startElement('a:solidFill');
607
608 24
        $this->writeColor($objWriter, $subject->getFont()->getColor());
609
610 24
        $objWriter->endElement();
611
612
        // Font - a:latin
613 24
        $objWriter->startElement('a:latin');
614 24
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
615 24
        $objWriter->endElement();
616
617 24
        $objWriter->endElement();
618
619 24
        $objWriter->endElement();
620
621
        // a:endParaRPr
622 24
        $objWriter->startElement('a:endParaRPr');
623 24
        $objWriter->writeAttribute('lang', 'en-US');
624 24
        $objWriter->writeAttribute('dirty', '0');
625 24
        $objWriter->endElement();
626
627 24
        $objWriter->endElement();
628
629 24
        $objWriter->endElement();
630
631 24
        $objWriter->endElement();
632 24
    }
633
634
    /**
635
     * Write Layout
636
     *
637
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
638
     * @param  mixed                          $subject
639
     * @throws \Exception
640
     */
641 25
    protected function writeLayout(XMLWriter $objWriter, $subject)
642
    {
643
        // c:layout
644 25
        $objWriter->startElement('c:layout');
645
646
        // c:manualLayout
647 25
        $objWriter->startElement('c:manualLayout');
648
        // c:xMode
649 25
        $objWriter->startElement('c:xMode');
650 25
        $objWriter->writeAttribute('val', 'edge');
651 25
        $objWriter->endElement();
652
653
        // c:yMode
654 25
        $objWriter->startElement('c:yMode');
655 25
        $objWriter->writeAttribute('val', 'edge');
656 25
        $objWriter->endElement();
657
658 25
        if ($subject->getOffsetX() != 0) {
659
            // c:x
660 25
            $objWriter->startElement('c:x');
661 25
            $objWriter->writeAttribute('val', $subject->getOffsetX());
662 25
            $objWriter->endElement();
663 25
        }
664
665 25
        if ($subject->getOffsetY() != 0) {
666
            // c:y
667 25
            $objWriter->startElement('c:y');
668 25
            $objWriter->writeAttribute('val', $subject->getOffsetY());
669 25
            $objWriter->endElement();
670 25
        }
671
672 25
        if ($subject->getWidth() != 0) {
673
            // c:w
674
            $objWriter->startElement('c:w');
675
            $objWriter->writeAttribute('val', $subject->getWidth());
676
            $objWriter->endElement();
677
        }
678
679 25
        if ($subject->getHeight() != 0) {
680
            // c:h
681
            $objWriter->startElement('c:h');
682
            $objWriter->writeAttribute('val', $subject->getHeight());
683
            $objWriter->endElement();
684
        }
685
686 25
        $objWriter->endElement();
687 25
        $objWriter->endElement();
688 25
    }
689
690
    /**
691
     * Write Type Area
692
     *
693
     * @param  \PhpOffice\Common\XMLWriter      $objWriter    XML Writer
694
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Area $subject
695
     * @param  boolean                             $includeSheet
696
     * @throws \Exception
697
     */
698 1
    protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSheet = false)
699
    {
700
        // c:lineChart
701 1
        $objWriter->startElement('c:areaChart');
702
703
        // c:grouping
704 1
        $objWriter->startElement('c:grouping');
705 1
        $objWriter->writeAttribute('val', 'standard');
706 1
        $objWriter->endElement();
707
708
        // Write series
709 1
        $seriesIndex = 0;
710 1
        foreach ($subject->getSeries() as $series) {
711
            // c:ser
712 1
            $objWriter->startElement('c:ser');
713
714
            // c:ser > c:idx
715 1
            $objWriter->startElement('c:idx');
716 1
            $objWriter->writeAttribute('val', $seriesIndex);
717 1
            $objWriter->endElement();
718
719
            // c:ser > c:order
720 1
            $objWriter->startElement('c:order');
721 1
            $objWriter->writeAttribute('val', $seriesIndex);
722 1
            $objWriter->endElement();
723
724
            // c:ser > c:tx
725 1
            $objWriter->startElement('c:tx');
726 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
727 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
728 1
            $objWriter->endElement();
729
730
            // c:ser > c:dLbls
731 1
            $objWriter->startElement('c:dLbls');
732
733
            // c:ser > c:dLbls > c:txPr
734 1
            $objWriter->startElement('c:txPr');
735
736
            // c:ser > c:dLbls > c:txPr > a:bodyPr
737 1
            $objWriter->writeElement('a:bodyPr', null);
738
739
            // c:ser > c:dLbls > c:txPr > a:lstStyle
740 1
            $objWriter->writeElement('a:lstStyle', null);
741
742
            // c:ser > c:dLbls > c:txPr > a:p
743 1
            $objWriter->startElement('a:p');
744
745
            // c:ser > c:dLbls > c:txPr > a:p > a:pPr
746 1
            $objWriter->startElement('a:pPr');
747
748
            // c:ser > c:dLbls > c:txPr > a:p > a:pPr > a:defRPr
749 1
            $objWriter->startElement('a:defRPr');
750
751 1
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
752 1
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
753 1
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
754 1
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
755 1
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
756
757 1
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
758
                if ($series->getFont()->isSuperScript()) {
759
                    $objWriter->writeAttribute('baseline', '30000');
760
                } elseif ($series->getFont()->isSubScript()) {
761
                    $objWriter->writeAttribute('baseline', '-25000');
762
                }
763
            }
764
765
            // c:ser > c:dLbls > c:txPr > a:p > a:pPr > a:defRPr > a:solidFill
766 1
            $objWriter->startElement('a:solidFill');
767
768 1
            $this->writeColor($objWriter, $series->getFont()->getColor());
769
770
            // c:ser > c:dLbls > c:txPr > a:p > a:pPr > a:defRPr > ## a:solidFill
771 1
            $objWriter->endElement();
772
773
            // c:ser > c:dLbls > c:txPr > a:p > a:pPr > a:defRPr > a:latin
774 1
            $objWriter->startElement('a:latin');
775 1
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
776 1
            $objWriter->endElement();
777
778
            // c:ser > c:dLbls > c:txPr > a:p > a:pPr > ##a:defRPr
779 1
            $objWriter->endElement();
780
781
            // c:ser > c:dLbls > c:txPr > a:p > ##a:pPr
782 1
            $objWriter->endElement();
783
784
            // c:ser > c:dLbls > c:txPr > a:p > a:endParaRPr
785 1
            $objWriter->startElement('a:endParaRPr');
786 1
            $objWriter->writeAttribute('lang', 'en-US');
787 1
            $objWriter->writeAttribute('dirty', '0');
788 1
            $objWriter->endElement();
789
790
            // c:ser > c:dLbls > c:txPr > ##a:p
791 1
            $objWriter->endElement();
792
793
            // c:ser > c:dLbls > ##c:txPr
794 1
            $objWriter->endElement();
795
796
            // c:ser > c:dLbls > c:dLblPos
797 1
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
798
799
            // c:ser > c:dLbls > c:showVal
800 1
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
801
802
            // c:ser > c:dLbls > c:showCatName
803 1
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
804
805
            // c:ser > c:dLbls > c:showSerName
806 1
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
807
808
            // c:ser > c:dLbls > c:showPercent
809 1
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
810
811
            // c:ser > c:dLbls > c:showLeaderLines
812 1
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
813
814
            // c:ser > ##c:dLbls
815 1
            $objWriter->endElement();
816
817 1
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
818
                // c:spPr
819
                $objWriter->startElement('c:spPr');
820
                // Write fill
821
                $this->writeFill($objWriter, $series->getFill());
822
                // ## c:spPr
823
                $objWriter->endElement();
824
            }
825
826
            // Write X axis data
827 1
            $axisXData = array_keys($series->getValues());
828
829
            // c:cat
830 1
            $objWriter->startElement('c:cat');
831 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
832 1
            $objWriter->endElement();
833
834
            // Write Y axis data
835 1
            $axisYData = array_values($series->getValues());
836
837
            // c:val
838 1
            $objWriter->startElement('c:val');
839 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
840 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
841 1
            $objWriter->endElement();
842
843 1
            $objWriter->endElement();
844
845 1
            ++$seriesIndex;
846 1
        }
847
848
        // c:marker
849 1
        $objWriter->startElement('c:marker');
850 1
        $objWriter->writeAttribute('val', '1');
851 1
        $objWriter->endElement();
852
853
        // c:smooth
854 1
        $objWriter->startElement('c:smooth');
855 1
        $objWriter->writeAttribute('val', '0');
856 1
        $objWriter->endElement();
857
858
        // c:axId
859 1
        $objWriter->startElement('c:axId');
860 1
        $objWriter->writeAttribute('val', '52743552');
861 1
        $objWriter->endElement();
862
863
        // c:axId
864 1
        $objWriter->startElement('c:axId');
865 1
        $objWriter->writeAttribute('val', '52749440');
866 1
        $objWriter->endElement();
867
868 1
        $objWriter->endElement();
869 1
    }
870
871
    /**
872
     * Write Type Bar
873
     *
874
     * @param  \PhpOffice\Common\XMLWriter       $objWriter    XML Writer
875
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar $subject
876
     * @param  boolean                              $includeSheet
877
     * @throws \Exception
878
     */
879 2
    protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, $includeSheet = false)
880
    {
881
        // c:bar3DChart
882 2
        $objWriter->startElement('c:barChart');
883
884
        // c:barDir
885 2
        $objWriter->startElement('c:barDir');
886 2
        $objWriter->writeAttribute('val', $subject->getBarDirection());
887 2
        $objWriter->endElement();
888
889
        // c:grouping
890 2
        $objWriter->startElement('c:grouping');
891 2
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
892 2
        $objWriter->endElement();
893
894
        // Write series
895 2
        $seriesIndex = 0;
896 2
        foreach ($subject->getSeries() as $series) {
897
            // c:ser
898 2
            $objWriter->startElement('c:ser');
899
900
            // c:idx
901 2
            $objWriter->startElement('c:idx');
902 2
            $objWriter->writeAttribute('val', $seriesIndex);
903 2
            $objWriter->endElement();
904
905
            // c:order
906 2
            $objWriter->startElement('c:order');
907 2
            $objWriter->writeAttribute('val', $seriesIndex);
908 2
            $objWriter->endElement();
909
910
            // c:tx
911 2
            $objWriter->startElement('c:tx');
912 2
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
913 2
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
914 2
            $objWriter->endElement();
915
916
            // Fills for points?
917 2
            $dataPointFills = $series->getDataPointFills();
918 2
            foreach ($dataPointFills as $key => $value) {
919
                // c:dPt
920 1
                $objWriter->startElement('c:dPt');
921
922
                // c:idx
923 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
924
925 1
                if ($value->getFillType() != Fill::FILL_NONE) {
926
                    // c:spPr
927 1
                    $objWriter->startElement('c:spPr');
928
                    // Write fill
929 1
                    $this->writeFill($objWriter, $value);
930
                    // ## c:spPr
931 1
                    $objWriter->endElement();
932 1
                }
933
934
                // ## c:dPt
935 1
                $objWriter->endElement();
936 2
            }
937
938
            // c:dLbls
939 2
            $objWriter->startElement('c:dLbls');
940
941 2
            if ($series->hasDlblNumFormat()) {
942
                //c:numFmt
943
                $objWriter->startElement('c:numFmt');
944
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
945
                $objWriter->writeAttribute('sourceLinked', '0');
946
                $objWriter->endElement();
947
            }
948
949
            // c:txPr
950 2
            $objWriter->startElement('c:txPr');
951
952
            // a:bodyPr
953 2
            $objWriter->writeElement('a:bodyPr', null);
954
955
            // a:lstStyle
956 2
            $objWriter->writeElement('a:lstStyle', null);
957
958
            // a:p
959 2
            $objWriter->startElement('a:p');
960
961
            // a:pPr
962 2
            $objWriter->startElement('a:pPr');
963
964
            // a:defRPr
965 2
            $objWriter->startElement('a:defRPr');
966
967 2
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
968 2
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
969 2
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
970 2
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
971 2
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
972
973 2
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
974
                if ($series->getFont()->isSuperScript()) {
975
                    $objWriter->writeAttribute('baseline', '30000');
976
                } elseif ($series->getFont()->isSubScript()) {
977
                    $objWriter->writeAttribute('baseline', '-25000');
978
                }
979
            }
980
981
            // Font - a:solidFill
982 2
            $objWriter->startElement('a:solidFill');
983
984 2
            $this->writeColor($objWriter, $series->getFont()->getColor());
985
986 2
            $objWriter->endElement();
987
988
            // Font - a:latin
989 2
            $objWriter->startElement('a:latin');
990 2
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
991 2
            $objWriter->endElement();
992
993 2
            $objWriter->endElement();
994
995 2
            $objWriter->endElement();
996
997
            // a:endParaRPr
998 2
            $objWriter->startElement('a:endParaRPr');
999 2
            $objWriter->writeAttribute('lang', 'en-US');
1000 2
            $objWriter->writeAttribute('dirty', '0');
1001 2
            $objWriter->endElement();
1002
1003 2
            $objWriter->endElement();
1004
1005 2
            $objWriter->endElement();
1006
1007
            // c:showVal
1008 2
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1009
1010
            // c:showCatName
1011 2
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1012
1013
            // c:showSerName
1014 2
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1015
1016
            // c:showPercent
1017 2
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1018
1019
            // c:showLeaderLines
1020 2
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1021
1022 2
            $objWriter->endElement();
1023
1024
            // c:spPr
1025 2
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
1026
                // c:spPr
1027
                $objWriter->startElement('c:spPr');
1028
                // Write fill
1029
                $this->writeFill($objWriter, $series->getFill());
1030
                // ## c:spPr
1031
                $objWriter->endElement();
1032
            }
1033
1034
            // Write X axis data
1035 2
            $axisXData = array_keys($series->getValues());
1036
1037
            // c:cat
1038 2
            $objWriter->startElement('c:cat');
1039 2
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1040 2
            $objWriter->endElement();
1041
1042
            // Write Y axis data
1043 2
            $axisYData = array_values($series->getValues());
1044
1045
            // c:val
1046 2
            $objWriter->startElement('c:val');
1047 2
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1048 2
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1049 2
            $objWriter->endElement();
1050
1051 2
            $objWriter->endElement();
1052
1053 2
            ++$seriesIndex;
1054 2
        }
1055
1056
        // c:overlap
1057 2
        $objWriter->startElement('c:overlap');
1058 2
        if ($subject->getBarGrouping() == Bar::GROUPING_CLUSTERED) {
1059 2
            $objWriter->writeAttribute('val', '0');
1060 2
        } elseif ($subject->getBarGrouping() == Bar::GROUPING_STACKED || $subject->getBarGrouping() == Bar::GROUPING_PERCENTSTACKED) {
1061
            $objWriter->writeAttribute('val', '100');
1062
        }
1063 2
        $objWriter->endElement();
1064
1065
        // c:gapWidth
1066 2
        $objWriter->startElement('c:gapWidth');
1067 2
        $objWriter->writeAttribute('val', '75');
1068 2
        $objWriter->endElement();
1069
1070
        // c:shape
1071 2
        $objWriter->startElement('c:shape');
1072 2
        $objWriter->writeAttribute('val', 'box');
1073 2
        $objWriter->endElement();
1074
1075
        // c:axId
1076 2
        $objWriter->startElement('c:axId');
1077 2
        $objWriter->writeAttribute('val', '52743552');
1078 2
        $objWriter->endElement();
1079
1080
        // c:axId
1081 2
        $objWriter->startElement('c:axId');
1082 2
        $objWriter->writeAttribute('val', '52749440');
1083 2
        $objWriter->endElement();
1084
1085
        // c:axId
1086 2
        $objWriter->startElement('c:axId');
1087 2
        $objWriter->writeAttribute('val', '0');
1088 2
        $objWriter->endElement();
1089
1090 2
        $objWriter->endElement();
1091 2
    }
1092
1093
    /**
1094
     * Write Type Bar3D
1095
     *
1096
     * @param  \PhpOffice\Common\XMLWriter       $objWriter    XML Writer
1097
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D $subject
1098
     * @param  boolean                              $includeSheet
1099
     * @throws \Exception
1100
     */
1101 4
    protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, $includeSheet = false)
1102
    {
1103
        // c:bar3DChart
1104 4
        $objWriter->startElement('c:bar3DChart');
1105
1106
        // c:barDir
1107 4
        $objWriter->startElement('c:barDir');
1108 4
        $objWriter->writeAttribute('val', $subject->getBarDirection());
1109 4
        $objWriter->endElement();
1110
1111
        // c:grouping
1112 4
        $objWriter->startElement('c:grouping');
1113 4
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
1114 4
        $objWriter->endElement();
1115
1116
        // Write series
1117 4
        $seriesIndex = 0;
1118 4
        foreach ($subject->getSeries() as $series) {
1119
            // c:ser
1120 4
            $objWriter->startElement('c:ser');
1121
1122
            // c:idx
1123 4
            $objWriter->startElement('c:idx');
1124 4
            $objWriter->writeAttribute('val', $seriesIndex);
1125 4
            $objWriter->endElement();
1126
1127
            // c:order
1128 4
            $objWriter->startElement('c:order');
1129 4
            $objWriter->writeAttribute('val', $seriesIndex);
1130 4
            $objWriter->endElement();
1131
1132
            // c:tx
1133 4
            $objWriter->startElement('c:tx');
1134 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1135 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1136 4
            $objWriter->endElement();
1137
1138
            // Fills for points?
1139 4
            $dataPointFills = $series->getDataPointFills();
1140 4
            foreach ($dataPointFills as $key => $value) {
1141
                // c:dPt
1142 1
                $objWriter->startElement('c:dPt');
1143
1144
                // c:idx
1145 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1146
1147 1
                if ($value->getFillType() != Fill::FILL_NONE) {
1148
                    // c:spPr
1149 1
                    $objWriter->startElement('c:spPr');
1150
                    // Write fill
1151 1
                    $this->writeFill($objWriter, $value);
1152
                    // ## c:spPr
1153 1
                    $objWriter->endElement();
1154 1
                }
1155
1156
                // ## c:dPt
1157 1
                $objWriter->endElement();
1158 4
            }
1159
1160
            // c:dLbls
1161 4
            $objWriter->startElement('c:dLbls');
1162
1163
            // c:txPr
1164 4
            $objWriter->startElement('c:txPr');
1165
1166
            // a:bodyPr
1167 4
            $objWriter->writeElement('a:bodyPr', null);
1168
1169
            // a:lstStyle
1170 4
            $objWriter->writeElement('a:lstStyle', null);
1171
1172
            // a:p
1173 4
            $objWriter->startElement('a:p');
1174
1175
            // a:pPr
1176 4
            $objWriter->startElement('a:pPr');
1177
1178
            // a:defRPr
1179 4
            $objWriter->startElement('a:defRPr');
1180
1181 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1182 4
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1183 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1184 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1185 4
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1186
1187 4
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
1188 2
                if ($series->getFont()->isSuperScript()) {
1189 1
                    $objWriter->writeAttribute('baseline', '30000');
1190 2
                } elseif ($series->getFont()->isSubScript()) {
1191 1
                    $objWriter->writeAttribute('baseline', '-25000');
1192 1
                }
1193 2
            }
1194
1195
            // Font - a:solidFill
1196 4
            $objWriter->startElement('a:solidFill');
1197
1198 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1199
1200 4
            $objWriter->endElement();
1201
1202
            // Font - a:latin
1203 4
            $objWriter->startElement('a:latin');
1204 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1205 4
            $objWriter->endElement();
1206
1207 4
            $objWriter->endElement();
1208
1209 4
            $objWriter->endElement();
1210
1211
            // a:endParaRPr
1212 4
            $objWriter->startElement('a:endParaRPr');
1213 4
            $objWriter->writeAttribute('lang', 'en-US');
1214 4
            $objWriter->writeAttribute('dirty', '0');
1215 4
            $objWriter->endElement();
1216
1217 4
            $objWriter->endElement();
1218
1219 4
            $objWriter->endElement();
1220
1221
            // c:showVal
1222 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1223
1224
            // c:showCatName
1225 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1226
1227
            // c:showSerName
1228 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1229
1230
            // c:showPercent
1231 4
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1232
1233
            // c:showLeaderLines
1234 4
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1235
1236 4
            $objWriter->endElement();
1237
1238
            // c:spPr
1239 4
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
1240
                // c:spPr
1241
                $objWriter->startElement('c:spPr');
1242
                // Write fill
1243
                $this->writeFill($objWriter, $series->getFill());
1244
                // ## c:spPr
1245
                $objWriter->endElement();
1246
            }
1247
1248
            // Write X axis data
1249 4
            $axisXData = array_keys($series->getValues());
1250
1251
            // c:cat
1252 4
            $objWriter->startElement('c:cat');
1253 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1254 4
            $objWriter->endElement();
1255
1256
            // Write Y axis data
1257 4
            $axisYData = array_values($series->getValues());
1258
1259
            // c:val
1260 4
            $objWriter->startElement('c:val');
1261 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1262 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1263 4
            $objWriter->endElement();
1264
1265 4
            $objWriter->endElement();
1266
1267 4
            ++$seriesIndex;
1268 4
        }
1269
1270
        // c:gapWidth
1271 4
        $objWriter->startElement('c:gapWidth');
1272 4
        $objWriter->writeAttribute('val', '75');
1273 4
        $objWriter->endElement();
1274
1275
        // c:shape
1276 4
        $objWriter->startElement('c:shape');
1277 4
        $objWriter->writeAttribute('val', 'box');
1278 4
        $objWriter->endElement();
1279
1280
        // c:axId
1281 4
        $objWriter->startElement('c:axId');
1282 4
        $objWriter->writeAttribute('val', '52743552');
1283 4
        $objWriter->endElement();
1284
1285
        // c:axId
1286 4
        $objWriter->startElement('c:axId');
1287 4
        $objWriter->writeAttribute('val', '52749440');
1288 4
        $objWriter->endElement();
1289
1290
        // c:axId
1291 4
        $objWriter->startElement('c:axId');
1292 4
        $objWriter->writeAttribute('val', '0');
1293 4
        $objWriter->endElement();
1294
1295 4
        $objWriter->endElement();
1296 4
    }
1297
1298
    /**
1299
     * Write Type Pie
1300
     *
1301
     * @param  \PhpOffice\Common\XMLWriter       $objWriter    XML Writer
1302
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie $subject
1303
     * @param  boolean                              $includeSheet
1304
     * @throws \Exception
1305
     */
1306 1
    protected function writeTypePie(XMLWriter $objWriter, Pie $subject, $includeSheet = false)
1307
    {
1308
        // c:pieChart
1309 1
        $objWriter->startElement('c:pieChart');
1310
1311
        // c:varyColors
1312 1
        $objWriter->startElement('c:varyColors');
1313 1
        $objWriter->writeAttribute('val', '1');
1314 1
        $objWriter->endElement();
1315
1316
        // Write series
1317 1
        $seriesIndex = 0;
1318 1
        foreach ($subject->getSeries() as $series) {
1319
            // c:ser
1320 1
            $objWriter->startElement('c:ser');
1321
1322
            // c:idx
1323 1
            $objWriter->startElement('c:idx');
1324 1
            $objWriter->writeAttribute('val', $seriesIndex);
1325 1
            $objWriter->endElement();
1326
1327
            // c:order
1328 1
            $objWriter->startElement('c:order');
1329 1
            $objWriter->writeAttribute('val', $seriesIndex);
1330 1
            $objWriter->endElement();
1331
1332
            // c:tx
1333 1
            $objWriter->startElement('c:tx');
1334 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1335 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1336 1
            $objWriter->endElement();
1337
1338
            // Fills for points?
1339 1
            $dataPointFills = $series->getDataPointFills();
1340 1
            foreach ($dataPointFills as $key => $value) {
1341
                // c:dPt
1342 1
                $objWriter->startElement('c:dPt');
1343
1344
                // c:idx
1345 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1346
1347
                // c:spPr
1348 1
                $objWriter->startElement('c:spPr');
1349
1350
                // Write fill
1351 1
                $this->writeFill($objWriter, $value);
1352
1353 1
                $objWriter->endElement();
1354
1355 1
                $objWriter->endElement();
1356 1
            }
1357
1358
            // c:dLbls
1359 1
            $objWriter->startElement('c:dLbls');
1360
1361
            // c:txPr
1362 1
            $objWriter->startElement('c:txPr');
1363
1364
            // a:bodyPr
1365 1
            $objWriter->writeElement('a:bodyPr', null);
1366
1367
            // a:lstStyle
1368 1
            $objWriter->writeElement('a:lstStyle', null);
1369
1370
            // a:p
1371 1
            $objWriter->startElement('a:p');
1372
1373
            // a:pPr
1374 1
            $objWriter->startElement('a:pPr');
1375
1376
            // a:defRPr
1377 1
            $objWriter->startElement('a:defRPr');
1378
1379 1
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1380 1
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1381 1
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1382 1
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1383 1
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1384
1385 1
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
1386
                if ($series->getFont()->isSuperScript()) {
1387
                    $objWriter->writeAttribute('baseline', '30000');
1388
                } elseif ($series->getFont()->isSubScript()) {
1389
                    $objWriter->writeAttribute('baseline', '-25000');
1390
                }
1391
            }
1392
1393
            // Font - a:solidFill
1394 1
            $objWriter->startElement('a:solidFill');
1395
1396 1
            $this->writeColor($objWriter, $series->getFont()->getColor());
1397
1398 1
            $objWriter->endElement();
1399
1400
            // Font - a:latin
1401 1
            $objWriter->startElement('a:latin');
1402 1
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1403 1
            $objWriter->endElement();
1404
1405 1
            $objWriter->endElement();
1406
1407 1
            $objWriter->endElement();
1408
1409
            // a:endParaRPr
1410 1
            $objWriter->startElement('a:endParaRPr');
1411 1
            $objWriter->writeAttribute('lang', 'en-US');
1412 1
            $objWriter->writeAttribute('dirty', '0');
1413 1
            $objWriter->endElement();
1414
1415 1
            $objWriter->endElement();
1416
1417 1
            $objWriter->endElement();
1418
1419
            // c:dLblPos
1420 1
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1421
1422
            // c:showVal
1423 1
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1424
1425
            // c:showCatName
1426 1
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1427
1428
            // c:showSerName
1429 1
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1430
1431
            // c:showPercent
1432 1
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1433
1434
            // c:showLeaderLines
1435 1
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1436
1437 1
            $objWriter->endElement();
1438
1439
            // Write X axis data
1440 1
            $axisXData = array_keys($series->getValues());
1441
1442
            // c:cat
1443 1
            $objWriter->startElement('c:cat');
1444 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1445 1
            $objWriter->endElement();
1446
1447
            // Write Y axis data
1448 1
            $axisYData = array_values($series->getValues());
1449
1450
            // c:val
1451 1
            $objWriter->startElement('c:val');
1452 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1453 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1454 1
            $objWriter->endElement();
1455
1456 1
            $objWriter->endElement();
1457
1458 1
            ++$seriesIndex;
1459 1
        }
1460
1461 1
        $objWriter->endElement();
1462 1
    }
1463
1464
    /**
1465
     * Write Type Pie3D
1466
     *
1467
     * @param  \PhpOffice\Common\XMLWriter       $objWriter    XML Writer
1468
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D $subject
1469
     * @param  boolean                              $includeSheet
1470
     * @throws \Exception
1471
     */
1472 4
    protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, $includeSheet = false)
1473
    {
1474
        // c:pie3DChart
1475 4
        $objWriter->startElement('c:pie3DChart');
1476
1477
        // c:varyColors
1478 4
        $objWriter->startElement('c:varyColors');
1479 4
        $objWriter->writeAttribute('val', '1');
1480 4
        $objWriter->endElement();
1481
1482
        // Write series
1483 4
        $seriesIndex = 0;
1484 4
        foreach ($subject->getSeries() as $series) {
1485
            // c:ser
1486 4
            $objWriter->startElement('c:ser');
1487
1488
            // c:idx
1489 4
            $objWriter->startElement('c:idx');
1490 4
            $objWriter->writeAttribute('val', $seriesIndex);
1491 4
            $objWriter->endElement();
1492
1493
            // c:order
1494 4
            $objWriter->startElement('c:order');
1495 4
            $objWriter->writeAttribute('val', $seriesIndex);
1496 4
            $objWriter->endElement();
1497
1498
            // c:tx
1499 4
            $objWriter->startElement('c:tx');
1500 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1501 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1502 4
            $objWriter->endElement();
1503
1504
            // c:explosion
1505 4
            $objWriter->startElement('c:explosion');
1506 4
            $objWriter->writeAttribute('val', $subject->getExplosion());
1507 4
            $objWriter->endElement();
1508
1509
            // Fills for points?
1510 4
            $dataPointFills = $series->getDataPointFills();
1511 4
            foreach ($dataPointFills as $key => $value) {
1512
                // c:dPt
1513 1
                $objWriter->startElement('c:dPt');
1514
1515
                // c:idx
1516 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1517
1518
                // c:spPr
1519 1
                $objWriter->startElement('c:spPr');
1520
1521
                // Write fill
1522 1
                $this->writeFill($objWriter, $value);
1523
1524 1
                $objWriter->endElement();
1525
1526 1
                $objWriter->endElement();
1527 4
            }
1528
1529
            // c:dLbls
1530 4
            $objWriter->startElement('c:dLbls');
1531
1532
            // c:txPr
1533 4
            $objWriter->startElement('c:txPr');
1534
1535
            // a:bodyPr
1536 4
            $objWriter->writeElement('a:bodyPr', null);
1537
1538
            // a:lstStyle
1539 4
            $objWriter->writeElement('a:lstStyle', null);
1540
1541
            // a:p
1542 4
            $objWriter->startElement('a:p');
1543
1544
            // a:pPr
1545 4
            $objWriter->startElement('a:pPr');
1546
1547
            // a:defRPr
1548 4
            $objWriter->startElement('a:defRPr');
1549
1550 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1551 4
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1552 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1553 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1554 4
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1555
1556 4
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
1557 2
                if ($series->getFont()->isSuperScript()) {
1558 1
                    $objWriter->writeAttribute('baseline', '30000');
1559 2
                } elseif ($series->getFont()->isSubScript()) {
1560 1
                    $objWriter->writeAttribute('baseline', '-25000');
1561 1
                }
1562 2
            }
1563
1564
            // Font - a:solidFill
1565 4
            $objWriter->startElement('a:solidFill');
1566
1567 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1568
1569 4
            $objWriter->endElement();
1570
1571
            // Font - a:latin
1572 4
            $objWriter->startElement('a:latin');
1573 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1574 4
            $objWriter->endElement();
1575
1576 4
            $objWriter->endElement();
1577
1578 4
            $objWriter->endElement();
1579
1580
            // a:endParaRPr
1581 4
            $objWriter->startElement('a:endParaRPr');
1582 4
            $objWriter->writeAttribute('lang', 'en-US');
1583 4
            $objWriter->writeAttribute('dirty', '0');
1584 4
            $objWriter->endElement();
1585
1586 4
            $objWriter->endElement();
1587
1588 4
            $objWriter->endElement();
1589
1590
            // c:dLblPos
1591 4
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1592
1593
            // c:showVal
1594 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1595
1596
            // c:showCatName
1597 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1598
1599
            // c:showSerName
1600 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1601
1602
            // c:showPercent
1603 4
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1604
1605
            // c:showLeaderLines
1606 4
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1607
1608 4
            $objWriter->endElement();
1609
1610
            // Write X axis data
1611 4
            $axisXData = array_keys($series->getValues());
1612
1613
            // c:cat
1614 4
            $objWriter->startElement('c:cat');
1615 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1616 4
            $objWriter->endElement();
1617
1618
            // Write Y axis data
1619 4
            $axisYData = array_values($series->getValues());
1620
1621
            // c:val
1622 4
            $objWriter->startElement('c:val');
1623 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1624 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1625 4
            $objWriter->endElement();
1626
1627 4
            $objWriter->endElement();
1628
1629 4
            ++$seriesIndex;
1630 4
        }
1631
1632 4
        $objWriter->endElement();
1633 4
    }
1634
1635
    /**
1636
     * Write Type Line
1637
     *
1638
     * @param  \PhpOffice\Common\XMLWriter      $objWriter    XML Writer
1639
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Line $subject
1640
     * @param  boolean                             $includeSheet
1641
     * @throws \Exception
1642
     */
1643 7
    protected function writeTypeLine(XMLWriter $objWriter, Line $subject, $includeSheet = false)
1644
    {
1645
        // c:lineChart
1646 7
        $objWriter->startElement('c:lineChart');
1647
1648
        // c:grouping
1649 7
        $objWriter->startElement('c:grouping');
1650 7
        $objWriter->writeAttribute('val', 'standard');
1651 7
        $objWriter->endElement();
1652
1653
        // Write series
1654 7
        $seriesIndex = 0;
1655 7
        foreach ($subject->getSeries() as $series) {
1656
            // c:ser
1657 6
            $objWriter->startElement('c:ser');
1658
1659
            // c:idx
1660 6
            $objWriter->startElement('c:idx');
1661 6
            $objWriter->writeAttribute('val', $seriesIndex);
1662 6
            $objWriter->endElement();
1663
1664
            // c:order
1665 6
            $objWriter->startElement('c:order');
1666 6
            $objWriter->writeAttribute('val', $seriesIndex);
1667 6
            $objWriter->endElement();
1668
1669
            // c:tx
1670 6
            $objWriter->startElement('c:tx');
1671 6
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1672 6
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1673 6
            $objWriter->endElement();
1674
1675
            // Marker
1676 6
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1677
1678
            // c:dLbls
1679 6
            $objWriter->startElement('c:dLbls');
1680
1681
            // c:txPr
1682 6
            $objWriter->startElement('c:txPr');
1683
1684
            // a:bodyPr
1685 6
            $objWriter->writeElement('a:bodyPr', null);
1686
1687
            // a:lstStyle
1688 6
            $objWriter->writeElement('a:lstStyle', null);
1689
1690
            // a:p
1691 6
            $objWriter->startElement('a:p');
1692
1693
            // a:pPr
1694 6
            $objWriter->startElement('a:pPr');
1695
1696
            // a:defRPr
1697 6
            $objWriter->startElement('a:defRPr');
1698
1699 6
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1700 6
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1701 6
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1702 6
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1703 6
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1704
1705 6
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
1706 2
                if ($series->getFont()->isSuperScript()) {
1707 1
                    $objWriter->writeAttribute('baseline', '30000');
1708 2
                } elseif ($series->getFont()->isSubScript()) {
1709 1
                    $objWriter->writeAttribute('baseline', '-25000');
1710 1
                }
1711 2
            }
1712
1713
            // Font - a:solidFill
1714 6
            $objWriter->startElement('a:solidFill');
1715
1716 6
            $this->writeColor($objWriter, $series->getFont()->getColor());
1717
1718 6
            $objWriter->endElement();
1719
1720
            // Font - a:latin
1721 6
            $objWriter->startElement('a:latin');
1722 6
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1723 6
            $objWriter->endElement();
1724
1725 6
            $objWriter->endElement();
1726
1727 6
            $objWriter->endElement();
1728
1729
            // a:endParaRPr
1730 6
            $objWriter->startElement('a:endParaRPr');
1731 6
            $objWriter->writeAttribute('lang', 'en-US');
1732 6
            $objWriter->writeAttribute('dirty', '0');
1733 6
            $objWriter->endElement();
1734
1735 6
            $objWriter->endElement();
1736
1737 6
            $objWriter->endElement();
1738
1739
            // c:showVal
1740 6
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1741
1742
            // c:showCatName
1743 6
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1744
1745
            // c:showSerName
1746 6
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1747
1748
            // c:showPercent
1749 6
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1750
1751
            // c:showLeaderLines
1752 6
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1753
1754
            // > c:dLbls
1755 6
            $objWriter->endElement();
1756
1757
            // c:spPr
1758 6
            $objWriter->startElement('c:spPr');
1759
            // Write fill
1760 6
            $this->writeFill($objWriter, $series->getFill());
1761
            // Write outline
1762 6
            $this->writeOutline($objWriter, $series->getOutline());
1763
            // ## c:spPr
1764 6
            $objWriter->endElement();
1765
1766
            // Write X axis data
1767 6
            $axisXData = array_keys($series->getValues());
1768
1769
            // c:cat
1770 6
            $objWriter->startElement('c:cat');
1771 6
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1772 6
            $objWriter->endElement();
1773
1774
            // Write Y axis data
1775 6
            $axisYData = array_values($series->getValues());
1776
1777
            // c:val
1778 6
            $objWriter->startElement('c:val');
1779 6
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1780 6
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1781 6
            $objWriter->endElement();
1782
1783 6
            $objWriter->endElement();
1784
1785 6
            ++$seriesIndex;
1786 7
        }
1787
1788
        // c:marker
1789 7
        $objWriter->startElement('c:marker');
1790 7
        $objWriter->writeAttribute('val', '1');
1791 7
        $objWriter->endElement();
1792
1793
        // c:smooth
1794 7
        $objWriter->startElement('c:smooth');
1795 7
        $objWriter->writeAttribute('val', '0');
1796 7
        $objWriter->endElement();
1797
1798
        // c:axId
1799 7
        $objWriter->startElement('c:axId');
1800 7
        $objWriter->writeAttribute('val', '52743552');
1801 7
        $objWriter->endElement();
1802
1803
        // c:axId
1804 7
        $objWriter->startElement('c:axId');
1805 7
        $objWriter->writeAttribute('val', '52749440');
1806 7
        $objWriter->endElement();
1807
1808 7
        $objWriter->endElement();
1809 7
    }
1810
1811
    /**
1812
     * Write Type Scatter
1813
     *
1814
     * @param  \PhpOffice\Common\XMLWriter         $objWriter    XML Writer
1815
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter $subject
1816
     * @param  boolean                                $includeSheet
1817
     * @throws \Exception
1818
     */
1819 5
    protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, $includeSheet = false)
1820
    {
1821
        // c:scatterChart
1822 5
        $objWriter->startElement('c:scatterChart');
1823
1824
        // c:scatterStyle
1825 5
        $objWriter->startElement('c:scatterStyle');
1826 5
        $objWriter->writeAttribute('val', 'lineMarker');
1827 5
        $objWriter->endElement();
1828
1829
        // c:varyColors
1830 5
        $objWriter->startElement('c:varyColors');
1831 5
        $objWriter->writeAttribute('val', '0');
1832 5
        $objWriter->endElement();
1833
1834
        // Write series
1835 5
        $seriesIndex = 0;
1836 5
        foreach ($subject->getSeries() as $series) {
1837
            // c:ser
1838 5
            $objWriter->startElement('c:ser');
1839
1840
            // c:idx
1841 5
            $objWriter->startElement('c:idx');
1842 5
            $objWriter->writeAttribute('val', $seriesIndex);
1843 5
            $objWriter->endElement();
1844
1845
            // c:order
1846 5
            $objWriter->startElement('c:order');
1847 5
            $objWriter->writeAttribute('val', $seriesIndex);
1848 5
            $objWriter->endElement();
1849
1850
            // c:tx
1851 5
            $objWriter->startElement('c:tx');
1852 5
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1853 5
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1854 5
            $objWriter->endElement();
1855
1856
            // Marker
1857 5
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1858
1859
            // c:dLbls
1860 5
            $objWriter->startElement('c:dLbls');
1861
1862
            // c:txPr
1863 5
            $objWriter->startElement('c:txPr');
1864
1865
            // a:bodyPr
1866 5
            $objWriter->writeElement('a:bodyPr', null);
1867
1868
            // a:lstStyle
1869 5
            $objWriter->writeElement('a:lstStyle', null);
1870
1871
            // a:p
1872 5
            $objWriter->startElement('a:p');
1873
1874
            // a:pPr
1875 5
            $objWriter->startElement('a:pPr');
1876
1877
            // a:defRPr
1878 5
            $objWriter->startElement('a:defRPr');
1879
1880 5
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1881 5
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1882 5
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1883 5
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1884 5
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1885
1886 5
            if ($series->getFont()->isSuperScript() || $series->getFont()->isSubScript()) {
1887 2
                if ($series->getFont()->isSuperScript()) {
1888 1
                    $objWriter->writeAttribute('baseline', '30000');
1889 2
                } elseif ($series->getFont()->isSubScript()) {
1890 1
                    $objWriter->writeAttribute('baseline', '-25000');
1891 1
                }
1892 2
            }
1893
1894
            // Font - a:solidFill
1895 5
            $objWriter->startElement('a:solidFill');
1896
1897 5
            $this->writeColor($objWriter, $series->getFont()->getColor());
1898
1899 5
            $objWriter->endElement();
1900
1901
            // Font - a:latin
1902 5
            $objWriter->startElement('a:latin');
1903 5
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1904 5
            $objWriter->endElement();
1905
1906 5
            $objWriter->endElement();
1907
1908 5
            $objWriter->endElement();
1909
1910
            // a:endParaRPr
1911 5
            $objWriter->startElement('a:endParaRPr');
1912 5
            $objWriter->writeAttribute('lang', 'en-US');
1913 5
            $objWriter->writeAttribute('dirty', '0');
1914 5
            $objWriter->endElement();
1915
1916 5
            $objWriter->endElement();
1917
1918 5
            $objWriter->endElement();
1919
1920
            // c:showLegendKey
1921 5
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', '0');
1922
1923
            // c:showVal
1924 5
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1925
1926
            // c:showCatName
1927 5
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1928
1929
            // c:showSerName
1930 5
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1931
1932
            // c:showPercent
1933 5
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1934
1935
            // c:showLeaderLines
1936 5
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1937
1938 5
            $objWriter->endElement();
1939
1940
            // c:spPr
1941 5
            $objWriter->startElement('c:spPr');
1942
            // Write fill
1943 5
            $this->writeFill($objWriter, $series->getFill());
1944
            // Write outline
1945 5
            $this->writeOutline($objWriter, $series->getOutline());
1946
            // ## c:spPr
1947 5
            $objWriter->endElement();
1948
1949
            // Write X axis data
1950 5
            $axisXData = array_keys($series->getValues());
1951
1952
            // c:xVal
1953 5
            $objWriter->startElement('c:xVal');
1954 5
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1955 5
            $objWriter->endElement();
1956
1957
            // Write Y axis data
1958 5
            $axisYData = array_values($series->getValues());
1959
1960
            // c:yVal
1961 5
            $objWriter->startElement('c:yVal');
1962 5
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1963 5
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1964 5
            $objWriter->endElement();
1965
1966
            // c:smooth
1967 5
            $objWriter->startElement('c:smooth');
1968 5
            $objWriter->writeAttribute('val', '0');
1969 5
            $objWriter->endElement();
1970
1971 5
            $objWriter->endElement();
1972
1973 5
            ++$seriesIndex;
1974 5
        }
1975
1976
        // c:axId
1977 5
        $objWriter->startElement('c:axId');
1978 5
        $objWriter->writeAttribute('val', '52743552');
1979 5
        $objWriter->endElement();
1980
1981
        // c:axId
1982 5
        $objWriter->startElement('c:axId');
1983 5
        $objWriter->writeAttribute('val', '52749440');
1984 5
        $objWriter->endElement();
1985
1986 5
        $objWriter->endElement();
1987 5
    }
1988
    /**
1989
     * Write chart relationships to XML format
1990
     *
1991
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $pChart
1992
     * @return string                    XML Output
1993
     * @throws \Exception
1994
     */
1995
    public function writeChartRelationships(Chart $pChart)
1996
    {
1997
        // Create XML writer
1998
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
1999
2000
        // XML header
2001
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
2002
2003
        // Relationships
2004
        $objWriter->startElement('Relationships');
2005
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
2006
2007
        // Write spreadsheet relationship?
2008
        if ($pChart->hasIncludedSpreadsheet()) {
2009
            $this->writeRelationship($objWriter, 1, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package', '../embeddings/' . $pChart->getIndexedFilename() . '.xlsx');
2010
        }
2011
2012
        $objWriter->endElement();
2013
2014
        // Return
2015
        return $objWriter->getData();
2016
    }
2017
2018
    /**
2019
     * @param XMLWriter $objWriter
2020
     * @param Chart\Marker $oMarker
2021
     */
2022 11
    protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker)
2023
    {
2024 11
        if ($oMarker->getSymbol() != Chart\Marker::SYMBOL_NONE) {
2025 2
            $markerSize = (int)$oMarker->getSize();
2026 2
            if ($markerSize < 2) {
2027 2
                $markerSize = 2;
2028 2
            }
2029 2
            if ($markerSize > 72) {
2030 2
                $markerSize = 72;
2031 2
            }
2032
2033
            // c:marker
2034 2
            $objWriter->startElement('c:marker');
2035
2036
            // c:marker > c:symbol
2037 2
            $objWriter->startElement('c:symbol');
2038 2
            $objWriter->writeAttribute('val', $oMarker->getSymbol());
2039 2
            $objWriter->endElement();
2040
            /**
2041
             * c:marker > c:size
2042
             * Size in points
2043
             * @link : https://msdn.microsoft.com/en-us/library/hh658135(v=office.12).aspx
2044
             */
2045 2
            $objWriter->startElement('c:size');
2046 2
            $objWriter->writeAttribute('val', $markerSize);
2047 2
            $objWriter->endElement();
2048
2049 2
            $objWriter->endElement();
2050 2
        }
2051 11
    }
2052
2053
    /**
2054
     * @param XMLWriter $objWriter
2055
     * @param Chart\Axis $oAxis
2056
     * @param $typeAxis
2057
     */
2058 19
    protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, $typeAxis)
2059
    {
2060 19
        if ($typeAxis != Chart\Axis::AXIS_X && $typeAxis != Chart\Axis::AXIS_Y) {
2061
            return;
2062
        }
2063
2064
        switch ($typeAxis) {
2065 19
            case Chart\Axis::AXIS_X:
2066 19
                $mainElement = 'c:catAx';
2067 19
                $axIdVal = '52743552';
2068 19
                $axPosVal = 'b';
2069 19
                $crossAxVal = '52749440';
2070 19
                break;
2071 19
            case Chart\Axis::AXIS_Y:
2072 19
                $mainElement = 'c:valAx';
2073 19
                $axIdVal = '52749440';
2074 19
                $axPosVal = 'l';
2075 19
                $crossAxVal = '52743552';
2076 19
                break;
2077
        }
2078
2079
        // $mainElement
2080 19
        $objWriter->startElement($mainElement);
0 ignored issues
show
Bug introduced by
The variable $mainElement does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
2081
2082
        // $mainElement > c:axId
2083 19
        $objWriter->startElement('c:axId');
2084 19
        $objWriter->writeAttribute('val', $axIdVal);
0 ignored issues
show
Bug introduced by
The variable $axIdVal does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
2085 19
        $objWriter->endElement();
2086
2087
        // $mainElement > c:scaling
2088 19
        $objWriter->startElement('c:scaling');
2089
2090
        // $mainElement > c:scaling > c:orientation
2091 19
        $objWriter->startElement('c:orientation');
2092 19
        $objWriter->writeAttribute('val', 'minMax');
2093 19
        $objWriter->endElement();
2094
2095
        // $mainElement > ##c:scaling
2096 19
        $objWriter->endElement();
2097
2098
        // $mainElement > c:axPos
2099 19
        $objWriter->startElement('c:axPos');
2100 19
        $objWriter->writeAttribute('val', $axPosVal);
0 ignored issues
show
Bug introduced by
The variable $axPosVal does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
2101 19
        $objWriter->endElement();
2102
2103 19
        $oMajorGridlines = $oAxis->getMajorGridlines();
2104 19
        if ($oMajorGridlines instanceof Gridlines) {
2105 1
            $objWriter->startElement('c:majorGridlines');
2106
2107 1
            $this->writeAxisGridlines($objWriter, $oMajorGridlines);
2108
2109 1
            $objWriter->endElement();
2110 1
        }
2111
2112 19
        $oMinorGridlines = $oAxis->getMinorGridlines();
2113 19
        if ($oMinorGridlines instanceof Gridlines) {
2114 1
            $objWriter->startElement('c:minorGridlines');
2115
2116 1
            $this->writeAxisGridlines($objWriter, $oMinorGridlines);
2117
2118 1
            $objWriter->endElement();
2119 1
        }
2120
2121
        // c:numFmt
2122 19
        $objWriter->startElement('c:numFmt');
2123 19
        $objWriter->writeAttribute('formatCode', $oAxis->getFormatCode());
2124 19
        $objWriter->writeAttribute('sourceLinked', '0');
2125 19
        $objWriter->endElement();
2126
2127
        // c:majorTickMark
2128 19
        $objWriter->startElement('c:majorTickMark');
2129 19
        $objWriter->writeAttribute('val', 'none');
2130 19
        $objWriter->endElement();
2131
2132
        // c:tickLblPos
2133 19
        $objWriter->startElement('c:tickLblPos');
2134 19
        $objWriter->writeAttribute('val', 'nextTo');
2135 19
        $objWriter->endElement();
2136
2137
        // c:txPr
2138 19
        $objWriter->startElement('c:txPr');
2139
2140
        // a:bodyPr
2141 19
        $objWriter->writeElement('a:bodyPr', null);
2142
2143
        // a:lstStyle
2144 19
        $objWriter->writeElement('a:lstStyle', null);
2145
2146
        // a:p
2147 19
        $objWriter->startElement('a:p');
2148
2149
        // a:pPr
2150 19
        $objWriter->startElement('a:pPr');
2151
2152
        // a:defRPr
2153 19
        $objWriter->startElement('a:defRPr');
2154
2155 19
        $objWriter->writeAttribute('b', ($oAxis->getFont()->isBold() ? 'true' : 'false'));
2156 19
        $objWriter->writeAttribute('i', ($oAxis->getFont()->isItalic() ? 'true' : 'false'));
2157 19
        $objWriter->writeAttribute('strike', ($oAxis->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
2158 19
        $objWriter->writeAttribute('sz', ($oAxis->getFont()->getSize() * 100));
2159 19
        $objWriter->writeAttribute('u', $oAxis->getFont()->getUnderline());
2160
2161 19
        if ($oAxis->getFont()->isSuperScript() || $oAxis->getFont()->isSubScript()) {
2162
            if ($oAxis->getFont()->isSuperScript()) {
2163
                $objWriter->writeAttribute('baseline', '30000');
2164
            } elseif ($oAxis->getFont()->isSubScript()) {
2165
                $objWriter->writeAttribute('baseline', '-25000');
2166
            }
2167
        }
2168
2169
        // Font - a:solidFill
2170 19
        $objWriter->startElement('a:solidFill');
2171
2172 19
        $this->writeColor($objWriter, $oAxis->getFont()->getColor());
2173
2174 19
        $objWriter->endElement();
2175
2176
        // Font - a:latin
2177 19
        $objWriter->startElement('a:latin');
2178 19
        $objWriter->writeAttribute('typeface', $oAxis->getFont()->getName());
2179 19
        $objWriter->endElement();
2180
2181 19
        $objWriter->endElement();
2182
2183
        // ## a:pPr
2184 19
        $objWriter->endElement();
2185
2186
        // a:r
2187 19
        $objWriter->startElement('a:r');
2188
2189
        // a:rPr
2190 19
        $objWriter->startElement('a:rPr');
2191 19
        $objWriter->writeAttribute('lang', 'en-US');
2192 19
        $objWriter->writeAttribute('dirty', '0');
2193 19
        $objWriter->endElement();
2194
2195
        // a:t
2196 19
        $objWriter->writeElement('a:t', $oAxis->getTitle());
2197
2198
        // ## a:r
2199 19
        $objWriter->endElement();
2200
2201
        // a:endParaRPr
2202 19
        $objWriter->startElement('a:endParaRPr');
2203 19
        $objWriter->writeAttribute('lang', 'en-US');
2204 19
        $objWriter->writeAttribute('dirty', '0');
2205 19
        $objWriter->endElement();
2206
2207
        // ## a:p
2208 19
        $objWriter->endElement();
2209
2210
        // ## c:txPr
2211 19
        $objWriter->endElement();
2212
2213
        // c:crossAx
2214 19
        $objWriter->startElement('c:crossAx');
2215 19
        $objWriter->writeAttribute('val', $crossAxVal);
0 ignored issues
show
Bug introduced by
The variable $crossAxVal does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
2216 19
        $objWriter->endElement();
2217
2218
        // c:crosses
2219 19
        $objWriter->startElement('c:crosses');
2220 19
        $objWriter->writeAttribute('val', 'autoZero');
2221 19
        $objWriter->endElement();
2222
2223 19
        if ($typeAxis == Chart\Axis::AXIS_X) {
2224
            // c:lblAlgn
2225 19
            $objWriter->startElement('c:lblAlgn');
2226 19
            $objWriter->writeAttribute('val', 'ctr');
2227 19
            $objWriter->endElement();
2228
2229
            // c:lblOffset
2230 19
            $objWriter->startElement('c:lblOffset');
2231 19
            $objWriter->writeAttribute('val', '100');
2232 19
            $objWriter->endElement();
2233 19
        }
2234
2235 19
        if ($typeAxis == Chart\Axis::AXIS_Y) {
2236
            // c:crossBetween
2237 19
            $objWriter->startElement('c:crossBetween');
2238 19
            $objWriter->writeAttribute('val', 'between');
2239 19
            $objWriter->endElement();
2240 19
        }
2241
2242 19
        $objWriter->endElement();
2243 19
    }
2244
2245
    /**
2246
     * @param XMLWriter $objWriter
2247
     * @param Gridlines $oGridlines
2248
     */
2249 1
    protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines)
2250
    {
2251
        // c:spPr
2252 1
        $objWriter->startElement('c:spPr');
2253
2254
        // Outline
2255 1
        $this->writeOutline($objWriter, $oGridlines->getOutline());
2256
2257
        // ##c:spPr
2258 1
        $objWriter->endElement();
2259 1
    }
2260
}
2261