Completed
Pull Request — develop (#435)
by
unknown
19:30 queued 15:48
created

PptCharts::writeLegend()   B

Complexity

Conditions 5
Paths 2

Size

Total Lines 91
Code Lines 48

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 50
CRAP Score 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 91
ccs 50
cts 50
cp 1
rs 8.2585
c 1
b 0
f 0
cc 5
eloc 48
nc 2
nop 2
crap 5

How to fix   Long Method   

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