Completed
Pull Request — develop (#187)
by Franck
19:04 queued 41s
created

PptCharts::writePlotArea()   D

Complexity

Conditions 10
Paths 29

Size

Total Lines 246
Code Lines 130

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 246
rs 4.8196
cc 10
eloc 130
nc 29
nop 3

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