Completed
Pull Request — develop (#412)
by Franck
05:58
created

PptCharts::writeTypeRadar()   D

Complexity

Conditions 13
Paths 5

Size

Total Lines 163
Code Lines 82

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 83
CRAP Score 13

Importance

Changes 0
Metric Value
dl 0
loc 163
ccs 83
cts 83
cp 1
rs 4.9922
c 0
b 0
f 0
cc 13
eloc 82
nc 5
nop 3
crap 13

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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\Radar;
17
use PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut;
18
use PhpOffice\PhpPresentation\Shape\Chart\Type\Line;
19
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie;
20
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D;
21
use PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter;
22
use PhpOffice\PhpPresentation\Style\Border;
23
use PhpOffice\PhpPresentation\Style\Fill;
24
25
class PptCharts extends AbstractDecoratorWriter
26
{
27
    /**
28
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
29
     * @throws \Exception
30
     */
31 116
    public function render()
32
    {
33 116
        for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
34 46
            $shape = $this->getDrawingHashTable()->getByIndex($i);
35 46
            if ($shape instanceof Chart) {
36 37
                $this->getZip()->addFromString('ppt/charts/' . $shape->getIndexedFilename(), $this->writeChart($shape));
37
38 36
                if ($shape->hasIncludedSpreadsheet()) {
39
                    $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape));
40
                    $pFilename = tempnam(sys_get_temp_dir(), 'PHPExcel');
41
                    $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx'));
42
                    
43
                    // remove temp file
44
                    if (@unlink($pFilename) === false) {
45
                        throw new \Exception('The file ' . $pFilename . ' could not removed.');
46
                    }
47
                }
48
            }
49
        }
50 115
        return $this->getZip();
51
    }
52
53
54
    /**
55
     * Write chart to XML format
56
     *
57
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
58
     * @return string                    XML Output
59
     * @throws \Exception
60
     */
61 37
    public function writeChart(Chart $chart)
62
    {
63
        // Create XML writer
64 37
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
65
66
        // XML header
67 37
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
68
69
        // c:chartSpace
70 37
        $objWriter->startElement('c:chartSpace');
71 37
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
72 37
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
73 37
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
74
75
        // c:date1904
76 37
        $objWriter->startElement('c:date1904');
77 37
        $objWriter->writeAttribute('val', '1');
78 37
        $objWriter->endElement();
79
80
        // c:lang
81 37
        $objWriter->startElement('c:lang');
82 37
        $objWriter->writeAttribute('val', 'en-US');
83 37
        $objWriter->endElement();
84
85
        // c:chart
86 37
        $objWriter->startElement('c:chart');
87
88
        // Title?
89 37
        if ($chart->getTitle()->isVisible()) {
90
            // Write title
91 36
            $this->writeTitle($objWriter, $chart->getTitle());
92
        }
93
94
        // c:autoTitleDeleted
95 37
        $objWriter->startElement('c:autoTitleDeleted');
96 37
        $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1');
97 37
        $objWriter->endElement();
98
99
        // c:view3D
100 37
        $objWriter->startElement('c:view3D');
101
102
        // c:rotX
103 37
        $objWriter->startElement('c:rotX');
104 37
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
105 37
        $objWriter->endElement();
106
107
        // c:hPercent
108 37
        $hPercent = $chart->getView3D()->getHeightPercent();
109 37
        $objWriter->writeElementIf($hPercent != null, 'c:hPercent', 'val', $hPercent . '%');
110
111
        // c:rotY
112 37
        $objWriter->startElement('c:rotY');
113 37
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
114 37
        $objWriter->endElement();
115
116
        // c:depthPercent
117 37
        $objWriter->startElement('c:depthPercent');
118 37
        $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
119 37
        $objWriter->endElement();
120
121
        // c:rAngAx
122 37
        $objWriter->startElement('c:rAngAx');
123 37
        $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
124 37
        $objWriter->endElement();
125
126
        // c:perspective
127 37
        $objWriter->startElement('c:perspective');
128 37
        $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
129 37
        $objWriter->endElement();
130
131 37
        $objWriter->endElement();
132
133
        // Write plot area
134 37
        $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart);
135
136
        // Legend?
137 36
        if ($chart->getLegend()->isVisible()) {
138
            // Write legend
139 36
            $this->writeLegend($objWriter, $chart->getLegend());
140
        }
141
142
        // c:plotVisOnly
143 36
        $objWriter->startElement('c:plotVisOnly');
144 36
        $objWriter->writeAttribute('val', '1');
145 36
        $objWriter->endElement();
146
147 36
        $objWriter->endElement();
148
149
        // c:spPr
150 36
        $objWriter->startElement('c:spPr');
151
152
        // Fill
153 36
        $this->writeFill($objWriter, $chart->getFill());
154
155
        // Border
156 36
        if ($chart->getBorder()->getLineStyle() != Border::LINE_NONE) {
157 1
            $this->writeBorder($objWriter, $chart->getBorder(), '');
158
        }
159
160
        // Shadow
161 36
        if ($chart->getShadow()->isVisible()) {
162
            // a:effectLst
163 1
            $objWriter->startElement('a:effectLst');
164
165
            // a:outerShdw
166 1
            $objWriter->startElement('a:outerShdw');
167 1
            $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius()));
168 1
            $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance()));
169 1
            $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($chart->getShadow()->getDirection()));
170 1
            $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment());
171 1
            $objWriter->writeAttribute('rotWithShape', '0');
172
173 1
            $this->writeColor($objWriter, $chart->getShadow()->getColor(), $chart->getShadow()->getAlpha());
174
175 1
            $objWriter->endElement();
176
177 1
            $objWriter->endElement();
178
        }
179
180 36
        $objWriter->endElement();
181
182
        // External data?
183 36
        if ($chart->hasIncludedSpreadsheet()) {
184
            // c:externalData
185
            $objWriter->startElement('c:externalData');
186
            $objWriter->writeAttribute('r:id', 'rId1');
187
188
            // c:autoUpdate
189
            $objWriter->startElement('c:autoUpdate');
190
            $objWriter->writeAttribute('val', '0');
191
            $objWriter->endElement();
192
193
            $objWriter->endElement();
194
        }
195
196 36
        $objWriter->endElement();
197
198
        // Return
199 36
        return $objWriter->getData();
200
    }
201
202
    /**
203
     * Write chart to XML format
204
     *
205
     * @param  PhpPresentation $presentation
206
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
207
     * @param  string $tempName
208
     * @return string                    String output
209
     * @throws \Exception
210
     */
211
    public function writeSpreadsheet(PhpPresentation $presentation, $chart, $tempName)
212
    {
213
        // Need output?
214
        if (!$chart->hasIncludedSpreadsheet()) {
215
            throw new \Exception('No spreadsheet output is required for the given chart.');
216
        }
217
218
        // Verify PHPExcel
219
        if (!class_exists('PHPExcel')) {
220
            throw new \Exception('PHPExcel has not been loaded. Include PHPExcel.php in your script, e.g. require_once \'PHPExcel.php\'.');
221
        }
222
223
        // Create new spreadsheet
224
        $workbook = new \PHPExcel();
225
226
        // Set properties
227
        $title = $chart->getTitle()->getText();
228
        if (strlen($title) == 0) {
229
            $title = 'Chart';
230
        }
231
        $workbook->getProperties()->setCreator($presentation->getDocumentProperties()->getCreator())->setLastModifiedBy($presentation->getDocumentProperties()->getLastModifiedBy())->setTitle($title);
232
233
        // Add chart data
234
        $sheet = $workbook->setActiveSheetIndex(0);
235
        $sheet->setTitle('Sheet1');
236
237
        // Write series
238
        $seriesIndex = 0;
239
        foreach ($chart->getPlotArea()->getType()->getSeries() as $series) {
240
            // Title
241
            $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, 1, $series->getTitle());
242
243
            // X-axis
244
            $axisXData = array_keys($series->getValues());
245
            $numAxisXData = count($axisXData);
246
            for ($i = 0; $i < $numAxisXData; $i++) {
247
                $sheet->setCellValueByColumnAndRow(0, $i + 2, $axisXData[$i]);
248
            }
249
250
            // Y-axis
251
            $axisYData = array_values($series->getValues());
252
            $numAxisYData = count($axisYData);
253
            for ($i = 0; $i < $numAxisYData; $i++) {
254
                $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, $i + 2, $axisYData[$i]);
255
            }
256
257
            ++$seriesIndex;
258
        }
259
260
        // Save to string
261
        $writer = \PHPExcel_IOFactory::createWriter($workbook, 'Excel2007');
262
        $writer->save($tempName);
263
264
        // Load file in memory
265
        $returnValue = file_get_contents($tempName);
266
        if (@unlink($tempName) === false) {
267
            throw new \Exception('The file ' . $tempName . ' could not removed.');
268
        }
269
270
        return $returnValue;
271
    }
272
273
    /**
274
     * Write element with value attribute
275
     *
276
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
277
     * @param string $elementName
278
     * @param string $value
279
     */
280 32
    protected function writeElementWithValAttribute($objWriter, $elementName, $value)
281
    {
282 32
        $objWriter->startElement($elementName);
283 32
        $objWriter->writeAttribute('val', $value);
284 32
        $objWriter->endElement();
285 32
    }
286
287
    /**
288
     * Write single value or reference
289
     *
290
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
291
     * @param boolean $isReference
292
     * @param mixed $value
293
     * @param string $reference
294
     */
295 32
    protected function writeSingleValueOrReference($objWriter, $isReference, $value, $reference)
296
    {
297 32
        if (!$isReference) {
298
            // Value
299 32
            $objWriter->writeElement('c:v', $value);
300 32
            return;
301
        }
302
303
        // Reference and cache
304
        $objWriter->startElement('c:strRef');
305
        $objWriter->writeElement('c:f', $reference);
306
        $objWriter->startElement('c:strCache');
307
        $objWriter->startElement('c:ptCount');
308
        $objWriter->writeAttribute('val', '1');
309
        $objWriter->endElement();
310
311
        $objWriter->startElement('c:pt');
312
        $objWriter->writeAttribute('idx', '0');
313
        $objWriter->writeElement('c:v', $value);
314
        $objWriter->endElement();
315
        $objWriter->endElement();
316
        $objWriter->endElement();
317
    }
318
319
    /**
320
     * Write series value or reference
321
     *
322
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
323
     * @param boolean $isReference
324
     * @param mixed $values
325
     * @param string $reference
326
     */
