Completed
Pull Request — develop (#263)
by Franck
09:08
created

PptCharts::writeTypeLine()   C

Complexity

Conditions 12
Paths 5

Size

Total Lines 164
Code Lines 82

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 83
CRAP Score 12

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 164
ccs 83
cts 83
cp 1
rs 5.034
cc 12
eloc 82
nc 5
nop 3
crap 12

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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