Completed
Push — develop ( 312b7a...53bbae )
by Franck
16s
created

PptCharts::writeAxis()   F

Complexity

Conditions 18
Paths 1153

Size

Total Lines 238
Code Lines 130

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 139
CRAP Score 18.0001

Importance

Changes 3
Bugs 0 Features 0
Metric Value
dl 0
loc 238
ccs 139
cts 140
cp 0.9929
rs 2
c 3
b 0
f 0
cc 18
eloc 130
nc 1153
nop 4
crap 18.0001

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