327 32
    protected function writeMultipleValuesOrReference($objWriter, $isReference, $values, $reference)
328
    {
329
        // c:strLit / c:numLit
330
        // c:strRef / c:numRef
331 32
        $referenceType = ($isReference ? 'Ref' : 'Lit');
332 32
        $dataType = 'str';
333 32
        if (is_int($values[0]) || is_float($values[0])) {
334 32
            $dataType = 'num';
335
        }
336 32
        $objWriter->startElement('c:' . $dataType . $referenceType);
337
338 32
        $numValues = count($values);
339 32
        if (!$isReference) {
340
            // Value
341
342
            // c:ptCount
343 32
            $objWriter->startElement('c:ptCount');
344 32
            $objWriter->writeAttribute('val', count($values));
345 32
            $objWriter->endElement();
346
347
            // Add points
348 32
            for ($i = 0; $i < $numValues; $i++) {
349
                // c:pt
350 32
                $objWriter->startElement('c:pt');
351 32
                $objWriter->writeAttribute('idx', $i);
352 32
                $objWriter->writeElement('c:v', $values[$i]);
353 32
                $objWriter->endElement();
354
            }
355
        } else {
356
            // Reference
357
            $objWriter->writeElement('c:f', $reference);
358
            $objWriter->startElement('c:' . $dataType . 'Cache');
359
360
            // c:ptCount
361
            $objWriter->startElement('c:ptCount');
362
            $objWriter->writeAttribute('val', count($values));
363
            $objWriter->endElement();
364
365
            // Add points
366
            for ($i = 0; $i < $numValues; $i++) {
367
                // c:pt
368
                $objWriter->startElement('c:pt');
369
                $objWriter->writeAttribute('idx', $i);
370
                $objWriter->writeElement('c:v', $values[$i]);
371
                $objWriter->endElement();
372
            }
373
374
            $objWriter->endElement();
375
        }
376
377 32
        $objWriter->endElement();
378 32
    }
379
380
    /**
381
     * Write Title
382
     *
383
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
384
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Title $subject
385
     * @throws \Exception
386
     */
387 36
    protected function writeTitle(XMLWriter $objWriter, Title $subject)
388
    {
389
        // c:title
390 36
        $objWriter->startElement('c:title');
391
392
        // c:tx
393 36
        $objWriter->startElement('c:tx');
394
395
        // c:rich
396 36
        $objWriter->startElement('c:rich');
397
398
        // a:bodyPr
399 36
        $objWriter->writeElement('a:bodyPr', null);
400
401
        // a:lstStyle
402 36
        $objWriter->writeElement('a:lstStyle', null);
403
404
        // a:p
405 36
        $objWriter->startElement('a:p');
406
407
        // a:pPr
408 36
        $objWriter->startElement('a:pPr');
409 36
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
410 36
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
411 36
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
412 36
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
413 36
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
414 36
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
415
416
        // a:defRPr
417 36
        $objWriter->writeElement('a:defRPr', null);
418
419 36
        $objWriter->endElement();
420
421
        // a:r
422 36
        $objWriter->startElement('a:r');
423
424
        // a:rPr
425 36
        $objWriter->startElement('a:rPr');
426 36
        $objWriter->writeAttribute('lang', 'en-US');
427 36
        $objWriter->writeAttribute('dirty', '0');
428
429 36
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
430 36
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
431 36
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
432 36
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
433 36
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
434 36
        $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '30000');
435 36
        $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-25000');
436
437
        // Font - a:solidFill
438 36
        $objWriter->startElement('a:solidFill');
439
440 36
        $this->writeColor($objWriter, $subject->getFont()->getColor());
441
442 36
        $objWriter->endElement();
443
444
        // Font - a:latin
445 36
        $objWriter->startElement('a:latin');
446 36
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
447 36
        $objWriter->endElement();
448
449 36
        $objWriter->endElement();
450
451
        // a:t
452 36
        $objWriter->writeElement('a:t', $subject->getText());
453
454 36
        $objWriter->endElement();
455
456
        // a:endParaRPr
457 36
        $objWriter->startElement('a:endParaRPr');
458 36
        $objWriter->writeAttribute('lang', 'en-US');
459 36
        $objWriter->writeAttribute('dirty', '0');
460 36
        $objWriter->endElement();
461
462 36
        $objWriter->endElement();
463
464 36
        $objWriter->endElement();
465
466 36
        $objWriter->endElement();
467
468
        // Write layout
469 36
        $this->writeLayout($objWriter, $subject);
470
471
        // c:overlay
472 36
        $objWriter->startElement('c:overlay');
473 36
        $objWriter->writeAttribute('val', '0');
474 36
        $objWriter->endElement();
475
476 36
        $objWriter->endElement();
477 36
    }
478
479
    /**
480
     * Write Plot Area
481
     *
482
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
483
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\PlotArea $subject
484
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
485
     * @throws \Exception
486
     */
487 37
    protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart)
