Completed
Pull Request — develop (#287)
by Franck
10:29 queued 44s
created

PptCharts::writeTypeBar()   D

Complexity

Conditions 19
Paths 147

Size

Total Lines 207
Code Lines 106

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 102
CRAP Score 19.3325

Importance

Changes 0
Metric Value
dl 0
loc 207
ccs 102
cts 113
cp 0.9027
rs 4.4786
c 0
b 0
f 0
cc 19
eloc 106
nc 147
nop 3
crap 19.3325

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

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