Completed
Push — develop ( c1ddc2...097d50 )
by Franck
10:30 queued 08:06
created

PptCharts   F

Complexity

Total Complexity 176

Size/Duplication

Total Lines 2201
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 29

Test Coverage

Coverage 90.49%

Importance

Changes 6
Bugs 0 Features 0
Metric Value
wmc 176
lcom 1
cbo 29
dl 0
loc 2201
ccs 952
cts 1052
cp 0.9049
rs 0.5217
c 6
b 0
f 0

21 Methods

Rating   Name   Duplication   Size   Complexity  
B render() 0 21 5
C writeChart() 0 140 8
B writeSpreadsheet() 0 61 8
A writeElementWithValAttribute() 0 6 1
A writeSingleValueOrReference() 0 23 2
B writeMultipleValuesOrReference() 0 52 7
B writeTitle() 0 91 4
D writePlotArea() 0 40 10
B writeLegend() 0 91 5
B writeLayout() 0 48 5
C writeTypeArea() 0 94 9
D writeTypeBar() 0 213 19
D writeTypeBar3D() 0 193 15
D writeTypePie() 0 165 15
D writeTypePie3D() 0 159 13
C writeTypeLine() 0 164 12
D writeTypeScatter() 0 166 13
A writeChartRelationships() 0 22 2
B writeSeriesMarker() 0 30 4
F writeAxis() 0 238 18
A writeAxisGridlines() 0 11 1

How to fix   Complexity   

Complex Class

Complex classes like PptCharts often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PptCharts, and based on these observations, apply Extract Interface, too.

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