488
    {
489
        // c:plotArea
490 37
        $objWriter->startElement('c:plotArea');
491
492
        // Write layout
493 37
        $this->writeLayout($objWriter, $subject);
494
495
        // Write chart
496 37
        $chartType = $subject->getType();
497 37
        if ($chartType instanceof Area) {
498 1
            $this->writeTypeArea($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
499 36
        } elseif ($chartType instanceof Bar) {
500 3
            $this->writeTypeBar($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
501 33
        } elseif ($chartType instanceof Bar3D) {
502 4
            $this->writeTypeBar3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
503 29
        } elseif ($chartType instanceof Doughnut) {
504 1
            $this->writeTypeDoughnut($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
505 28
        } elseif ($chartType instanceof Pie) {
506 2
            $this->writeTypePie($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
507 26
        } elseif ($chartType instanceof Pie3D) {
508 4
            $this->writeTypePie3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
509 22
        } elseif ($chartType instanceof Line) {
510 15
            $this->writeTypeLine($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
511 7
        } elseif ($chartType instanceof Radar) {
512 1
            $this->writeTypeRadar($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
513 6
        } elseif ($chartType instanceof Scatter) {
514 5
            $this->writeTypeScatter($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
515
        } else {
516 1
            throw new \Exception('The chart type provided could not be rendered.');
517
        }
518
519
        // Write X axis?
520 36
        if ($chartType->hasAxisX()) {
521 29
            $this->writeAxis($objWriter, $subject->getAxisX(), Chart\Axis::AXIS_X, $chartType);
522
        }
523
524
        // Write Y axis?
525 36
        if ($chartType->hasAxisY()) {
526 29
            $this->writeAxis($objWriter, $subject->getAxisY(), Chart\Axis::AXIS_Y, $chartType);
527
        }
528
529 36
        $objWriter->endElement();
530 36
    }
531
532
    /**
533
     * Write Legend
534
     *
535
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
536
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Legend $subject
537
     * @throws \Exception
538
     */
539 36
    protected function writeLegend(XMLWriter $objWriter, Legend $subject)
540
    {
541
        // c:legend
542 36
        $objWriter->startElement('c:legend');
543
544
        // c:legendPos
545 36
        $objWriter->startElement('c:legendPos');
546 36
        $objWriter->writeAttribute('val', $subject->getPosition());
547 36
        $objWriter->endElement();
548
549
        // Write layout
550 36
        $this->writeLayout($objWriter, $subject);
551
552
        // c:overlay
553 36
        $objWriter->startElement('c:overlay');
554 36
        $objWriter->writeAttribute('val', '0');
555 36
        $objWriter->endElement();
556
557
        // c:spPr
558 36
        $objWriter->startElement('c:spPr');
559
560
        // Fill
561 36
        $this->writeFill($objWriter, $subject->getFill());
562
563
        // Border
564 36
        if ($subject->getBorder()->getLineStyle() != Border::LINE_NONE) {
565 36
            $this->writeBorder($objWriter, $subject->getBorder(), '');
566
        }
567
568 36
        $objWriter->endElement();
569
570
        // c:txPr
571 36
        $objWriter->startElement('c:txPr');
572
573
        // a:bodyPr
574 36
        $objWriter->writeElement('a:bodyPr', null);
575
576
        // a:lstStyle
577 36
        $objWriter->writeElement('a:lstStyle', null);
578
579
        // a:p
580 36
        $objWriter->startElement('a:p');
581
582
        // a:pPr
583 36
        $objWriter->startElement('a:pPr');
584 36
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
585 36
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
586 36
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
587 36
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
588 36
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
589 36
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
590
591
        // a:defRPr
592 36
        $objWriter->startElement('a:defRPr');
593
594 36
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
595 36
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
596 36
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
597 36
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
598 36
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
599 36
        $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '30000');
600 36
        $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-25000');
601
602
        // Font - a:solidFill
603 36
        $objWriter->startElement('a:solidFill');
604
605 36
        $this->writeColor($objWriter, $subject->getFont()->getColor());
606
607 36
        $objWriter->endElement();
608
609
        // Font - a:latin
610 36
        $objWriter->startElement('a:latin');
611 36
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
612 36
        $objWriter->endElement();
613
614 36
        $objWriter->endElement();
615
616 36
        $objWriter->endElement();
617
618
        // a:endParaRPr
619 36
        $objWriter->startElement('a:endParaRPr');
620 36
        $objWriter->writeAttribute('lang', 'en-US');
621 36
        $objWriter->writeAttribute('dirty', '0');
622 36
        $objWriter->endElement();
623
624 36
        $objWriter->endElement();
625
626 36
        $objWriter->endElement();
627
628 36
        $objWriter->endElement();
629 36
    }
630
631
    /**
632
     * Write Layout
633
     *
634
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
635
     * @param  mixed $subject
636
     * @throws \Exception
637
     */
638 37
    protected function writeLayout(XMLWriter $objWriter, $subject)
639
    {
640
        // c:layout
641 37
        $objWriter->startElement('c:layout');
642
643
        // c:manualLayout
644 37
        $objWriter->startElement('c:manualLayout');
645
        // c:xMode
646 37
        $objWriter->startElement('c:xMode');
647 37
        $objWriter->writeAttribute('val', 'edge');
648 37
        $objWriter->endElement();
649
650
        // c:yMode
651 37
        $objWriter->startElement('c:yMode');
652 37
        $objWriter->writeAttribute('val', 'edge');
653 37
        $objWriter->endElement();
654
655 37
        if ($subject->getOffsetX() != 0) {
656
            // c:x
657 36
            $objWriter->startElement('c:x');
658 36
            $objWriter->writeAttribute('val', $subject->getOffsetX());
659 36
            $objWriter->endElement();
660
        }
661
662 37
        if ($subject->getOffsetY() != 0) {
663
            // c:y
664 36
            $objWriter->startElement('c:y');
665 36
            $objWriter->writeAttribute('val', $subject->getOffsetY());
666 36
            $objWriter->endElement();
667
        }
668
669 37
        if ($subject->getWidth() != 0) {
670
            // c:w
671
            $objWriter->startElement('c:w');
672
            $objWriter->writeAttribute('val', $subject->getWidth());
673
            $objWriter->endElement();
674
        }
675
676 37
        if ($subject->getHeight() != 0) {
677
            // c:h
678
            $objWriter->startElement('c:h');
679
            $objWriter->writeAttribute('val', $subject->getHeight());
680
            $objWriter->endElement();
681
        }
682
683 37
        $objWriter->endElement();
684 37
        $objWriter->endElement();
685 37
    }
686
687
    /**
688
     * Write Type Area
689
     *
690
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
691
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Area $subject
692
     * @param  boolean $includeSheet
693
     * @throws \Exception
694
     */
695 1
    protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSheet = false)
696
    {
697
        // c:lineChart
698 1
        $objWriter->startElement('c:areaChart');
699
700
        // c:grouping
701 1
        $objWriter->startElement('c:grouping');
702 1
        $objWriter->writeAttribute('val', 'standard');
703 1
        $objWriter->endElement();
704
705
        // Write series
706 1
        $seriesIndex = 0;
707 1
        foreach ($subject->getSeries() as $series) {
708
            // c:ser
709 1
            $objWriter->startElement('c:ser');
710
711
            // c:ser > c:idx
712 1
            $objWriter->startElement('c:idx');
713 1
            $objWriter->writeAttribute('val', $seriesIndex);
714 1
            $objWriter->endElement();
715
716
            // c:ser > c:order
717 1
            $objWriter->startElement('c:order');
718 1
            $objWriter->writeAttribute('val', $seriesIndex);
719 1
            $objWriter->endElement();
720
721
            // c:ser > c:tx
722 1
            $objWriter->startElement('c:tx');
723 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
724 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
725 1
            $objWriter->endElement();
726
727
            // c:ser > c:dLbls
728
            // @link : https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.areachartseries.aspx
729 1
            $objWriter->startElement('c:dLbls');
730
731
            // c:ser > c:dLbls > c:showVal
732 1
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
733
734
            // c:ser > c:dLbls > c:showCatName
735 1
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
736
737
            // c:ser > c:dLbls > c:showSerName
738 1
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
739
740
            // c:ser > c:dLbls > c:showPercent
741 1
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
742
743
            // c:ser > ##c:dLbls
744 1
            $objWriter->endElement();
745
746 1
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
747
                // c:spPr
748
                $objWriter->startElement('c:spPr');
749
                // Write fill
750
                $this->writeFill($objWriter, $series->getFill());
751
                // ## c:spPr
752
                $objWriter->endElement();
753
            }
754
755
            // Write X axis data
756 1
            $axisXData = array_keys($series->getValues());
757
758
            // c:cat
759 1
            $objWriter->startElement('c:cat');
760 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
761 1
            $objWriter->endElement();
762
763
            // Write Y axis data
764 1
            $axisYData = array_values($series->getValues());
765
766
            // c:val
767 1
            $objWriter->startElement('c:val');
768 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
769 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
770 1
            $objWriter->endElement();
771
772 1
            $objWriter->endElement();
773
774 1
            ++$seriesIndex;
775
        }
776
777
        // c:axId
778 1
        $objWriter->startElement('c:axId');
779 1
        $objWriter->writeAttribute('val', '52743552');
780 1
        $objWriter->endElement();
781
782
        // c:axId
783 1
        $objWriter->startElement('c:axId');
784 1
        $objWriter->writeAttribute('val', '52749440');
785 1
        $objWriter->endElement();
786
787 1
        $objWriter->endElement();
788 1
    }
789
790
    /**
791
     * Write Type Bar
792
     *
793
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
794
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar $subject
795
     * @param  boolean $includeSheet
796
     * @throws \Exception
797
     */
798 3
    protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, $includeSheet = false)
799
    {
800
        // c:bar3DChart
801 3
        $objWriter->startElement('c:barChart');
802
803
        // c:barDir
804 3
        $objWriter->startElement('c:barDir');
805 3
        $objWriter->writeAttribute('val', $subject->getBarDirection());
806 3
        $objWriter->endElement();
807
808
        // c:grouping
809 3
        $objWriter->startElement('c:grouping');
810 3
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
811 3
        $objWriter->endElement();
812
813
        // Write series
814 3
        $seriesIndex = 0;
815 3
        foreach ($subject->getSeries() as $series) {
816
            // c:ser
817 3
            $objWriter->startElement('c:ser');
818
819
            // c:idx
820 3
            $objWriter->startElement('c:idx');
821 3
            $objWriter->writeAttribute('val', $seriesIndex);
822 3
            $objWriter->endElement();
823
824
            // c:order
825 3
            $objWriter->startElement('c:order');
826 3
            $objWriter->writeAttribute('val', $seriesIndex);
827 3
            $objWriter->endElement();
828
829
            // c:tx
830 3
            $objWriter->startElement('c:tx');
831 3
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
832 3
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
833 3
            $objWriter->endElement();
834
835
            // Fills for points?
836 3
            $dataPointFills = $series->getDataPointFills();
837 3
            foreach ($dataPointFills as $key => $value) {
838
                // c:dPt
839 1
                $objWriter->startElement('c:dPt');
840
841
                // c:idx
842 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
843
844 1
                if ($value->getFillType() != Fill::FILL_NONE) {
845
                    // c:spPr
846 1
                    $objWriter->startElement('c:spPr');
847
                    // Write fill
848 1
                    $this->writeFill($objWriter, $value);
849
                    // ## c:spPr
850 1
                    $objWriter->endElement();
851
                }
852
853
                // ## c:dPt
854 1
                $objWriter->endElement();
855
            }
856
857
            // c:dLbls
858 3
            $objWriter->startElement('c:dLbls');
859
860 3
            if ($series->hasDlblNumFormat()) {
861
                //c:numFmt
862
                $objWriter->startElement('c:numFmt');
863
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
864
                $objWriter->writeAttribute('sourceLinked', '0');
865
                $objWriter->endElement();
866
            }
867
868
            // c:txPr
869 3
            $objWriter->startElement('c:txPr');
870
871
            // a:bodyPr
872 3
            $objWriter->writeElement('a:bodyPr', null);
873
874
            // a:lstStyle
875 3
            $objWriter->writeElement('a:lstStyle', null);
876
877
            // a:p
878 3
            $objWriter->startElement('a:p');
879
880
            // a:pPr
881 3
            $objWriter->startElement('a:pPr');
882
883
            // a:defRPr
884 3
            $objWriter->startElement('a:defRPr');
885
886 3
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
887 3
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
888 3
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
889 3
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
890 3
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
891 3
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
892 3
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
893
894
            // Font - a:solidFill
895 3
            $objWriter->startElement('a:solidFill');
896
897 3
            $this->writeColor($objWriter, $series->getFont()->getColor());
898
899 3
            $objWriter->endElement();
900
901
            // Font - a:latin
902 3
            $objWriter->startElement('a:latin');
903 3
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
904 3
            $objWriter->endElement();
905
906 3
            $objWriter->endElement();
907
908 3
            $objWriter->endElement();
909
910
            // a:endParaRPr
911 3
            $objWriter->startElement('a:endParaRPr');
912 3
            $objWriter->writeAttribute('lang', 'en-US');
913 3
            $objWriter->writeAttribute('dirty', '0');
914 3
            $objWriter->endElement();
915
916 3
            $objWriter->endElement();
917
918 3
            $objWriter->endElement();
919
920
            // c:dLblPos
921 3
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
922
923
            // c:showVal
924 3
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
925
926
            // c:showCatName
927 3
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
928
929
            // c:showSerName
930 3
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
931
932
            // c:showPercent
933 3
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
934
935
            // c:showLeaderLines
936 3
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
937
938
            // c:separator
939 3
            $objWriter->writeElementIf($series->hasShowSeparator(), 'c:separator', 'val', $series->getSeparator());
940
941 3
            $objWriter->endElement();
942
943
            // c:spPr
944 3
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
945
                // c:spPr
946
                $objWriter->startElement('c:spPr');
947
                // Write fill
948
                $this->writeFill($objWriter, $series->getFill());
949
                // ## c:spPr
950
                $objWriter->endElement();
951
            }
952
953
            // Write X axis data
954 3
            $axisXData = array_keys($series->getValues());
955
956
            // c:cat
957 3
            $objWriter->startElement('c:cat');
958 3
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
959 3
            $objWriter->endElement();
960
961
            // Write Y axis data
962 3
            $axisYData = array_values($series->getValues());
963
964
            // c:val
965 3
            $objWriter->startElement('c:val');
966 3
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
967 3
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
968 3
            $objWriter->endElement();
969
970 3
            $objWriter->endElement();
971
972 3
            ++$seriesIndex;
973
        }
974
975
        // c:overlap
976 3
        $objWriter->startElement('c:overlap');
977 3
        if ($subject->getBarGrouping() == Bar::GROUPING_CLUSTERED) {
978 3
            $objWriter->writeAttribute('val', '0');
979
        } elseif ($subject->getBarGrouping() == Bar::GROUPING_STACKED || $subject->getBarGrouping() == Bar::GROUPING_PERCENTSTACKED) {
980
            $objWriter->writeAttribute('val', '100');
981
        }
982 3
        $objWriter->endElement();
983
984
        // c:gapWidth
985 3
        $objWriter->startElement('c:gapWidth');
986 3
        $objWriter->writeAttribute('val', $subject->getGapWidthPercent());
987 3
        $objWriter->endElement();
988
989
        // c:shape
990 3
        $objWriter->startElement('c:shape');
991 3
        $objWriter->writeAttribute('val', 'box');
992 3
        $objWriter->endElement();
993
994
        // c:axId
995 3
        $objWriter->startElement('c:axId');
996 3
        $objWriter->writeAttribute('val', '52743552');
997 3
        $objWriter->endElement();
998
999
        // c:axId
1000 3
        $objWriter->startElement('c:axId');
1001 3
        $objWriter->writeAttribute('val', '52749440');
1002 3
        $objWriter->endElement();
1003
1004
        // c:axId
1005 3
        $objWriter->startElement('c:axId');
1006 3
        $objWriter->writeAttribute('val', '0');
1007 3
        $objWriter->endElement();
1008
1009 3
        $objWriter->endElement();
1010 3
    }
1011
1012
    /**
1013
     * Write Type Bar3D
1014
     *
1015
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1016
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D $subject
1017
     * @param  boolean $includeSheet
1018
     * @throws \Exception
1019
     */
1020 4
    protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, $includeSheet = false)
1021
    {
1022
        // c:bar3DChart
1023 4
        $objWriter->startElement('c:bar3DChart');
1024
1025
        // c:barDir
1026 4
        $objWriter->startElement('c:barDir');
1027 4
        $objWriter->writeAttribute('val', $subject->getBarDirection());
1028 4
        $objWriter->endElement();
1029
1030
        // c:grouping
1031 4
        $objWriter->startElement('c:grouping');
1032 4
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
1033 4
        $objWriter->endElement();
1034
1035
        // Write series
1036 4
        $seriesIndex = 0;
1037 4
        foreach ($subject->getSeries() as $series) {
1038
            // c:ser
1039 4
            $objWriter->startElement('c:ser');
1040
1041
            // c:idx
1042 4
            $objWriter->startElement('c:idx');
1043 4
            $objWriter->writeAttribute('val', $seriesIndex);
1044 4
            $objWriter->endElement();
1045
1046
            // c:order
1047 4
            $objWriter->startElement('c:order');
1048 4
            $objWriter->writeAttribute('val', $seriesIndex);
1049 4
            $objWriter->endElement();
1050
1051
            // c:tx
1052 4
            $objWriter->startElement('c:tx');
1053 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1054 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1055 4
            $objWriter->endElement();
1056
1057
            // Fills for points?
1058 4
            $dataPointFills = $series->getDataPointFills();
1059 4
            foreach ($dataPointFills as $key => $value) {
1060
                // c:dPt
1061 1
                $objWriter->startElement('c:dPt');
1062
1063
                // c:idx
1064 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1065
1066 1
                if ($value->getFillType() != Fill::FILL_NONE) {
1067
                    // c:spPr
1068 1
                    $objWriter->startElement('c:spPr');
1069
                    // Write fill
1070 1
                    $this->writeFill($objWriter, $value);
1071
                    // ## c:spPr
1072 1
                    $objWriter->endElement();
1073
                }
1074
1075
                // ## c:dPt
1076 1
                $objWriter->endElement();
1077
            }
1078
1079
            // c:dLbls
1080 4
            $objWriter->startElement('c:dLbls');
1081
1082
            // c:txPr
1083 4
            $objWriter->startElement('c:txPr');
1084
1085
            // a:bodyPr
1086 4
            $objWriter->writeElement('a:bodyPr', null);
1087
1088
            // a:lstStyle
1089 4
            $objWriter->writeElement('a:lstStyle', null);
1090
1091
            // a:p
1092 4
            $objWriter->startElement('a:p');
1093
1094
            // a:pPr
1095 4
            $objWriter->startElement('a:pPr');
1096
1097
            // a:defRPr
1098 4
            $objWriter->startElement('a:defRPr');
1099
1100 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1101 4
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1102 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1103 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1104 4
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1105 4
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
1106 4
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
1107
1108
            // Font - a:solidFill
1109 4
            $objWriter->startElement('a:solidFill');
1110
1111 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1112
1113 4
            $objWriter->endElement();
1114
1115
            // Font - a:latin
1116 4
            $objWriter->startElement('a:latin');
1117 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1118 4
            $objWriter->endElement();
1119
1120 4
            $objWriter->endElement();
1121
1122 4
            $objWriter->endElement();
1123
1124
            // a:endParaRPr
1125 4
            $objWriter->startElement('a:endParaRPr');
1126 4
            $objWriter->writeAttribute('lang', 'en-US');
1127 4
            $objWriter->writeAttribute('dirty', '0');
1128 4
            $objWriter->endElement();
1129
1130 4
            $objWriter->endElement();
1131
1132 4
            $objWriter->endElement();
1133
1134
            // c:showVal
1135 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1136
1137
            // c:showCatName
1138 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1139
1140
            // c:showSerName
1141 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1142
1143
            // c:showPercent
1144 4
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1145
1146
            // c:showLeaderLines
1147 4
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1148
1149
            // c:separator
1150 4
            $objWriter->writeElementIf($series->hasShowSeparator(), 'c:separator', 'val', $series->getSeparator());
1151
1152 4
            $objWriter->endElement();
1153
1154
            // c:spPr
1155 4
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
1156
                // c:spPr
1157
                $objWriter->startElement('c:spPr');
1158
                // Write fill
1159
                $this->writeFill($objWriter, $series->getFill());
1160
                // ## c:spPr
1161
                $objWriter->endElement();
1162
            }
1163
1164
            // Write X axis data
1165 4
            $axisXData = array_keys($series->getValues());
1166
1167
            // c:cat
1168 4
            $objWriter->startElement('c:cat');
1169 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1170 4
            $objWriter->endElement();
1171
1172
            // Write Y axis data
1173 4
            $axisYData = array_values($series->getValues());
1174
1175
            // c:val
1176 4
            $objWriter->startElement('c:val');
1177 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1178 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1179 4
            $objWriter->endElement();
1180
1181 4
            $objWriter->endElement();
1182
1183 4
            ++$seriesIndex;
1184
        }
1185
1186
        // c:gapWidth
1187 4
        $objWriter->startElement('c:gapWidth');
1188 4
        $objWriter->writeAttribute('val', $subject->getGapWidthPercent());
1189 4
        $objWriter->endElement();
1190
1191
        // c:shape
1192 4
        $objWriter->startElement('c:shape');
1193 4
        $objWriter->writeAttribute('val', 'box');
1194 4
        $objWriter->endElement();
1195
1196
        // c:axId
1197 4
        $objWriter->startElement('c:axId');
1198 4
        $objWriter->writeAttribute('val', '52743552');
1199 4
        $objWriter->endElement();
1200
1201
        // c:axId
1202 4
        $objWriter->startElement('c:axId');
1203 4
        $objWriter->writeAttribute('val', '52749440');
1204 4
        $objWriter->endElement();
1205
1206
        // c:axId
1207 4
        $objWriter->startElement('c:axId');
1208 4
        $objWriter->writeAttribute('val', '0');
1209 4
        $objWriter->endElement();
1210
1211 4
        $objWriter->endElement();
1212 4
    }
