Completed
Pull Request — develop (#190)
by Franck
08:58
created

PptCharts   F

Complexity

Total Complexity 207

Size/Duplication

Total Lines 2335
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 29

Test Coverage

Coverage 86.17%

Importance

Changes 5
Bugs 0 Features 0
Metric Value
wmc 207
c 5
b 0
f 0
lcom 1
cbo 29
dl 0
loc 2335
ccs 1034
cts 1200
cp 0.8617
rs 0.5217

19 Methods

Rating   Name   Duplication   Size   Complexity  
A writeElementWithValAttribute() 0 6 1
A render() 0 17 4
C writeChart() 0 150 8
B writeSpreadsheet() 0 61 8
A writeSingleValueOrReference() 0 22 2
B writeMultipleValuesOrReference() 0 53 7
C writeTitle() 0 100 8
D writePlotArea() 0 309 24
D writeLegend() 0 100 9
B writeLayout() 0 48 5
D writeTypeArea() 0 175 17
F writeTypeBar() 0 216 23
D writeTypeBar3D() 0 199 19
D writeTypePie() 0 160 17
D writeTypePie3D() 0 165 17
D writeTypeLine() 0 170 16
D writeTypeScatter() 0 172 16
A writeChartRelationships() 0 22 2
B writeSeriesMarker() 0 30 4

How to fix   Complexity   

Complex Class

Complex classes like PptCharts often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PptCharts, and based on these observations, apply Extract Interface, too.

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

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

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

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