Completed
Pull Request — develop (#390)
by Franck
08:31
created

PptCharts::writeElementWithValAttribute()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

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