1213
1214
    /**
1215
     * Write Type Pie
1216
     *
1217
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1218
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut $subject
1219
     * @param  boolean $includeSheet
1220
     * @throws \Exception
1221
     */
1222 1
    protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, $includeSheet = false)
1223
    {
1224
        // c:pieChart
1225 1
        $objWriter->startElement('c:doughnutChart');
1226
1227
        // c:varyColors
1228 1
        $objWriter->startElement('c:varyColors');
1229 1
        $objWriter->writeAttribute('val', '1');
1230 1
        $objWriter->endElement();
1231
1232
        // Write series
1233 1
        $seriesIndex = 0;
1234 1
        foreach ($subject->getSeries() as $series) {
1235
            // c:ser
1236 1
            $objWriter->startElement('c:ser');
1237
1238
            // c:idx
1239 1
            $objWriter->startElement('c:idx');
1240 1
            $objWriter->writeAttribute('val', $seriesIndex);
1241 1
            $objWriter->endElement();
1242
1243
            // c:order
1244 1
            $objWriter->startElement('c:order');
1245 1
            $objWriter->writeAttribute('val', $seriesIndex);
1246 1
            $objWriter->endElement();
1247
1248
            // c:tx
1249 1
            $objWriter->startElement('c:tx');
1250 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1251 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1252 1
            $objWriter->endElement();
1253
1254
            // Fills for points?
1255 1
            $dataPointFills = $series->getDataPointFills();
1256 1
            foreach ($dataPointFills as $key => $value) {
1257
                // c:dPt
1258 1
                $objWriter->startElement('c:dPt');
1259 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1260
                // c:dPt/c:spPr
1261 1
                $objWriter->startElement('c:spPr');
1262 1
                $this->writeFill($objWriter, $value);
1263
                // c:dPt/##c:spPr
1264 1
                $objWriter->endElement();
1265
                // ##c:dPt
1266 1
                $objWriter->endElement();
1267
            }
1268
1269
            // Write X axis data
1270 1
            $axisXData = array_keys($series->getValues());
1271
1272
            // c:cat
1273 1
            $objWriter->startElement('c:cat');
1274 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1275 1
            $objWriter->endElement();
1276
1277
            // Write Y axis data
1278 1
            $axisYData = array_values($series->getValues());
1279
1280
            // c:val
1281 1
            $objWriter->startElement('c:val');
1282 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1283 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1284 1
            $objWriter->endElement();
1285
1286 1
            $objWriter->endElement();
1287
1288 1
            ++$seriesIndex;
1289
        }
1290
1291
        // c:dLbls
1292 1
        $objWriter->startElement('c:dLbls');
1293
1294 1
        $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
0 ignored issues
show
Bug introduced by
The variable $series seems to be defined by a foreach iteration on line 1234. Are you sure the iterator is never empty, otherwise this variable is not defined?

It seems like you are relying on a variable being defined by an iteration:

foreach ($a as $b) {
}

// $b is defined here only if $a has elements, for example if $a is array()
// then $b would not be defined here. To avoid that, we recommend to set a
// default value for $b.


// Better
$b = 0; // or whatever default makes sense in your context
foreach ($a as $b) {
}

// $b is now guaranteed to be defined here.
Loading history...
1295 1
        $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1296 1
        $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1297 1
        $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1298 1
        $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1299 1
        $this->writeElementWithValAttribute($objWriter, 'c:showBubbleSize', '0');
1300 1
        $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1301
1302 1
        if ($series->hasDlblNumFormat()) {
1303
            //c:numFmt
1304
            $objWriter->startElement('c:numFmt');
1305
            $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
1306
            $objWriter->writeAttribute('sourceLinked', '0');
1307
            $objWriter->endElement();
1308
        }
1309
1310
        // c:dLbls\c:txPr
1311 1
        $objWriter->startElement('c:txPr');
1312 1
        $objWriter->writeElement('a:bodyPr', null);
1313 1
        $objWriter->writeElement('a:lstStyle', null);
1314
1315
        // c:dLbls\c:txPr\a:p
1316 1
        $objWriter->startElement('a:p');
1317
1318
        // c:dLbls\c:txPr\a:p\a:pPr
1319 1
        $objWriter->startElement('a:pPr');
1320
1321
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr
1322 1
        $objWriter->startElement('a:defRPr');
1323 1
        $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1324 1
        $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1325 1
        $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1326 1
        $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1327 1
        $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1328 1
        $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
1329 1
        $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
1330
1331
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:solidFill
1332 1
        $objWriter->startElement('a:solidFill');
1333 1
        $this->writeColor($objWriter, $series->getFont()->getColor());
1334 1
        $objWriter->endElement();
1335
1336
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:latin
1337 1
        $objWriter->startElement('a:latin');
1338 1
        $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1339 1
        $objWriter->endElement();
1340
1341
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\
1342 1
        $objWriter->endElement();
1343
        // c:dLbls\c:txPr\a:p\a:pPr\
1344 1
        $objWriter->endElement();
1345
1346
        // c:dLbls\c:txPr\a:p\a:endParaRPr
1347 1
        $objWriter->startElement('a:endParaRPr');
1348 1
        $objWriter->writeAttribute('lang', 'en-US');
1349 1
        $objWriter->writeAttribute('dirty', '0');
1350 1
        $objWriter->endElement();
1351
1352
        // c:dLbls\c:txPr\a:p\
1353 1
        $objWriter->endElement();
1354
        // c:dLbls\c:txPr\
1355 1
        $objWriter->endElement();
1356
1357 1
        $separator = $series->getSeparator();
1358 1
        if (!empty($separator) && $separator != PHP_EOL) {
1359
            // c:dLbls\c:separator
1360 1
            $objWriter->writeElement('c:separator', $separator);
1361
        }
1362
1363
        // c:dLbls\
1364 1
        $objWriter->endElement();
1365
1366 1
        $this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', '0');
1367 1
        $this->writeElementWithValAttribute($objWriter, 'c:holeSize', $subject->getHoleSize());
1368
1369 1
        $objWriter->endElement();
1370 1
    }
