Completed
Pull Request — develop (#583)
by
unknown
17:10
created

PptCharts::writePlotArea()   B

Complexity

Conditions 10
Paths 29

Size

Total Lines 40

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 10

Importance

Changes 0
Metric Value
dl 0
loc 40
ccs 23
cts 23
cp 1
rs 7.6666
c 0
b 0
f 0
cc 10
nc 29
nop 3
crap 10

How to fix   Complexity   

Long Method

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

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

Commonly applied refactorings include:

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