Completed
Pull Request — develop (#339)
by Franck
07:38
created

PptCharts::writeChart()   C

Complexity

Conditions 8
Paths 32

Size

Total Lines 141
Code Lines 71

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 54
CRAP Score 8

Importance

Changes 0
Metric Value
dl 0
loc 141
ccs 54
cts 54
cp 1
rs 5.2676
c 0
b 0
f 0
cc 8
eloc 71
nc 32
nop 1
crap 8

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

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