1371
1372
    /**
1373
     * Write Type Pie
1374
     *
1375
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1376
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie $subject
1377
     * @param  boolean $includeSheet
1378
     * @throws \Exception
1379
     */
1380 2
    protected function writeTypePie(XMLWriter $objWriter, Pie $subject, $includeSheet = false)
1381
    {
1382
        // c:pieChart
1383 2
        $objWriter->startElement('c:pieChart');
1384
1385
        // c:varyColors
1386 2
        $objWriter->startElement('c:varyColors');
1387 2
        $objWriter->writeAttribute('val', '1');
1388 2
        $objWriter->endElement();
1389
1390
        // Write series
1391 2
        $seriesIndex = 0;
1392 2
        foreach ($subject->getSeries() as $series) {
1393
            // c:ser
1394 2
            $objWriter->startElement('c:ser');
1395
1396
            // c:idx
1397 2
            $objWriter->startElement('c:idx');
1398 2
            $objWriter->writeAttribute('val', $seriesIndex);
1399 2
            $objWriter->endElement();
1400
1401
            // c:order
1402 2
            $objWriter->startElement('c:order');
1403 2
            $objWriter->writeAttribute('val', $seriesIndex);
1404 2
            $objWriter->endElement();
1405
1406
            // c:tx
1407 2
            $objWriter->startElement('c:tx');
1408 2
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1409 2
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1410 2
            $objWriter->endElement();
1411
1412
            // Fills for points?
1413 2
            $dataPointFills = $series->getDataPointFills();
1414 2
            foreach ($dataPointFills as $key => $value) {
1415
                // c:dPt
1416 1
                $objWriter->startElement('c:dPt');
1417 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1418
                // c:dPt/c:spPr
1419 1
                $objWriter->startElement('c:spPr');
1420 1
                $this->writeFill($objWriter, $value);
1421
                // c:dPt/##c:spPr
1422 1
                $objWriter->endElement();
1423
                // ##c:dPt
1424 1
                $objWriter->endElement();
1425
            }
1426
1427
            // c:dLbls
1428 2
            $objWriter->startElement('c:dLbls');
1429
1430 2
            if ($series->hasDlblNumFormat()) {
1431
                //c:numFmt
1432
                $objWriter->startElement('c:numFmt');
1433
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
1434
                $objWriter->writeAttribute('sourceLinked', '0');
1435
                $objWriter->endElement();
1436
            }
1437
1438
            // c:txPr
1439 2
            $objWriter->startElement('c:txPr');
1440
1441
            // a:bodyPr
1442 2
            $objWriter->writeElement('a:bodyPr', null);
1443
1444
            // a:lstStyle
1445 2
            $objWriter->writeElement('a:lstStyle', null);
1446
1447
            // a:p
1448 2
            $objWriter->startElement('a:p');
1449
1450
            // a:pPr
1451 2
            $objWriter->startElement('a:pPr');
1452
1453
            // a:defRPr
1454 2
            $objWriter->startElement('a:defRPr');
1455
1456 2
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1457 2
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1458 2
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1459 2
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1460 2
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1461 2
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
1462 2
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
1463
1464
            // Font - a:solidFill
1465 2
            $objWriter->startElement('a:solidFill');
1466
1467 2
            $this->writeColor($objWriter, $series->getFont()->getColor());
1468
1469 2
            $objWriter->endElement();
1470
1471
            // Font - a:latin
1472 2
            $objWriter->startElement('a:latin');
1473 2
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1474 2
            $objWriter->endElement();
1475
1476 2
            $objWriter->endElement();
1477
1478 2
            $objWriter->endElement();
1479
1480
            // a:endParaRPr
1481 2
            $objWriter->startElement('a:endParaRPr');
1482 2
            $objWriter->writeAttribute('lang', 'en-US');
1483 2
            $objWriter->writeAttribute('dirty', '0');
1484 2
            $objWriter->endElement();
1485
1486 2
            $objWriter->endElement();
1487
1488 2
            $objWriter->endElement();
1489
1490
            // c:dLblPos
1491 2
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1492
1493
            // c:showLegendKey
1494 2
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
1495
1496
            // c:showVal
1497 2
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1498
1499
            // c:showCatName
1500 2
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1501
1502
            // c:showSerName
1503 2
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1504
1505
            // c:showPercent
1506 2
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1507
1508
            // c:showLeaderLines
1509 2
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1510
1511
            // c:separator
1512 2
            $objWriter->writeElementIf($series->hasShowSeparator(), 'c:separator', 'val', $series->getSeparator());
1513
1514 2
            $objWriter->endElement();
1515
1516
            // Write X axis data
1517 2
            $axisXData = array_keys($series->getValues());
1518
1519
            // c:cat
1520 2
            $objWriter->startElement('c:cat');
1521 2
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1522 2
            $objWriter->endElement();
1523
1524
            // Write Y axis data
1525 2
            $axisYData = array_values($series->getValues());
1526
1527
            // c:val
1528 2
            $objWriter->startElement('c:val');
1529 2
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1530 2
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1531 2
            $objWriter->endElement();
1532
1533 2
            $objWriter->endElement();
1534
1535 2
            ++$seriesIndex;
1536
        }
1537
1538 2
        $objWriter->endElement();
1539 2
    }
1540
1541
    /**
1542
     * Write Type Pie3D
1543
     *
1544
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1545
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D $subject
1546
     * @param  boolean $includeSheet
1547
     * @throws \Exception
1548
     */
1549 4
    protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, $includeSheet = false)
1550
    {
1551
        // c:pie3DChart
1552 4
        $objWriter->startElement('c:pie3DChart');
1553
1554
        // c:varyColors
1555 4
        $objWriter->startElement('c:varyColors');
1556 4
        $objWriter->writeAttribute('val', '1');
1557 4
        $objWriter->endElement();
1558
1559
        // Write series
1560 4
        $seriesIndex = 0;
1561 4
        foreach ($subject->getSeries() as $series) {
1562
            // c:ser
1563 4
            $objWriter->startElement('c:ser');
1564
1565
            // c:idx
1566 4
            $objWriter->startElement('c:idx');
1567 4
            $objWriter->writeAttribute('val', $seriesIndex);
1568 4
            $objWriter->endElement();
1569
1570
            // c:order
1571 4
            $objWriter->startElement('c:order');
1572 4
            $objWriter->writeAttribute('val', $seriesIndex);
1573 4
            $objWriter->endElement();
1574
1575
            // c:tx
1576 4
            $objWriter->startElement('c:tx');
1577 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1578 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1579 4
            $objWriter->endElement();
1580
1581
            // c:explosion
1582 4
            $objWriter->startElement('c:explosion');
1583 4
            $objWriter->writeAttribute('val', $subject->getExplosion());
1584 4
            $objWriter->endElement();
1585
1586
            // Fills for points?
1587 4
            $dataPointFills = $series->getDataPointFills();
1588 4
            foreach ($dataPointFills as $key => $value) {
1589
                // c:dPt
1590 1
                $objWriter->startElement('c:dPt');
1591 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1592
                // c:dPt/c:spPr
1593 1
                $objWriter->startElement('c:spPr');
1594 1
                $this->writeFill($objWriter, $value);
1595
                // c:dPt/##c:spPr
1596 1
                $objWriter->endElement();
1597
                // ##c:dPt
1598 1
                $objWriter->endElement();
1599
            }
1600
1601
            // c:dLbls
1602 4
            $objWriter->startElement('c:dLbls');
1603
1604
            // c:txPr
1605 4
            $objWriter->startElement('c:txPr');
1606
1607
            // a:bodyPr
1608 4
            $objWriter->writeElement('a:bodyPr', null);
1609
1610
            // a:lstStyle
1611 4
            $objWriter->writeElement('a:lstStyle', null);
1612
1613
            // a:p
1614 4
            $objWriter->startElement('a:p');
1615
1616
            // a:pPr
1617 4
            $objWriter->startElement('a:pPr');
1618
1619
            // a:defRPr
1620 4
            $objWriter->startElement('a:defRPr');
1621
1622 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1623 4
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1624 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1625 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1626 4
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1627 4
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
1628 4
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
1629
1630
            // Font - a:solidFill
1631 4
            $objWriter->startElement('a:solidFill');
1632
1633 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1634
1635 4
            $objWriter->endElement();
1636
1637
            // Font - a:latin
1638 4
            $objWriter->startElement('a:latin');
1639 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1640 4
            $objWriter->endElement();
1641
1642 4
            $objWriter->endElement();
1643
1644 4
            $objWriter->endElement();
1645
1646
            // a:endParaRPr
1647 4
            $objWriter->startElement('a:endParaRPr');
1648 4
            $objWriter->writeAttribute('lang', 'en-US');
1649 4
            $objWriter->writeAttribute('dirty', '0');
1650 4
            $objWriter->endElement();
1651
1652 4
            $objWriter->endElement();
1653
1654 4
            $objWriter->endElement();
1655
1656
            // c:dLblPos
1657 4
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1658
1659
            // c:showVal
1660 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1661
1662
            // c:showCatName
1663 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1664
1665
            // c:showSerName
1666 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1667
1668
            // c:showPercent
1669 4
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1670
1671
            // c:showLeaderLines
1672 4
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1673
1674
            // c:separator
1675 4
            $objWriter->writeElementIf($series->hasShowSeparator(), 'c:separator', 'val', $series->getSeparator());
1676
1677 4
            $objWriter->endElement();
1678
1679
            // Write X axis data
1680 4
            $axisXData = array_keys($series->getValues());
1681
1682
            // c:cat
1683 4
            $objWriter->startElement('c:cat');
1684 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1685 4
            $objWriter->endElement();
1686
1687
            // Write Y axis data
1688 4
            $axisYData = array_values($series->getValues());
1689
1690
            // c:val
1691 4
            $objWriter->startElement('c:val');
1692 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1693 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1694 4
            $objWriter->endElement();
1695
1696 4
            $objWriter->endElement();
1697
1698 4
            ++$seriesIndex;
1699
        }
1700
1701 4
        $objWriter->endElement();
1702 4
    }
