Completed
Pull Request — develop (#188)
by Franck
06:55
created

PptCharts::writePlotArea()   D

Complexity

Conditions 24
Paths 176

Size

Total Lines 309
Code Lines 168

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 154
CRAP Score 24

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 309
ccs 154
cts 154
cp 1
rs 4.345
cc 24
eloc 168
nc 176
nop 3
crap 24

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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