1703
1704
    /**
1705
     * Write Type Line
1706
     *
1707
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1708
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Line $subject
1709
     * @param  boolean $includeSheet
1710
     * @throws \Exception
1711
     */
1712 15
    protected function writeTypeLine(XMLWriter $objWriter, Line $subject, $includeSheet = false)
1713
    {
1714
        // c:lineChart
1715 15
        $objWriter->startElement('c:lineChart');
1716
1717
        // c:grouping
1718 15
        $objWriter->startElement('c:grouping');
1719 15
        $objWriter->writeAttribute('val', 'standard');
1720 15
        $objWriter->endElement();
1721
1722
        // Write series
1723 15
        $seriesIndex = 0;
1724 15
        foreach ($subject->getSeries() as $series) {
1725
            // c:ser
1726 11
            $objWriter->startElement('c:ser');
1727
1728
            // c:idx
1729 11
            $objWriter->startElement('c:idx');
1730 11
            $objWriter->writeAttribute('val', $seriesIndex);
1731 11
            $objWriter->endElement();
1732
1733
            // c:order
1734 11
            $objWriter->startElement('c:order');
1735 11
            $objWriter->writeAttribute('val', $seriesIndex);
1736 11
            $objWriter->endElement();
1737
1738
            // c:tx
1739 11
            $objWriter->startElement('c:tx');
1740 11
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1741 11
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1742 11
            $objWriter->endElement();
1743
1744
            // c:spPr
1745 11
            $objWriter->startElement('c:spPr');
1746
            // Write fill
1747 11
            $this->writeFill($objWriter, $series->getFill());
1748
            // Write outline
1749 11
            $this->writeOutline($objWriter, $series->getOutline());
1750
            // ## c:spPr
1751 11
            $objWriter->endElement();
1752
1753
            // Marker
1754 11
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1755
1756
            // c:dLbls
1757 11
            $objWriter->startElement('c:dLbls');
1758
1759
            // c:txPr
1760 11
            $objWriter->startElement('c:txPr');
1761
1762
            // a:bodyPr
1763 11
            $objWriter->writeElement('a:bodyPr', null);
1764
1765
            // a:lstStyle
1766 11
            $objWriter->writeElement('a:lstStyle', null);
1767
1768
            // a:p
1769 11
            $objWriter->startElement('a:p');
1770
1771
            // a:pPr
1772 11
            $objWriter->startElement('a:pPr');
1773
1774
            // a:defRPr
1775 11
            $objWriter->startElement('a:defRPr');
1776
1777 11
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1778 11
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1779 11
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1780 11
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1781 11
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1782 11
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
1783 11
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
1784
1785
            // Font - a:solidFill
1786 11
            $objWriter->startElement('a:solidFill');
1787
1788 11
            $this->writeColor($objWriter, $series->getFont()->getColor());
1789
1790 11
            $objWriter->endElement();
1791
1792
            // Font - a:latin
1793 11
            $objWriter->startElement('a:latin');
1794 11
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1795 11
            $objWriter->endElement();
1796
1797 11
            $objWriter->endElement();
1798
1799 11
            $objWriter->endElement();
1800
1801
            // a:endParaRPr
1802 11
            $objWriter->startElement('a:endParaRPr');
1803 11
            $objWriter->writeAttribute('lang', 'en-US');
1804 11
            $objWriter->writeAttribute('dirty', '0');
1805 11
            $objWriter->endElement();
1806
1807 11
            $objWriter->endElement();
1808
1809 11
            $objWriter->endElement();
1810
1811
            // c:showVal
1812 11
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1813
1814
            // c:showCatName
1815 11
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1816
1817
            // c:showSerName
1818 11
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1819
1820
            // c:showPercent
1821 11
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1822
1823
            // c:showLeaderLines
1824 11
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1825
1826
            // c:separator
1827 11
            $objWriter->writeElementIf($series->hasShowSeparator(), 'c:separator', 'val', $series->getSeparator());
1828
1829
            // > c:dLbls
1830 11
            $objWriter->endElement();
1831
1832
            // Write X axis data
1833 11
            $axisXData = array_keys($series->getValues());
1834
1835
            // c:cat
1836 11
            $objWriter->startElement('c:cat');
1837 11
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1838 11
            $objWriter->endElement();
1839
1840
            // Write Y axis data
1841 11
            $axisYData = array_values($series->getValues());
1842
1843
            // c:val
1844 11
            $objWriter->startElement('c:val');
1845 11
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1846 11
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1847 11
            $objWriter->endElement();
1848
1849 11
            $objWriter->endElement();
1850
1851 11
            ++$seriesIndex;
1852
        }
1853
1854
        // c:marker
1855 15
        $objWriter->startElement('c:marker');
1856 15
        $objWriter->writeAttribute('val', '1');
1857 15
        $objWriter->endElement();
1858
1859
        // c:smooth
1860 15
        $objWriter->startElement('c:smooth');
1861 15
        $objWriter->writeAttribute('val', '0');
1862 15
        $objWriter->endElement();
1863
1864
        // c:axId
1865 15
        $objWriter->startElement('c:axId');
1866 15
        $objWriter->writeAttribute('val', '52743552');
1867 15
        $objWriter->endElement();
1868
1869
        // c:axId
1870 15
        $objWriter->startElement('c:axId');
1871 15
        $objWriter->writeAttribute('val', '52749440');
1872 15
        $objWriter->endElement();
1873
1874 15
        $objWriter->endElement();
1875 15
    }
1876
1877
    /**
1878
     * Write Type Radar
1879
     *
1880
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1881
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Radar $subject
1882
     * @param  boolean $includeSheet
1883
     * @throws \Exception
1884
     */
1885 1
    protected function writeTypeRadar(XMLWriter $objWriter, Radar $subject, $includeSheet = false)
1886
    {
1887
        // c:scatterChart
1888 1
        $objWriter->startElement('c:radarChart');
1889
1890
        // c:radarStyle
1891 1
        $objWriter->startElement('c:radarStyle');
1892 1
        $objWriter->writeAttribute('val', 'marker');
1893 1
        $objWriter->endElement();
1894
1895
        // c:varyColors
1896 1
        $objWriter->startElement('c:varyColors');
1897 1
        $objWriter->writeAttribute('val', '0');
1898 1
        $objWriter->endElement();
1899
1900
        // Write series
1901 1
        $seriesIndex = 0;
1902 1
        foreach ($subject->getSeries() as $series) {
1903
            // c:ser
1904 1
            $objWriter->startElement('c:ser');
1905
1906
            // c:idx
1907 1
            $objWriter->startElement('c:idx');
1908 1
            $objWriter->writeAttribute('val', $seriesIndex);
1909 1
            $objWriter->endElement();
1910
1911
            // c:order
1912 1
            $objWriter->startElement('c:order');
1913 1
            $objWriter->writeAttribute('val', $seriesIndex);
1914 1
            $objWriter->endElement();
1915
1916
            // c:tx
1917 1
            $objWriter->startElement('c:tx');
1918 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1919 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1920 1
            $objWriter->endElement();
1921
1922
            // Marker
1923 1
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1924
1925
            // c:dLbls
1926 1
            $objWriter->startElement('c:dLbls');
1927
1928
            // c:txPr
1929 1
            $objWriter->startElement('c:txPr');
1930
1931
            // a:bodyPr
1932 1
            $objWriter->writeElement('a:bodyPr', null);
1933
1934
            // a:lstStyle
1935 1
            $objWriter->writeElement('a:lstStyle', null);
1936
1937
            // a:p
1938 1
            $objWriter->startElement('a:p');
1939
1940
            // a:pPr
1941 1
            $objWriter->startElement('a:pPr');
1942
1943
            // a:defRPr
1944 1
            $objWriter->startElement('a:defRPr');
1945
1946 1
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1947 1
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1948 1
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1949 1
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1950 1
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1951 1
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
1952 1
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
1953
1954
            // Font - a:solidFill
1955 1
            $objWriter->startElement('a:solidFill');
1956
1957 1
            $this->writeColor($objWriter, $series->getFont()->getColor());
1958
1959 1
            $objWriter->endElement();
1960
1961
            // Font - a:latin
1962 1
            $objWriter->startElement('a:latin');
1963 1
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1964 1
            $objWriter->endElement();
1965
1966 1
            $objWriter->endElement();
1967
1968 1
            $objWriter->endElement();
1969
1970
            // a:endParaRPr
1971 1
            $objWriter->startElement('a:endParaRPr');
1972 1
            $objWriter->writeAttribute('lang', 'en-US');
1973 1
            $objWriter->writeAttribute('dirty', '0');
1974 1
            $objWriter->endElement();
1975
1976 1
            $objWriter->endElement();
1977
1978 1
            $objWriter->endElement();
1979
1980
            // c:showLegendKey
1981 1
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
1982
1983
            // c:showVal
1984 1
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1985
1986
            // c:showCatName
1987 1
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1988
1989
            // c:showSerName
1990 1
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1991
1992
            // c:showPercent
1993 1
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1994
1995
            // c:showLeaderLines
1996 1
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1997
1998 1
            $objWriter->endElement();
1999
2000
            // c:spPr
2001 1
            $objWriter->startElement('c:spPr');
2002
            // Write fill
2003 1
            $this->writeFill($objWriter, $series->getFill());
2004
            // Write outline
2005 1
            $this->writeOutline($objWriter, $series->getOutline());
2006
            // ## c:spPr
2007 1
            $objWriter->endElement();
2008
2009
            // Write X axis data
2010 1
            $axisXData = array_keys($series->getValues());
2011
2012
            // c:cat
2013 1
            $objWriter->startElement('c:cat');
2014 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
2015 1
            $objWriter->endElement();
2016
2017
            // Write Y axis data
2018 1
            $axisYData = array_values($series->getValues());
2019
2020
            // c:val
2021 1
            $objWriter->startElement('c:val');
2022 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
2023 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
2024 1
            $objWriter->endElement();
2025
2026
            // c:smooth
2027 1
            $objWriter->startElement('c:smooth');
2028 1
            $objWriter->writeAttribute('val', '0');
2029 1
            $objWriter->endElement();
2030
2031 1
            $objWriter->endElement();
2032
2033 1
            ++$seriesIndex;
2034
        }
2035
2036
        // c:axId
2037 1
        $objWriter->startElement('c:axId');
2038 1
        $objWriter->writeAttribute('val', '52743552');
2039 1
        $objWriter->endElement();
2040
2041
        // c:axId
2042 1
        $objWriter->startElement('c:axId');
2043 1
        $objWriter->writeAttribute('val', '52749440');
2044 1
        $objWriter->endElement();
2045
2046 1
        $objWriter->endElement();
2047 1
    }
2048
2049
    /**
2050
     * Write Type Scatter
2051
     *
2052
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
2053
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter $subject
2054
     * @param  boolean $includeSheet
2055
     * @throws \Exception
2056
     */
2057 5
    protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, $includeSheet = false)
2058
    {
2059
        // c:scatterChart
2060 5
        $objWriter->startElement('c:scatterChart');
2061
2062
        // c:scatterStyle
2063 5
        $objWriter->startElement('c:scatterStyle');
2064 5
        $objWriter->writeAttribute('val', 'lineMarker');
2065 5
        $objWriter->endElement();
2066
2067
        // c:varyColors
2068 5
        $objWriter->startElement('c:varyColors');
2069 5
        $objWriter->writeAttribute('val', '0');
2070 5
        $objWriter->endElement();
2071
2072
        // Write series
2073 5
        $seriesIndex = 0;
2074 5
        foreach ($subject->getSeries() as $series) {
2075
            // c:ser
2076 5
            $objWriter->startElement('c:ser');
2077
2078
            // c:idx
2079 5
            $objWriter->startElement('c:idx');
2080 5
            $objWriter->writeAttribute('val', $seriesIndex);
2081 5
            $objWriter->endElement();
2082
2083
            // c:order
2084 5
            $objWriter->startElement('c:order');
2085 5
            $objWriter->writeAttribute('val', $seriesIndex);
2086 5
            $objWriter->endElement();
2087
2088
            // c:tx
2089 5
            $objWriter->startElement('c:tx');
2090 5
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
2091 5
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
2092 5
            $objWriter->endElement();
2093
2094
            // Marker
2095 5
            $this->writeSeriesMarker($objWriter, $series->getMarker());
2096
2097
            // c:dLbls
2098 5
            $objWriter->startElement('c:dLbls');
2099
2100
            // c:txPr
2101 5
            $objWriter->startElement('c:txPr');
2102
2103
            // a:bodyPr
2104 5
            $objWriter->writeElement('a:bodyPr', null);
2105
2106
            // a:lstStyle
2107 5
            $objWriter->writeElement('a:lstStyle', null);
2108
2109
            // a:p
2110 5
            $objWriter->startElement('a:p');
2111
2112
            // a:pPr
2113 5
            $objWriter->startElement('a:pPr');
2114
2115
            // a:defRPr
2116 5
            $objWriter->startElement('a:defRPr');
2117
2118 5
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
2119 5
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
2120 5
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
2121 5
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
2122 5
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
2123 5
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '30000');
2124 5
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-25000');
2125
2126
            // Font - a:solidFill
2127 5
            $objWriter->startElement('a:solidFill');
2128
2129 5
            $this->writeColor($objWriter, $series->getFont()->getColor());
2130
2131 5
            $objWriter->endElement();
2132
2133
            // Font - a:latin
2134 5
            $objWriter->startElement('a:latin');
2135 5
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
2136 5
            $objWriter->endElement();
2137
2138 5
            $objWriter->endElement();
2139
2140 5
            $objWriter->endElement();
2141
2142
            // a:endParaRPr
2143 5
            $objWriter->startElement('a:endParaRPr');
2144 5
            $objWriter->writeAttribute('lang', 'en-US');
2145 5
            $objWriter->writeAttribute('dirty', '0');
2146 5
            $objWriter->endElement();
2147
2148 5
            $objWriter->endElement();
2149
2150 5
            $objWriter->endElement();
2151
2152
            // c:showLegendKey
2153 5
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
2154
2155
            // c:showVal
2156 5
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
2157
2158
            // c:showCatName
2159 5
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
2160
2161
            // c:showSerName
2162 5
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
2163
2164
            // c:showPercent
2165 5
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
2166
2167
            // c:showLeaderLines
2168 5
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
2169
2170
            // c:separator
2171 5
            $objWriter->writeElementIf($series->hasShowSeparator(), 'c:separator', 'val', $series->getSeparator());
2172
2173 5
            $objWriter->endElement();
2174
2175
            // c:spPr
2176 5
            $objWriter->startElement('c:spPr');
2177
            // Write fill
2178 5
            $this->writeFill($objWriter, $series->getFill());
2179
            // Write outline
2180 5
            $this->writeOutline($objWriter, $series->getOutline());
2181
            // ## c:spPr
2182 5
            $objWriter->endElement();
2183
2184
            // Write X axis data
2185 5
            $axisXData = array_keys($series->getValues());
2186
2187
            // c:xVal
2188 5
            $objWriter->startElement('c:xVal');
2189 5
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
2190 5
            $objWriter->endElement();
2191
2192
            // Write Y axis data
2193 5
            $axisYData = array_values($series->getValues());
2194
2195
            // c:yVal
2196 5
            $objWriter->startElement('c:yVal');
2197 5
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
2198 5
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
2199 5
            $objWriter->endElement();
2200
2201
            // c:smooth
2202 5
            $objWriter->startElement('c:smooth');
2203 5
            $objWriter->writeAttribute('val', '0');
2204 5
            $objWriter->endElement();
2205
2206 5
            $objWriter->endElement();
2207
2208 5
            ++$seriesIndex;
2209
        }
2210
2211
        // c:axId
2212 5
        $objWriter->startElement('c:axId');
2213 5
        $objWriter->writeAttribute('val', '52743552');
2214 5
        $objWriter->endElement();
2215
2216
        // c:axId
2217 5
        $objWriter->startElement('c:axId');
2218 5
        $objWriter->writeAttribute('val', '52749440');
2219 5
        $objWriter->endElement();
2220
2221 5
        $objWriter->endElement();
2222 5
    }
2223
2224
    /**
2225
     * Write chart relationships to XML format
2226
     *
2227
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $pChart
2228
     * @return string                    XML Output
2229
     * @throws \Exception
2230
     */
2231
    public function writeChartRelationships(Chart $pChart)
2232
    {
2233
        // Create XML writer
2234
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
2235
2236
        // XML header
2237
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
2238
2239
        // Relationships
2240
        $objWriter->startElement('Relationships');
2241
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
2242
2243
        // Write spreadsheet relationship?
2244
        if ($pChart->hasIncludedSpreadsheet()) {
2245
            $this->writeRelationship($objWriter, 1, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package', '../embeddings/' . $pChart->getIndexedFilename() . '.xlsx');
2246
        }
2247
2248
        $objWriter->endElement();
2249
2250
        // Return
2251
        return $objWriter->getData();
2252
    }
2253
2254
    /**
2255
     * @param XMLWriter $objWriter
2256
     * @param Chart\Marker $oMarker
2257
     */
2258 17
    protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker)
2259
    {
2260
        // c:marker
2261 17
        $objWriter->startElement('c:marker');
2262
        // c:marker > c:symbol
2263 17
        $objWriter->startElement('c:symbol');
2264 17
        $objWriter->writeAttribute('val', $oMarker->getSymbol());
2265 17
        $objWriter->endElement();
2266
2267
        // Size if different of none
2268 17
        if ($oMarker->getSymbol() != Chart\Marker::SYMBOL_NONE) {
2269 2
            $markerSize = (int)$oMarker->getSize();
2270 2
            if ($markerSize < 2) {
2271 2
                $markerSize = 2;
2272
            }
2273 2
            if ($markerSize > 72) {
2274 2
                $markerSize = 72;
2275
            }
2276
2277
            /**
2278
             * c:marker > c:size
2279
             * Size in points
2280
             * @link : https://msdn.microsoft.com/en-us/library/hh658135(v=office.12).aspx
2281
             */
2282 2
            $objWriter->startElement('c:size');
2283 2
            $objWriter->writeAttribute('val', $markerSize);
2284 2
            $objWriter->endElement();
2285
        }
2286 17
        $objWriter->endElement();
2287 17
    }
2288
2289
    /**
2290
     * @param XMLWriter $objWriter
2291
     * @param Chart\Axis $oAxis
2292
     * @param $typeAxis
2293
     * @param Chart\Type\AbstractType $typeChart
2294
     */
2295 29
    protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, $typeAxis, Chart\Type\AbstractType $typeChart)
2296
    {
2297 29
        if ($typeAxis != Chart\Axis::AXIS_X && $typeAxis != Chart\Axis::AXIS_Y) {
2298
            return;
2299
        }
2300
2301 29
        if ($typeAxis == Chart\Axis::AXIS_X) {
2302 29
            $mainElement = 'c:catAx';
2303 29
            $axIdVal = '52743552';
2304 29
            $axPosVal = 'b';
2305 29
            $crossAxVal = '52749440';
2306
        } else {
2307 29
            $mainElement = 'c:valAx';
2308 29
            $axIdVal = '52749440';
2309 29
            $axPosVal = 'l';
2310 29
            $crossAxVal = '52743552';
2311
        }
2312
2313
        // $mainElement
2314 29
        $objWriter->startElement($mainElement);
2315
2316
        // $mainElement > c:axId
2317 29
        $objWriter->startElement('c:axId');
2318 29
        $objWriter->writeAttribute('val', $axIdVal);
2319 29
        $objWriter->endElement();
2320
2321
        // $mainElement > c:scaling
2322 29
        $objWriter->startElement('c:scaling');
2323
2324
        // $mainElement > c:scaling > c:orientation
2325 29
        $objWriter->startElement('c:orientation');
2326 29
        $objWriter->writeAttribute('val', 'minMax');
2327 29
        $objWriter->endElement();
2328
2329 29
        if ($oAxis->getMaxBounds() != null) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $oAxis->getMaxBounds() of type integer|null against null; this is ambiguous if the integer can be zero. Consider using a strict comparison !== instead.
Loading history...
2330 1
            $objWriter->startElement('c:max');
2331 1
            $objWriter->writeAttribute('val', $oAxis->getMaxBounds());
2332 1
            $objWriter->endElement();
2333
        }
2334
2335 29
        if ($oAxis->getMinBounds() != null) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $oAxis->getMinBounds() of type integer|null against null; this is ambiguous if the integer can be zero. Consider using a strict comparison !== instead.
Loading history...
2336 1
            $objWriter->startElement('c:min');
2337 1
            $objWriter->writeAttribute('val', $oAxis->getMinBounds());
2338 1
            $objWriter->endElement();
2339
        }
2340
2341
        // $mainElement > ##c:scaling
2342 29
        $objWriter->endElement();
2343
2344
        // $mainElement > c:delete
2345 29
        $objWriter->startElement('c:delete');
2346 29
        $objWriter->writeAttribute('val', $oAxis->isVisible() ? '0' : '1');
2347 29
        $objWriter->endElement();
2348
2349
        // $mainElement > c:axPos
2350 29
        $objWriter->startElement('c:axPos');
2351 29
        $objWriter->writeAttribute('val', $axPosVal);
2352 29
        $objWriter->endElement();
2353
2354 29
        $oMajorGridlines = $oAxis->getMajorGridlines();
2355 29
        if ($oMajorGridlines instanceof Gridlines) {
2356 1
            $objWriter->startElement('c:majorGridlines');
2357
2358 1
            $this->writeAxisGridlines($objWriter, $oMajorGridlines);
2359
2360 1
            $objWriter->endElement();
2361
        }
2362
2363 29
        $oMinorGridlines = $oAxis->getMinorGridlines();
2364 29
        if ($oMinorGridlines instanceof Gridlines) {
2365 1
            $objWriter->startElement('c:minorGridlines');
2366
2367 1
            $this->writeAxisGridlines($objWriter, $oMinorGridlines);
2368
2369 1
            $objWriter->endElement();
2370
        }
2371
2372 29
        if ($oAxis->getTitle() != '') {
2373
            // c:title
2374 29
            $objWriter->startElement('c:title');
2375
2376
            // c:tx
2377 29
            $objWriter->startElement('c:tx');
2378
2379
            // c:rich
2380 29
            $objWriter->startElement('c:rich');
2381
2382
            // a:bodyPr
2383 29
            $objWriter->writeElement('a:bodyPr', null);
2384
2385
            // a:lstStyle
2386 29
            $objWriter->writeElement('a:lstStyle', null);
2387
2388
            // a:p
2389 29
            $objWriter->startElement('a:p');
2390
2391
            // a:pPr
2392 29
            $objWriter->startElement('a:pPr');
2393
2394
            // a:defRPr
2395 29
            $objWriter->startElement('a:defRPr');
2396
2397 29
            $objWriter->writeAttribute('b', ($oAxis->getFont()->isBold() ? 'true' : 'false'));
2398 29
            $objWriter->writeAttribute('i', ($oAxis->getFont()->isItalic() ? 'true' : 'false'));
2399 29
            $objWriter->writeAttribute('strike', ($oAxis->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
2400 29
            $objWriter->writeAttribute('sz', ($oAxis->getFont()->getSize() * 100));
2401 29
            $objWriter->writeAttribute('u', $oAxis->getFont()->getUnderline());
2402 29
            $objWriter->writeAttributeIf($oAxis->getFont()->isSuperScript(), 'baseline', '30000');
2403 29
            $objWriter->writeAttributeIf($oAxis->getFont()->isSubScript(), 'baseline', '-25000');
2404
2405
            // Font - a:solidFill
2406 29
            $objWriter->startElement('a:solidFill');
2407 29
            $this->writeColor($objWriter, $oAxis->getFont()->getColor());
2408 29
            $objWriter->endElement();
2409
2410
            // Font - a:latin
2411 29
            $objWriter->startElement('a:latin');
2412 29
            $objWriter->writeAttribute('typeface', $oAxis->getFont()->getName());
2413 29
            $objWriter->endElement();
2414
2415 29
            $objWriter->endElement();
2416
2417
            // ## a:pPr
2418 29
            $objWriter->endElement();
2419
2420
            // a:r
2421 29
            $objWriter->startElement('a:r');
2422
2423
            // a:rPr
2424 29
            $objWriter->startElement('a:rPr');
2425 29
            $objWriter->writeAttribute('lang', 'en-US');
2426 29
            $objWriter->writeAttribute('dirty', '0');
2427 29
            $objWriter->endElement();
2428
2429
            // a:t
2430 29
            $objWriter->writeElement('a:t', $oAxis->getTitle());
2431
2432
            // ## a:r
2433 29
            $objWriter->endElement();
2434
2435
            // a:endParaRPr
2436 29
            $objWriter->startElement('a:endParaRPr');
2437 29
            $objWriter->writeAttribute('lang', 'en-US');
2438 29
            $objWriter->writeAttribute('dirty', '0');
2439 29
            $objWriter->endElement();
2440
2441
            // ## a:p
2442 29
            $objWriter->endElement();
2443
2444
            // ## c:rich
2445 29
            $objWriter->endElement();
2446
2447
            // ## c:tx
2448 29
            $objWriter->endElement();
2449
2450
            // ## c:title
2451 29
            $objWriter->endElement();
2452
        }
2453
2454
        // c:numFmt
2455 29
        $objWriter->startElement('c:numFmt');
2456 29
        $objWriter->writeAttribute('formatCode', $oAxis->getFormatCode());
2457 29
        $objWriter->writeAttribute('sourceLinked', '1');
2458 29
        $objWriter->endElement();
2459
2460
        // c:majorTickMark
2461 29
        $objWriter->startElement('c:majorTickMark');
2462 29
        $objWriter->writeAttribute('val', $oAxis->getMajorTickMark());
2463 29
        $objWriter->endElement();
2464
2465
        // c:minorTickMark
2466 29
        $objWriter->startElement('c:minorTickMark');
2467 29
        $objWriter->writeAttribute('val', $oAxis->getMinorTickMark());
2468 29
        $objWriter->endElement();
2469
2470
        // c:tickLblPos
2471 29
        $objWriter->startElement('c:tickLblPos');
2472 29
        $objWriter->writeAttribute('val', 'nextTo');
2473 29
        $objWriter->endElement();
2474
2475
        // c:spPr
2476 29
        $objWriter->startElement('c:spPr');
2477
        // Outline
2478 29
        $this->writeOutline($objWriter, $oAxis->getOutline());
2479
        // ##c:spPr
2480 29
        $objWriter->endElement();
2481
2482
        // c:crossAx
2483 29
        $objWriter->startElement('c:crossAx');
2484 29
        $objWriter->writeAttribute('val', $crossAxVal);
2485 29
        $objWriter->endElement();
2486
2487
        // c:crosses
2488 29
        $objWriter->startElement('c:crosses');
2489 29
        $objWriter->writeAttribute('val', 'autoZero');
2490 29
        $objWriter->endElement();
2491
2492 29
        if ($typeAxis == Chart\Axis::AXIS_X) {
2493
            // c:lblAlgn
2494 29
            $objWriter->startElement('c:lblAlgn');
2495 29
            $objWriter->writeAttribute('val', 'ctr');
2496 29
            $objWriter->endElement();
2497
2498
            // c:lblOffset
2499 29
            $objWriter->startElement('c:lblOffset');
2500 29
            $objWriter->writeAttribute('val', '100%');
2501 29
            $objWriter->endElement();
2502
        }
2503
2504 29
        if ($typeAxis == Chart\Axis::AXIS_Y) {
2505
            // c:crossBetween
2506 29
            $objWriter->startElement('c:crossBetween');
2507
            // midCat : Position Axis On Tick Marks
2508
            // between : Between Tick Marks
2509 29
            if ($typeChart instanceof Area) {
2510 1
                $objWriter->writeAttribute('val', 'midCat');
2511
            } else {
2512 28
                $objWriter->writeAttribute('val', 'between');
2513
            }
2514 29
            $objWriter->endElement();
2515
2516
            // c:majorUnit
2517 29
            if ($oAxis->getMajorUnit() != null) {
2518 1
                $objWriter->startElement('c:majorUnit');
2519 1
                $objWriter->writeAttribute('val', $oAxis->getMajorUnit());
2520 1
                $objWriter->endElement();
2521
            }
2522
2523
            // c:minorUnit
2524 29
            if ($oAxis->getMinorUnit() != null) {
2525 1
                $objWriter->startElement('c:minorUnit');
2526 1
                $objWriter->writeAttribute('val', $oAxis->getMinorUnit());
2527 1
                $objWriter->endElement();
2528
            }
2529
        }
2530
2531 29
        $objWriter->endElement();
2532 29
    }
2533
2534
    /**
2535
     * @param XMLWriter $objWriter
2536
     * @param Gridlines $oGridlines
2537
     */
2538 1
    protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines)
2539
    {
2540
        // c:spPr
2541 1
        $objWriter->startElement('c:spPr');
2542
2543
        // Outline
2544 1
        $this->writeOutline($objWriter, $oGridlines->getOutline());
2545
2546
        // ##c:spPr
2547 1
        $objWriter->endElement();
2548 1
    }
2549
}
2550