Completed
Pull Request — develop (#390)
by Franck
19:09
created

PptCharts::writeTypeScatter()   D

Complexity

Conditions 15
Paths 9

Size

Total Lines 170

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 82
CRAP Score 15

Importance

Changes 0
Metric Value
dl 0
loc 170
ccs 82
cts 82
cp 1
rs 4.7333
c 0
b 0
f 0
cc 15
nc 9
nop 3
crap 15

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\XMLWriter;
7
use PhpOffice\PhpPresentation\PhpPresentation;
8
use PhpOffice\PhpPresentation\Shape\Chart;
9
use PhpOffice\PhpPresentation\Shape\Chart\Gridlines;
10
use PhpOffice\PhpPresentation\Shape\Chart\Legend;
11
use PhpOffice\PhpPresentation\Shape\Chart\PlotArea;
12
use PhpOffice\PhpPresentation\Shape\Chart\Title;
13
use PhpOffice\PhpPresentation\Shape\Chart\Type\Area;
14
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar;
15
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D;
16
use PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut;
17
use PhpOffice\PhpPresentation\Shape\Chart\Type\Line;
18
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie;
19
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D;
20
use PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter;
21
use PhpOffice\PhpPresentation\Style\Border;
22
use PhpOffice\PhpPresentation\Style\Fill;
23
24
class PptCharts extends AbstractDecoratorWriter
25
{
26
    /**
27
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
28
     * @throws \Exception
29
     */
30 115
    public function render()
31
    {
32 115
        for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
33 45
            $shape = $this->getDrawingHashTable()->getByIndex($i);
34 45
            if ($shape instanceof Chart) {
35 36
                $this->getZip()->addFromString('ppt/charts/' . $shape->getIndexedFilename(), $this->writeChart($shape));
36
37 35
                if ($shape->hasIncludedSpreadsheet()) {
38
                    $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape));
39
                    $pFilename = tempnam(sys_get_temp_dir(), 'PHPExcel');
40
                    $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx'));
41
42
                    // remove temp file
43
                    if (@unlink($pFilename) === false) {
44
                        throw new \Exception('The file ' . $pFilename . ' could not removed.');
45
                    }
46
                }
47
            }
48
        }
49 114
        return $this->getZip();
50
    }
51
52
53
    /**
54
     * Write chart to XML format
55
     *
56
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
57
     * @return string                    XML Output
58
     * @throws \Exception
59
     */
60 36
    public function writeChart(Chart $chart)
61
    {
62
        // Create XML writer
63 36
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
64
65
        // XML header
66 36
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
67
68
        // c:chartSpace
69 36
        $objWriter->startElement('c:chartSpace');
70 36
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
71 36
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
72 36
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
73
74
        // c:date1904
75 36
        $objWriter->startElement('c:date1904');
76 36
        $objWriter->writeAttribute('val', '1');
77 36
        $objWriter->endElement();
78
79
        // c:lang
80 36
        $objWriter->startElement('c:lang');
81 36
        $objWriter->writeAttribute('val', 'en-US');
82 36
        $objWriter->endElement();
83
84
        // c:chart
85 36
        $objWriter->startElement('c:chart');
86
87
        // Title?
88 36
        if ($chart->getTitle()->isVisible()) {
89
            // Write title
90 35
            $this->writeTitle($objWriter, $chart->getTitle());
91
        }
92
93
        // c:autoTitleDeleted
94 36
        $objWriter->startElement('c:autoTitleDeleted');
95 36
        $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1');
96 36
        $objWriter->endElement();
97
98
        // c:view3D
99 36
        $objWriter->startElement('c:view3D');
100
101
        // c:rotX
102 36
        $objWriter->startElement('c:rotX');
103 36
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
104 36
        $objWriter->endElement();
105
106
        // c:hPercent
107 36
        $hPercent = $chart->getView3D()->getHeightPercent();
108 36
        $objWriter->writeElementIf($hPercent != null, 'c:hPercent', 'val', $hPercent);
109
110
        // c:rotY
111 36
        $objWriter->startElement('c:rotY');
112 36
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
113 36
        $objWriter->endElement();
114
115
        // c:depthPercent
116 36
        $objWriter->startElement('c:depthPercent');
117 36
        $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
118 36
        $objWriter->endElement();
119
120
        // c:rAngAx
121 36
        $objWriter->startElement('c:rAngAx');
122 36
        $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
123 36
        $objWriter->endElement();
124
125
        // c:perspective
126 36
        $objWriter->startElement('c:perspective');
127 36
        $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
128 36
        $objWriter->endElement();
129
130 36
        $objWriter->endElement();
131
132
        // Write plot area
133 36
        $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart);
134
135
        // Legend?
136 35
        if ($chart->getLegend()->isVisible()) {
137
            // Write legend
138 35
            $this->writeLegend($objWriter, $chart->getLegend());
139
        }
140
141
        // c:plotVisOnly
142 35
        $objWriter->startElement('c:plotVisOnly');
143 35
        $objWriter->writeAttribute('val', '1');
144 35
        $objWriter->endElement();
145
146 35
        $objWriter->endElement();
147
148
        // c:spPr
149 35
        $objWriter->startElement('c:spPr');
150
151
        // Fill
152 35
        $this->writeFill($objWriter, $chart->getFill());
153
154
        // Border
155 35
        if ($chart->getBorder()->getLineStyle() != Border::LINE_NONE) {
156 1
            $this->writeBorder($objWriter, $chart->getBorder(), '');
157
        }
158
159
        // Shadow
160 35
        if ($chart->getShadow()->isVisible()) {
161
            // a:effectLst
162 1
            $objWriter->startElement('a:effectLst');
163
164
            // a:outerShdw
165 1
            $objWriter->startElement('a:outerShdw');
166 1
            $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius()));
167 1
            $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance()));
168 1
            $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($chart->getShadow()->getDirection()));
169 1
            $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment());
170 1
            $objWriter->writeAttribute('rotWithShape', '0');
171
172 1
            $this->writeColor($objWriter, $chart->getShadow()->getColor(), $chart->getShadow()->getAlpha());
173
174 1
            $objWriter->endElement();
175
176 1
            $objWriter->endElement();
177
        }
178
179 35
        $objWriter->endElement();
180
181
        // External data?
182 35
        if ($chart->hasIncludedSpreadsheet()) {
183
            // c:externalData
184
            $objWriter->startElement('c:externalData');
185
            $objWriter->writeAttribute('r:id', 'rId1');
186
187
            // c:autoUpdate
188
            $objWriter->startElement('c:autoUpdate');
189
            $objWriter->writeAttribute('val', '0');
190
            $objWriter->endElement();
191
192
            $objWriter->endElement();
193
        }
194
195 35
        $objWriter->endElement();
196
197
        // Return
198 35
        return $objWriter->getData();
199
    }
200
201
    /**
202
     * Write chart to XML format
203
     *
204
     * @param  PhpPresentation $presentation
205
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
206
     * @param  string $tempName
207
     * @return string                    String output
208
     * @throws \Exception
209
     */
210
    public function writeSpreadsheet(PhpPresentation $presentation, $chart, $tempName)
211
    {
212
        // Need output?
213
        if (!$chart->hasIncludedSpreadsheet()) {
214
            throw new \Exception('No spreadsheet output is required for the given chart.');
215
        }
216
217
        // Verify PHPExcel
218
        if (!class_exists('PHPExcel')) {
219
            throw new \Exception('PHPExcel has not been loaded. Include PHPExcel.php in your script, e.g. require_once \'PHPExcel.php\'.');
220
        }
221
222
        // Create new spreadsheet
223
        $workbook = new \PHPExcel();
224
225
        // Set properties
226
        $title = $chart->getTitle()->getText();
227
        if (strlen($title) == 0) {
228
            $title = 'Chart';
229
        }
230
        $workbook->getProperties()->setCreator($presentation->getDocumentProperties()->getCreator())->setLastModifiedBy($presentation->getDocumentProperties()->getLastModifiedBy())->setTitle($title);
231
232
        // Add chart data
233
        $sheet = $workbook->setActiveSheetIndex(0);
234
        $sheet->setTitle('Sheet1');
235
236
        // Write series
237
        $seriesIndex = 0;
238
        foreach ($chart->getPlotArea()->getType()->getSeries() as $series) {
239
            // Title
240
            $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, 1, $series->getTitle());
241
242
            // X-axis
243
            $axisXData = array_keys($series->getValues());
244
            $numAxisXData = count($axisXData);
245
            for ($i = 0; $i < $numAxisXData; $i++) {
246
                $sheet->setCellValueByColumnAndRow(0, $i + 2, $axisXData[$i]);
247
            }
248
249
            // Y-axis
250
            $axisYData = array_values($series->getValues());
251
            $numAxisYData = count($axisYData);
252
            for ($i = 0; $i < $numAxisYData; $i++) {
253
                $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, $i + 2, $axisYData[$i]);
254
            }
255
256
            ++$seriesIndex;
257
        }
258
259
        // Save to string
260
        $writer = \PHPExcel_IOFactory::createWriter($workbook, 'Excel2007');
261
        $writer->save($tempName);
262
263
        // Load file in memory
264
        $returnValue = file_get_contents($tempName);
265
        if (@unlink($tempName) === false) {
266
            throw new \Exception('The file ' . $tempName . ' could not removed.');
267
        }
268
269
        return $returnValue;
270
    }
271
272
    /**
273
     * Write element with value attribute
274
     *
275
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
276
     * @param string $elementName
277
     * @param string $value
278
     */
279 31
    protected function writeElementWithValAttribute($objWriter, $elementName, $value)
280
    {
281 31
        $objWriter->startElement($elementName);
282 31
        $objWriter->writeAttribute('val', $value);
283 31
        $objWriter->endElement();
284 31
    }
285
286
    /**
287
     * Write single value or reference
288
     *
289
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
290
     * @param boolean $isReference
291
     * @param mixed $value
292
     * @param string $reference
293
     */
294 31
    protected function writeSingleValueOrReference($objWriter, $isReference, $value, $reference)
295
    {
296 31
        if (!$isReference) {
297
            // Value
298 31
            $objWriter->writeElement('c:v', $value);
299 31
            return;
300
        }
301
302
        // Reference and cache
303
        $objWriter->startElement('c:strRef');
304
        $objWriter->writeElement('c:f', $reference);
305
        $objWriter->startElement('c:strCache');
306
        $objWriter->startElement('c:ptCount');
307
        $objWriter->writeAttribute('val', '1');
308
        $objWriter->endElement();
309
310
        $objWriter->startElement('c:pt');
311
        $objWriter->writeAttribute('idx', '0');
312
        $objWriter->writeElement('c:v', $value);
313
        $objWriter->endElement();
314
        $objWriter->endElement();
315
        $objWriter->endElement();
316
    }
317
318
    /**
319
     * Write series value or reference
320
     *
321
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
322
     * @param boolean $isReference
323
     * @param mixed $values
324
     * @param string $reference
325
     */
326 31
    protected function writeMultipleValuesOrReference($objWriter, $isReference, $values, $reference)
327
    {
328
        // c:strLit / c:numLit
329
        // c:strRef / c:numRef
330 31
        $referenceType = ($isReference ? 'Ref' : 'Lit');
331 31
        $dataType = 'str';
332 31
        if (is_int($values[0]) || is_float($values[0])) {
333 31
            $dataType = 'num';
334
        }
335 31
        $objWriter->startElement('c:' . $dataType . $referenceType);
336
337 31
        $numValues = count($values);
338 31
        if (!$isReference) {
339
            // Value
340
341
            // c:ptCount
342 31
            $objWriter->startElement('c:ptCount');
343 31
            $objWriter->writeAttribute('val', count($values));
344 31
            $objWriter->endElement();
345
346
            // Add points
347 31
            for ($i = 0; $i < $numValues; $i++) {
348
                // c:pt
349 31
                $objWriter->startElement('c:pt');
350 31
                $objWriter->writeAttribute('idx', $i);
351 31
                $objWriter->writeElement('c:v', $values[$i]);
352 31
                $objWriter->endElement();
353
            }
354
        } else {
355
            // Reference
356
            $objWriter->writeElement('c:f', $reference);
357
            $objWriter->startElement('c:' . $dataType . 'Cache');
358
359
            // c:ptCount
360
            $objWriter->startElement('c:ptCount');
361
            $objWriter->writeAttribute('val', count($values));
362
            $objWriter->endElement();
363
364
            // Add points
365
            for ($i = 0; $i < $numValues; $i++) {
366
                // c:pt
367
                $objWriter->startElement('c:pt');
368
                $objWriter->writeAttribute('idx', $i);
369
                $objWriter->writeElement('c:v', $values[$i]);
370
                $objWriter->endElement();
371
            }
372
373
            $objWriter->endElement();
374
        }
375
376 31
        $objWriter->endElement();
377 31
    }
378
379
    /**
380
     * Write Title
381
     *
382
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
383
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Title $subject
384
     * @throws \Exception
385
     */
386 35
    protected function writeTitle(XMLWriter $objWriter, Title $subject)
387
    {
388
        // c:title
389 35
        $objWriter->startElement('c:title');
390
391
        // c:tx
392 35
        $objWriter->startElement('c:tx');
393
394
        // c:rich
395 35
        $objWriter->startElement('c:rich');
396
397
        // a:bodyPr
398 35
        $objWriter->writeElement('a:bodyPr', null);
399
400
        // a:lstStyle
401 35
        $objWriter->writeElement('a:lstStyle', null);
402
403
        // a:p
404 35
        $objWriter->startElement('a:p');
405
406
        // a:pPr
407 35
        $objWriter->startElement('a:pPr');
408 35
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
409 35
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
410 35
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
411 35
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
412 35
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
413 35
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
414
415
        // a:defRPr
416 35
        $objWriter->writeElement('a:defRPr', null);
417
418 35
        $objWriter->endElement();
419
420
        // a:r
421 35
        $objWriter->startElement('a:r');
422
423
        // a:rPr
424 35
        $objWriter->startElement('a:rPr');
425 35
        $objWriter->writeAttribute('lang', 'en-US');
426 35
        $objWriter->writeAttribute('dirty', '0');
427
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
428 35
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
429 35
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
430 35
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
431 35
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
432 35
        $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '300000');
433 35
        $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-250000');
434 35
435
        // Font - a:solidFill
436
        $objWriter->startElement('a:solidFill');
437 35
438
        $this->writeColor($objWriter, $subject->getFont()->getColor());
439 35
440
        $objWriter->endElement();
441 35
442
        // Font - a:latin
443
        $objWriter->startElement('a:latin');
444 35
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
445 35
        $objWriter->endElement();
446 35
447
        $objWriter->endElement();
448 35
449
        // a:t
450
        $objWriter->writeElement('a:t', $subject->getText());
451 35
452
        $objWriter->endElement();
453 35
454
        // a:endParaRPr
455
        $objWriter->startElement('a:endParaRPr');
456 35
        $objWriter->writeAttribute('lang', 'en-US');
457 35
        $objWriter->writeAttribute('dirty', '0');
458 35
        $objWriter->endElement();
459 35
460
        $objWriter->endElement();
461 35
462
        $objWriter->endElement();
463 35
464
        $objWriter->endElement();
465 35
466
        // Write layout
467
        $this->writeLayout($objWriter, $subject);
468 35
469
        // c:overlay
470
        $objWriter->startElement('c:overlay');
471 35
        $objWriter->writeAttribute('val', '0');
472 35
        $objWriter->endElement();
473 35
474
        $objWriter->endElement();
475 35
    }
476 35
477
    /**
478
     * Write Plot Area
479
     *
480
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
481
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\PlotArea $subject
482
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
483
     * @throws \Exception
484
     */
485
    protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart)
486 36
    {
487
        // c:plotArea
488
        $objWriter->startElement('c:plotArea');
489 36
490
        // Write layout
491
        $this->writeLayout($objWriter, $subject);
492 36
493
        // Write chart
494
        $chartType = $subject->getType();
495 36
        if ($chartType instanceof Area) {
496 36
            $this->writeTypeArea($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
497 1
        } elseif ($chartType instanceof Bar) {
498 35
            $this->writeTypeBar($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
499 3
        } elseif ($chartType instanceof Bar3D) {
500 32
            $this->writeTypeBar3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
501 4
        } elseif ($chartType instanceof Doughnut) {
502 28
            $this->writeTypeDoughnut($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
503 1
        } elseif ($chartType instanceof Pie) {
504 27
            $this->writeTypePie($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
505 2
        } elseif ($chartType instanceof Pie3D) {
506 25
            $this->writeTypePie3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
507 4
        } elseif ($chartType instanceof Line) {
508 21
            $this->writeTypeLine($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
509 15
        } elseif ($chartType instanceof Scatter) {
510 6
            $this->writeTypeScatter($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
511 5
        } else {
512
            throw new \Exception('The chart type provided could not be rendered.');
513 1
        }
514
515
        // Write X axis?
516
        if ($chartType->hasAxisX()) {
517 35
            $this->writeAxis($objWriter, $subject->getAxisX(), Chart\Axis::AXIS_X, $chartType);
518 28
        }
519
520
        // Write Y axis?
521
        if ($chartType->hasAxisY()) {
522 35
            $this->writeAxis($objWriter, $subject->getAxisY(), Chart\Axis::AXIS_Y, $chartType);
523 28
        }
524
525
        $objWriter->endElement();
526 35
    }
527 35
528
    /**
529
     * Write Legend
530
     *
531
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
532
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Legend $subject
533
     * @throws \Exception
534
     */
535
    protected function writeLegend(XMLWriter $objWriter, Legend $subject)
536 35
    {
537
        // c:legend
538
        $objWriter->startElement('c:legend');
539 35
540
        // c:legendPos
541
        $objWriter->startElement('c:legendPos');
542 35
        $objWriter->writeAttribute('val', $subject->getPosition());
543 35
        $objWriter->endElement();
544 35
545
        // Write layout
546
        $this->writeLayout($objWriter, $subject);
547 35
548
        // c:overlay
549
        $objWriter->startElement('c:overlay');
550 35
        $objWriter->writeAttribute('val', '0');
551 35
        $objWriter->endElement();
552 35
553
        // c:spPr
554
        $objWriter->startElement('c:spPr');
555 35
556
        // Fill
557
        $this->writeFill($objWriter, $subject->getFill());
558 35
559
        // Border
560
        if ($subject->getBorder()->getLineStyle() != Border::LINE_NONE) {
561 35
            $this->writeBorder($objWriter, $subject->getBorder(), '');
562 35
        }
563
564
        $objWriter->endElement();
565 35
566
        // c:txPr
567
        $objWriter->startElement('c:txPr');
568 35
569
        // a:bodyPr
570
        $objWriter->writeElement('a:bodyPr', null);
571 35
572
        // a:lstStyle
573
        $objWriter->writeElement('a:lstStyle', null);
574 35
575
        // a:p
576
        $objWriter->startElement('a:p');
577 35
578
        // a:pPr
579
        $objWriter->startElement('a:pPr');
580 35
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
581 35
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
582 35
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
583 35
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
584 35
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
585 35
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
586 35
587
        // a:defRPr
588
        $objWriter->startElement('a:defRPr');
589 35
590
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
591 35
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
592 35
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
593 35
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
594 35
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
595 35
        $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '300000');
596 35
        $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-250000');
597 35
598
        // Font - a:solidFill
599
        $objWriter->startElement('a:solidFill');
600 35
601
        $this->writeColor($objWriter, $subject->getFont()->getColor());
602 35
603
        $objWriter->endElement();
604 35
605
        // Font - a:latin
606
        $objWriter->startElement('a:latin');
607 35
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
608 35
        $objWriter->endElement();
609 35
610
        $objWriter->endElement();
611 35
612
        $objWriter->endElement();
613 35
614
        // a:endParaRPr
615
        $objWriter->startElement('a:endParaRPr');
616 35
        $objWriter->writeAttribute('lang', 'en-US');
617 35
        $objWriter->writeAttribute('dirty', '0');
618 35
        $objWriter->endElement();
619 35
620
        $objWriter->endElement();
621 35
622
        $objWriter->endElement();
623 35
624
        $objWriter->endElement();
625 35
    }
626 35
627
    /**
628
     * Write Layout
629
     *
630
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
631
     * @param  mixed $subject
632
     * @throws \Exception
633
     */
634
    protected function writeLayout(XMLWriter $objWriter, $subject)
635 36
    {
636
        // c:layout
637
        $objWriter->startElement('c:layout');
638 36
639
        // c:manualLayout
640
        $objWriter->startElement('c:manualLayout');
641 36
        // c:xMode
642
        $objWriter->startElement('c:xMode');
643 36
        $objWriter->writeAttribute('val', 'edge');
644 36
        $objWriter->endElement();
645 36
646
        // c:yMode
647
        $objWriter->startElement('c:yMode');
648 36
        $objWriter->writeAttribute('val', 'edge');
649 36
        $objWriter->endElement();
650 36
651
        if ($subject->getOffsetX() != 0) {
652 36
            // c:x
653
            $objWriter->startElement('c:x');
654 35
            $objWriter->writeAttribute('val', $subject->getOffsetX());
655 35
            $objWriter->endElement();
656 35
        }
657
658
        if ($subject->getOffsetY() != 0) {
659 36
            // c:y
660
            $objWriter->startElement('c:y');
661 35
            $objWriter->writeAttribute('val', $subject->getOffsetY());
662 35
            $objWriter->endElement();
663 35
        }
664
665
        if ($subject->getWidth() != 0) {
666 36
            // c:w
667
            $objWriter->startElement('c:w');
668
            $objWriter->writeAttribute('val', $subject->getWidth());
669
            $objWriter->endElement();
670
        }
671
672
        if ($subject->getHeight() != 0) {
673 36
            // c:h
674
            $objWriter->startElement('c:h');
675
            $objWriter->writeAttribute('val', $subject->getHeight());
676
            $objWriter->endElement();
677
        }
678
679
        $objWriter->endElement();
680 36
        $objWriter->endElement();
681 36
    }
682 36
683
    /**
684
     * Write Type Area
685
     *
686
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
687
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Area $subject
688
     * @param  boolean $includeSheet
689
     * @throws \Exception
690
     */
691
    protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSheet = false)
692 1
    {
693
        // c:lineChart
694
        $objWriter->startElement('c:areaChart');
695 1
696
        // c:grouping
697
        $objWriter->startElement('c:grouping');
698 1
        $objWriter->writeAttribute('val', 'standard');
699 1
        $objWriter->endElement();
700 1
701
        // Write series
702
        $seriesIndex = 0;
703 1
        foreach ($subject->getSeries() as $series) {
704 1
            // c:ser
705
            $objWriter->startElement('c:ser');
706 1
707
            // c:ser > c:idx
708
            $objWriter->startElement('c:idx');
709 1
            $objWriter->writeAttribute('val', $seriesIndex);
710 1
            $objWriter->endElement();
711 1
712
            // c:ser > c:order
713
            $objWriter->startElement('c:order');
714 1
            $objWriter->writeAttribute('val', $seriesIndex);
715 1
            $objWriter->endElement();
716 1
717
            // c:ser > c:tx
718
            $objWriter->startElement('c:tx');
719 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
720 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
721 1
            $objWriter->endElement();
722 1
723
            // c:ser > c:dLbls
724
            // @link : https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.areachartseries.aspx
725
            $objWriter->startElement('c:dLbls');
726 1
727
            // c:ser > c:dLbls > c:showVal
728
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
729 1
730
            // c:ser > c:dLbls > c:showCatName
731
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
732 1
733
            // c:ser > c:dLbls > c:showSerName
734
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
735 1
736
            // c:ser > c:dLbls > c:showPercent
737
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
738 1
739
            // c:ser > ##c:dLbls
740
            $objWriter->endElement();
741 1
742
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
743 1
                // c:spPr
744
                $objWriter->startElement('c:spPr');
745
                // Write fill
746
                $this->writeFill($objWriter, $series->getFill());
747
                // ## c:spPr
748
                $objWriter->endElement();
749
            }
750
751
            // Write X axis data
752
            $axisXData = array_keys($series->getValues());
753 1
754
            // c:cat
755
            $objWriter->startElement('c:cat');
756 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
757 1
            $objWriter->endElement();
758 1
759
            // Write Y axis data
760
            $axisYData = array_values($series->getValues());
761 1
762
            // c:val
763
            $objWriter->startElement('c:val');
764 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
765 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
766 1
            $objWriter->endElement();
767 1
768
            $objWriter->endElement();
769 1
770
            ++$seriesIndex;
771 1
        }
772
773
        // c:axId
774
        $objWriter->startElement('c:axId');
775 1
        $objWriter->writeAttribute('val', '52743552');
776 1
        $objWriter->endElement();
777 1
778
        // c:axId
779
        $objWriter->startElement('c:axId');
780 1
        $objWriter->writeAttribute('val', '52749440');
781 1
        $objWriter->endElement();
782 1
783
        $objWriter->endElement();
784 1
    }
785 1
786
    /**
787
     * Write Type Bar
788
     *
789
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
790
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar $subject
791
     * @param  boolean $includeSheet
792
     * @throws \Exception
793
     */
794
    protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, $includeSheet = false)
795 3
    {
796
        // c:barChart
797
        $objWriter->startElement('c:barChart');
798 3
799
        // c:barDir
800
        $objWriter->startElement('c:barDir');
801 3
        $objWriter->writeAttribute('val', $subject->getBarDirection());
802 3
        $objWriter->endElement();
803 3
804
        // c:grouping
805
        $objWriter->startElement('c:grouping');
806 3
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
807 3
        $objWriter->endElement();
808 3
809
        // Write series
810
        $seriesIndex = 0;
811 3
        foreach ($subject->getSeries() as $series) {
812 3
            // c:ser
813
            $objWriter->startElement('c:ser');
814 3
815
            // c:idx
816
            $objWriter->startElement('c:idx');
817 3
            $objWriter->writeAttribute('val', $seriesIndex);
818 3
            $objWriter->endElement();
819 3
820
            // c:order
821
            $objWriter->startElement('c:order');
822 3
            $objWriter->writeAttribute('val', $seriesIndex);
823 3
            $objWriter->endElement();
824 3
825
            // c:tx
826
            $objWriter->startElement('c:tx');
827 3
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
828 3
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
829 3
            $objWriter->endElement();
830 3
831
            // Fills for points?
832
            $dataPointFills = $series->getDataPointFills();
833 3
            foreach ($dataPointFills as $key => $value) {
834 3
                // c:dPt
835
                $objWriter->startElement('c:dPt');
836 1
837
                // c:idx
838
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
839 1
840
                if ($value->getFillType() != Fill::FILL_NONE) {
841 1
                    // c:spPr
842
                    $objWriter->startElement('c:spPr');
843 1
                    // Write fill
844
                    $this->writeFill($objWriter, $value);
845 1
                    // ## c:spPr
846
                    $objWriter->endElement();
847 1
                }
848
849
                // ## c:dPt
850
                $objWriter->endElement();
851 1
            }
852
853
            // c:dLbls
854
            $objWriter->startElement('c:dLbls');
855 3
856
            if ($series->hasDlblNumFormat()) {
857 3
                //c:numFmt
858
                $objWriter->startElement('c:numFmt');
859
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
860
                $objWriter->writeAttribute('sourceLinked', '0');
861
                $objWriter->endElement();
862
            }
863
864
            // c:txPr
865
            $objWriter->startElement('c:txPr');
866 3
867
            // a:bodyPr
868
            $objWriter->writeElement('a:bodyPr');
869 3
870
            // a:lstStyle
871
            $objWriter->writeElement('a:lstStyle');
872 3
873
            // a:p
874
            $objWriter->startElement('a:p');
875 3
876
            // a:pPr
877
            $objWriter->startElement('a:pPr');
878 3
879
            // a:defRPr
880
            $objWriter->startElement('a:defRPr');
881 3
882
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
883 3
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
884 3
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
885 3
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
886 3
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
887 3
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
888 3
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
889 3
890
            // a:solidFill
891
            $objWriter->startElement('a:solidFill');
892 3
            $this->writeColor($objWriter, $series->getFont()->getColor());
893
            // >a:solidFill
894 3
            $objWriter->endElement();
895
            // a:latin
896 3
            $objWriter->startElement('a:latin');
897
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
898
            // >a:latin
899 3
            $objWriter->endElement();
900 3
901 3
            // >a:defRPr
902
            $objWriter->endElement();
903 3
            // >a:pPr
904
            $objWriter->endElement();
905 3
906
            // a:endParaRPr
907
            $objWriter->startElement('a:endParaRPr');
908 3
            $objWriter->writeAttribute('lang', 'en-US');
909 3
            $objWriter->writeAttribute('dirty', '0');
910 3
            $objWriter->endElement();
911 3
912
            // >a:p
913 3
            $objWriter->endElement();
914
            // >a:lstStyle
915 3
            $objWriter->endElement();
916
917
            // c:dLblPos
918 3
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
919
920
            // c:showVal
921 3
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
922
923
            // c:showCatName
924 3
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
925
926
            // c:showSerName
927 3
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
928
929
            // c:showPercent
930 3
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
931
932
            // c:separator
933 3
            $objWriter->writeElement('c:separator', $series->hasShowSeparator() ? $series->getSeparator() : '');
934
935
            // c:showLeaderLines
936 3
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
937
938 3
            $objWriter->endElement();
939
940
            // c:spPr
941 3
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
942
                // c:spPr
943
                $objWriter->startElement('c:spPr');
944
                // Write fill
945
                $this->writeFill($objWriter, $series->getFill());
946
                // ## c:spPr
947
                $objWriter->endElement();
948
            }
949
950
            // Write X axis data
951 3
            $axisXData = array_keys($series->getValues());
952
953
            // c:cat
954 3
            $objWriter->startElement('c:cat');
955 3
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
956 3
            $objWriter->endElement();
957
958
            // Write Y axis data
959 3
            $axisYData = array_values($series->getValues());
960
961
            // c:val
962 3
            $objWriter->startElement('c:val');
963 3
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
964 3
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
965 3
            $objWriter->endElement();
966
967 3
            $objWriter->endElement();
968
969 3
            ++$seriesIndex;
970
        }
971
972
        // c:gapWidth
973 3
        $objWriter->startElement('c:gapWidth');
974 3
        $objWriter->writeAttribute('val', $subject->getGapWidthPercent());
975 3
        $objWriter->endElement();
976
977
        // c:overlap
978
        $barGrouping = $subject->getBarGrouping();
979 3
        $objWriter->startElement('c:overlap');
980
        if ($barGrouping === Bar::GROUPING_CLUSTERED) {
981
            $objWriter->writeAttribute('val', '0');
982 3
        } elseif ($barGrouping === Bar::GROUPING_STACKED || $barGrouping === Bar::GROUPING_PERCENTSTACKED) {
983 3
            $objWriter->writeAttribute('val', '100000');
984 3
        }
985
        $objWriter->endElement();
986
987 3
        // c:axId
988 3
        $objWriter->startElement('c:axId');
989 3
        $objWriter->writeAttribute('val', '52743552');
990
        $objWriter->endElement();
991
992 3
        // c:axId
993 3
        $objWriter->startElement('c:axId');
994 3
        $objWriter->writeAttribute('val', '52749440');
995
        $objWriter->endElement();
996
997 3
        // c:extLst
998 3
        $objWriter->startElement('c:extLst');
999 3
        $objWriter->endElement();
1000
1001
        $objWriter->endElement();
1002 3
    }
1003 3
1004 3
    /**
1005
     * Write Type Bar3D
1006 3
     *
1007 3
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1008
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D $subject
1009
     * @param  boolean $includeSheet
1010
     * @throws \Exception
1011
     */
1012
    protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, $includeSheet = false)
1013
    {
1014
        // c:bar3DChart
1015
        $objWriter->startElement('c:bar3DChart');
1016
1017 4
        // c:barDir
1018
        $objWriter->startElement('c:barDir');
1019
        $objWriter->writeAttribute('val', $subject->getBarDirection());
1020 4
        $objWriter->endElement();
1021
1022
        // c:grouping
1023 4
        $objWriter->startElement('c:grouping');
1024 4
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
1025 4
        $objWriter->endElement();
1026
1027
        // Write series
1028 4
        $seriesIndex = 0;
1029 4
        foreach ($subject->getSeries() as $series) {
1030 4
            // c:ser
1031
            $objWriter->startElement('c:ser');
1032
1033 4
            // c:idx
1034 4
            $objWriter->startElement('c:idx');
1035
            $objWriter->writeAttribute('val', $seriesIndex);
1036 4
            $objWriter->endElement();
1037
1038
            // c:order
1039 4
            $objWriter->startElement('c:order');
1040 4
            $objWriter->writeAttribute('val', $seriesIndex);
1041 4
            $objWriter->endElement();
1042
1043
            // c:tx
1044 4
            $objWriter->startElement('c:tx');
1045 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1046 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1047
            $objWriter->endElement();
1048
1049 4
            // Fills for points?
1050 4
            $dataPointFills = $series->getDataPointFills();
1051 4
            foreach ($dataPointFills as $key => $value) {
1052 4
                // c:dPt
1053
                $objWriter->startElement('c:dPt');
1054
1055 4
                // c:idx
1056 4
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1057
1058 1
                if ($value->getFillType() != Fill::FILL_NONE) {
1059
                    // c:spPr
1060
                    $objWriter->startElement('c:spPr');
1061 1
                    // Write fill
1062
                    $this->writeFill($objWriter, $value);
1063 1
                    // ## c:spPr
1064
                    $objWriter->endElement();
1065 1
                }
1066
1067 1
                // ## c:dPt
1068
                $objWriter->endElement();
1069 1
            }
1070
1071
            // c:dLbls
1072
            $objWriter->startElement('c:dLbls');
1073 1
1074
            // c:txPr
1075
            $objWriter->startElement('c:txPr');
1076
1077 4
            // a:bodyPr
1078
            $objWriter->writeElement('a:bodyPr', null);
1079
1080 4
            // a:lstStyle
1081
            $objWriter->writeElement('a:lstStyle', null);
1082
1083 4
            // a:p
1084
            $objWriter->startElement('a:p');
1085
1086 4
            // a:pPr
1087
            $objWriter->startElement('a:pPr');
1088
1089 4
            // a:defRPr
1090
            $objWriter->startElement('a:defRPr');
1091
1092 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1093
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1094
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1095 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1096
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1097 4
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1098 4
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1099 4
1100 4
            // Font - a:solidFill
1101 4
            $objWriter->startElement('a:solidFill');
1102 4
1103 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1104
1105
            $objWriter->endElement();
1106 4
1107
            // Font - a:latin
1108 4
            $objWriter->startElement('a:latin');
1109
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1110 4
            $objWriter->endElement();
1111
1112
            $objWriter->endElement();
1113 4
1114 4
            $objWriter->endElement();
1115 4
1116
            // a:endParaRPr
1117 4
            $objWriter->startElement('a:endParaRPr');
1118
            $objWriter->writeAttribute('lang', 'en-US');
1119 4
            $objWriter->writeAttribute('dirty', '0');
1120
            $objWriter->endElement();
1121
1122 4
            $objWriter->endElement();
1123 4
1124 4
            $objWriter->endElement();
1125 4
1126
            // c:showVal
1127 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1128
1129 4
            // c:showCatName
1130
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1131
1132 4
            // c:showSerName
1133
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1134
1135 4
            // c:showPercent
1136
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1137
1138 4
            // c:showLeaderLines
1139
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1140
1141 4
            $objWriter->endElement();
1142
1143
            // c:spPr
1144 4
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
1145
                // c:spPr
1146
                $objWriter->startElement('c:spPr');
1147 4
                // Write fill
1148
                $this->writeFill($objWriter, $series->getFill());
1149 4
                // ## c:spPr
1150
                $objWriter->endElement();
1151
            }
1152 4
1153
            // Write X axis data
1154
            $axisXData = array_keys($series->getValues());
1155
1156
            // c:cat
1157
            $objWriter->startElement('c:cat');
1158
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1159
            $objWriter->endElement();
1160
1161
            // Write Y axis data
1162 4
            $axisYData = array_values($series->getValues());
1163
1164
            // c:val
1165 4
            $objWriter->startElement('c:val');
1166 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1167 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1168
            $objWriter->endElement();
1169
1170 4
            $objWriter->endElement();
1171
1172
            ++$seriesIndex;
1173 4
        }
1174 4
1175 4
        // c:gapWidth
1176 4
        $objWriter->startElement('c:gapWidth');
1177
        $objWriter->writeAttribute('val', $subject->getGapWidthPercent());
1178 4
        $objWriter->endElement();
1179
1180 4
        // c:axId
1181
        $objWriter->startElement('c:axId');
1182
        $objWriter->writeAttribute('val', '52743552');
1183
        $objWriter->endElement();
1184 4
1185 4
        // c:axId
1186 4
        $objWriter->startElement('c:axId');
1187
        $objWriter->writeAttribute('val', '52749440');
1188
        $objWriter->endElement();
1189 4
1190 4
        // c:axId
1191 4
        $objWriter->startElement('c:axId');
1192
        $objWriter->writeAttribute('val', '0');
1193
        $objWriter->endElement();
1194 4
1195 4
        $objWriter->endElement();
1196 4
    }
1197
1198
    /**
1199 4
     * Write Type Pie
1200 4
     *
1201 4
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1202
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut $subject
1203
     * @param  boolean $includeSheet
1204 4
     * @throws \Exception
1205 4
     */
1206 4
    protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, $includeSheet = false)
1207
    {
1208 4
        // c:pieChart
1209 4
        $objWriter->startElement('c:doughnutChart');
1210
1211
        // c:varyColors
1212
        $objWriter->startElement('c:varyColors');
1213
        $objWriter->writeAttribute('val', '1');
1214
        $objWriter->endElement();
1215
1216
        // Write series
1217
        $seriesIndex = 0;
1218
        foreach ($subject->getSeries() as $series) {
1219 1
            // c:ser
1220
            $objWriter->startElement('c:ser');
1221
1222 1
            // c:idx
1223
            $objWriter->startElement('c:idx');
1224
            $objWriter->writeAttribute('val', $seriesIndex);
1225 1
            $objWriter->endElement();
1226 1
1227 1
            // c:order
1228
            $objWriter->startElement('c:order');
1229
            $objWriter->writeAttribute('val', $seriesIndex);
1230 1
            $objWriter->endElement();
1231 1
1232
            // c:tx
1233 1
            $objWriter->startElement('c:tx');
1234
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1235
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1236 1
            $objWriter->endElement();
1237 1
1238 1
            // Fills for points?
1239
            $dataPointFills = $series->getDataPointFills();
1240
            foreach ($dataPointFills as $key => $value) {
1241 1
                // c:dPt
1242 1
                $objWriter->startElement('c:dPt');
1243 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1244
                // c:dPt/c:spPr
1245
                $objWriter->startElement('c:spPr');
1246 1
                $this->writeFill($objWriter, $value);
1247 1
                // c:dPt/##c:spPr
1248 1
                $objWriter->endElement();
1249 1
                // ##c:dPt
1250
                $objWriter->endElement();
1251
            }
1252 1
1253 1
            // Write X axis data
1254
            $axisXData = array_keys($series->getValues());
1255 1
1256 1
            // c:cat
1257
            $objWriter->startElement('c:cat');
1258 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1259 1
            $objWriter->endElement();
1260
1261 1
            // Write Y axis data
1262
            $axisYData = array_values($series->getValues());
1263 1
1264
            // c:val
1265
            $objWriter->startElement('c:val');
1266
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1267 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1268
            $objWriter->endElement();
1269
1270 1
            $objWriter->endElement();
1271 1
1272 1
            ++$seriesIndex;
1273
        }
1274
1275 1
        // c:dLbls
1276
        $objWriter->startElement('c:dLbls');
1277
1278 1
        $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
0 ignored issues
show
Bug introduced by
The variable $series seems to be defined by a foreach iteration on line 1218. Are you sure the iterator is never empty, otherwise this variable is not defined?

It seems like you are relying on a variable being defined by an iteration:

foreach ($a as $b) {
}

// $b is defined here only if $a has elements, for example if $a is array()
// then $b would not be defined here. To avoid that, we recommend to set a
// default value for $b.


// Better
$b = 0; // or whatever default makes sense in your context
foreach ($a as $b) {
}

// $b is now guaranteed to be defined here.
Loading history...
1279 1
        $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1280 1
        $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1281 1
        $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1282
        $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1283 1
        $this->writeElementWithValAttribute($objWriter, 'c:showBubbleSize', '0');
1284
        $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1285 1
1286
        if ($series->hasDlblNumFormat()) {
1287
            //c:numFmt
1288
            $objWriter->startElement('c:numFmt');
1289 1
            $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
1290
            $objWriter->writeAttribute('sourceLinked', '0');
1291 1
            $objWriter->endElement();
1292 1
        }
1293 1
1294 1
        // c:dLbls\c:txPr
1295 1
        $objWriter->startElement('c:txPr');
1296 1
        $objWriter->writeElement('a:bodyPr', null);
1297 1
        $objWriter->writeElement('a:lstStyle', null);
1298
1299 1
        // c:dLbls\c:txPr\a:p
1300
        $objWriter->startElement('a:p');
1301
1302
        // c:dLbls\c:txPr\a:p\a:pPr
1303
        $objWriter->startElement('a:pPr');
1304
1305
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr
1306
        $objWriter->startElement('a:defRPr');
1307
        $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1308 1
        $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1309 1
        $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1310 1
        $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1311
        $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1312
        $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1313 1
        $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1314
1315
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:solidFill
1316 1
        $objWriter->startElement('a:solidFill');
1317
        $this->writeColor($objWriter, $series->getFont()->getColor());
1318
        $objWriter->endElement();
1319 1
1320 1
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:latin
1321 1
        $objWriter->startElement('a:latin');
1322 1
        $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1323 1
        $objWriter->endElement();
1324 1
1325 1
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\
1326 1
        $objWriter->endElement();
1327
        // c:dLbls\c:txPr\a:p\a:pPr\
1328
        $objWriter->endElement();
1329 1
1330 1
        // c:dLbls\c:txPr\a:p\a:endParaRPr
1331 1
        $objWriter->startElement('a:endParaRPr');
1332
        $objWriter->writeAttribute('lang', 'en-US');
1333
        $objWriter->writeAttribute('dirty', '0');
1334 1
        $objWriter->endElement();
1335 1
1336 1
        // c:dLbls\c:txPr\a:p\
1337
        $objWriter->endElement();
1338
        // c:dLbls\c:txPr\
1339 1
        $objWriter->endElement();
1340
1341 1
        $separator = $series->getSeparator();
1342
        if (!empty($separator) && $separator != PHP_EOL) {
1343
            // c:dLbls\c:separator
1344 1
            $objWriter->writeElement('c:separator', $separator);
1345 1
        }
1346 1
1347 1
        // c:dLbls\
1348
        $objWriter->endElement();
1349
1350 1
        $this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', '0');
1351
        $this->writeElementWithValAttribute($objWriter, 'c:holeSize', $subject->getHoleSize());
1352 1
1353
        $objWriter->endElement();
1354 1
    }
1355 1
1356
    /**
1357 1
     * Write Type Pie
1358
     *
1359
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1360
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie $subject
1361 1
     * @param  boolean $includeSheet
1362
     * @throws \Exception
1363 1
     */
1364 1
    protected function writeTypePie(XMLWriter $objWriter, Pie $subject, $includeSheet = false)
1365
    {
1366 1
        // c:pieChart
1367 1
        $objWriter->startElement('c:pieChart');
1368
1369
        // c:varyColors
1370
        $objWriter->startElement('c:varyColors');
1371
        $objWriter->writeAttribute('val', '1');
1372
        $objWriter->endElement();
1373
1374
        // Write series
1375
        $seriesIndex = 0;
1376
        foreach ($subject->getSeries() as $series) {
1377 2
            // c:ser
1378
            $objWriter->startElement('c:ser');
1379
1380 2
            // c:idx
1381
            $objWriter->startElement('c:idx');
1382
            $objWriter->writeAttribute('val', $seriesIndex);
1383 2
            $objWriter->endElement();
1384 2
1385 2
            // c:order
1386
            $objWriter->startElement('c:order');
1387
            $objWriter->writeAttribute('val', $seriesIndex);
1388 2
            $objWriter->endElement();
1389 2
1390
            // c:tx
1391 2
            $objWriter->startElement('c:tx');
1392
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1393
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1394 2
            $objWriter->endElement();
1395 2
1396 2
            // Fills for points?
1397
            $dataPointFills = $series->getDataPointFills();
1398
            foreach ($dataPointFills as $key => $value) {
1399 2
                // c:dPt
1400 2
                $objWriter->startElement('c:dPt');
1401 2
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1402
                // c:dPt/c:spPr
1403
                $objWriter->startElement('c:spPr');
1404 2
                $this->writeFill($objWriter, $value);
1405 2
                // c:dPt/##c:spPr
1406 2
                $objWriter->endElement();
1407 2
                // ##c:dPt
1408
                $objWriter->endElement();
1409
            }
1410 2
1411 2
            // c:dLbls
1412
            $objWriter->startElement('c:dLbls');
1413 1
1414 1
            if ($series->hasDlblNumFormat()) {
1415
                //c:numFmt
1416 1
                $objWriter->startElement('c:numFmt');
1417 1
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
1418
                $objWriter->writeAttribute('sourceLinked', '0');
1419 1
                $objWriter->endElement();
1420
            }
1421 1
1422
            // c:txPr
1423
            $objWriter->startElement('c:txPr');
1424
1425 2
            // a:bodyPr
1426
            $objWriter->writeElement('a:bodyPr', null);
1427 2
1428
            // a:lstStyle
1429
            $objWriter->writeElement('a:lstStyle', null);
1430
1431
            // a:p
1432
            $objWriter->startElement('a:p');
1433
1434
            // a:pPr
1435
            $objWriter->startElement('a:pPr');
1436 2
1437
            // a:defRPr
1438
            $objWriter->startElement('a:defRPr');
1439 2
1440
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1441
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1442 2
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1443
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1444
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1445 2
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1446
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1447
1448 2
            // Font - a:solidFill
1449
            $objWriter->startElement('a:solidFill');
1450
1451 2
            $this->writeColor($objWriter, $series->getFont()->getColor());
1452
1453 2
            $objWriter->endElement();
1454 2
1455 2
            // Font - a:latin
1456 2
            $objWriter->startElement('a:latin');
1457 2
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1458 2
            $objWriter->endElement();
1459 2
1460
            $objWriter->endElement();
1461
1462 2
            $objWriter->endElement();
1463
1464 2
            // a:endParaRPr
1465
            $objWriter->startElement('a:endParaRPr');
1466 2
            $objWriter->writeAttribute('lang', 'en-US');
1467
            $objWriter->writeAttribute('dirty', '0');
1468
            $objWriter->endElement();
1469 2
1470 2
            $objWriter->endElement();
1471 2
1472
            $objWriter->endElement();
1473 2
1474
            // c:dLblPos
1475 2
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1476
1477
            // c:showLegendKey
1478 2
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
1479 2
1480 2
            // c:showVal
1481 2
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1482
1483 2
            // c:showCatName
1484
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1485 2
1486
            // c:showSerName
1487
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1488 2
1489
            // c:showPercent
1490
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1491 2
1492
            // c:showLeaderLines
1493
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1494 2
1495
            $objWriter->endElement();
1496
1497 2
            // Write X axis data
1498
            $axisXData = array_keys($series->getValues());
1499
1500 2
            // c:cat
1501
            $objWriter->startElement('c:cat');
1502
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1503 2
            $objWriter->endElement();
1504
1505
            // Write Y axis data
1506 2
            $axisYData = array_values($series->getValues());
1507
1508
            // c:val
1509 2
            $objWriter->startElement('c:val');
1510
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1511 2
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1512
            $objWriter->endElement();
1513
1514 2
            $objWriter->endElement();
1515
1516
            ++$seriesIndex;
1517 2
        }
1518 2
1519 2
        $objWriter->endElement();
1520
    }
1521
1522 2
    /**
1523
     * Write Type Pie3D
1524
     *
1525 2
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1526 2
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D $subject
1527 2
     * @param  boolean $includeSheet
1528 2
     * @throws \Exception
1529
     */
1530 2
    protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, $includeSheet = false)
1531
    {
1532 2
        // c:pie3DChart
1533
        $objWriter->startElement('c:pie3DChart');
1534
1535 2
        // c:varyColors
1536 2
        $objWriter->startElement('c:varyColors');
1537
        $objWriter->writeAttribute('val', '1');
1538
        $objWriter->endElement();
1539
1540
        // Write series
1541
        $seriesIndex = 0;
1542
        foreach ($subject->getSeries() as $series) {
1543
            // c:ser
1544
            $objWriter->startElement('c:ser');
1545
1546 4
            // c:idx
1547
            $objWriter->startElement('c:idx');
1548
            $objWriter->writeAttribute('val', $seriesIndex);
1549 4
            $objWriter->endElement();
1550
1551
            // c:order
1552 4
            $objWriter->startElement('c:order');
1553 4
            $objWriter->writeAttribute('val', $seriesIndex);
1554 4
            $objWriter->endElement();
1555
1556
            // c:tx
1557 4
            $objWriter->startElement('c:tx');
1558 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1559
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1560 4
            $objWriter->endElement();
1561
1562
            // c:explosion
1563 4
            $objWriter->startElement('c:explosion');
1564 4
            $objWriter->writeAttribute('val', $subject->getExplosion());
1565 4
            $objWriter->endElement();
1566
1567
            // Fills for points?
1568 4
            $dataPointFills = $series->getDataPointFills();
1569 4
            foreach ($dataPointFills as $key => $value) {
1570 4
                // c:dPt
1571
                $objWriter->startElement('c:dPt');
1572
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1573 4
                // c:dPt/c:spPr
1574 4
                $objWriter->startElement('c:spPr');
1575 4
                $this->writeFill($objWriter, $value);
1576 4
                // c:dPt/##c:spPr
1577
                $objWriter->endElement();
1578
                // ##c:dPt
1579 4
                $objWriter->endElement();
1580 4
            }
1581 4
1582
            // c:dLbls
1583
            $objWriter->startElement('c:dLbls');
1584 4
1585 4
            // c:txPr
1586
            $objWriter->startElement('c:txPr');
1587 1
1588 1
            // a:bodyPr
1589
            $objWriter->writeElement('a:bodyPr', null);
1590 1
1591 1
            // a:lstStyle
1592
            $objWriter->writeElement('a:lstStyle', null);
1593 1
1594
            // a:p
1595 1
            $objWriter->startElement('a:p');
1596
1597
            // a:pPr
1598
            $objWriter->startElement('a:pPr');
1599 4
1600
            // a:defRPr
1601
            $objWriter->startElement('a:defRPr');
1602 4
1603
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1604
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1605 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1606
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1607
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1608 4
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1609
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1610
1611 4
            // Font - a:solidFill
1612
            $objWriter->startElement('a:solidFill');
1613
1614 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1615
1616
            $objWriter->endElement();
1617 4
1618
            // Font - a:latin
1619 4
            $objWriter->startElement('a:latin');
1620 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1621 4
            $objWriter->endElement();
1622 4
1623 4
            $objWriter->endElement();
1624 4
1625 4
            $objWriter->endElement();
1626
1627
            // a:endParaRPr
1628 4
            $objWriter->startElement('a:endParaRPr');
1629
            $objWriter->writeAttribute('lang', 'en-US');
1630 4
            $objWriter->writeAttribute('dirty', '0');
1631
            $objWriter->endElement();
1632 4
1633
            $objWriter->endElement();
1634
1635 4
            $objWriter->endElement();
1636 4
1637 4
            // c:dLblPos
1638
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1639 4
1640
            // c:showVal
1641 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1642
1643
            // c:showCatName
1644 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1645 4
1646 4
            // c:showSerName
1647 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1648
1649 4
            // c:showPercent
1650
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1651 4
1652
            // c:showLeaderLines
1653
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1654 4
1655
            $objWriter->endElement();
1656
1657 4
            // Write X axis data
1658
            $axisXData = array_keys($series->getValues());
1659
1660 4
            // c:cat
1661
            $objWriter->startElement('c:cat');
1662
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1663 4
            $objWriter->endElement();
1664
1665
            // Write Y axis data
1666 4
            $axisYData = array_values($series->getValues());
1667
1668
            // c:val
1669 4
            $objWriter->startElement('c:val');
1670
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1671
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1672 4
            $objWriter->endElement();
1673
1674 4
            $objWriter->endElement();
1675
1676
            ++$seriesIndex;
1677 4
        }
1678
1679
        $objWriter->endElement();
1680 4
    }
1681 4
1682 4
    /**
1683
     * Write Type Line
1684
     *
1685 4
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1686
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Line $subject
1687
     * @param  boolean $includeSheet
1688 4
     * @throws \Exception
1689 4
     */
1690 4
    protected function writeTypeLine(XMLWriter $objWriter, Line $subject, $includeSheet = false)
1691 4
    {
1692
        // c:lineChart
1693 4
        $objWriter->startElement('c:lineChart');
1694
1695 4
        // c:grouping
1696
        $objWriter->startElement('c:grouping');
1697
        $objWriter->writeAttribute('val', 'standard');
1698 4
        $objWriter->endElement();
1699 4
1700
        // Write series
1701
        $seriesIndex = 0;
1702
        foreach ($subject->getSeries() as $series) {
1703
            // c:ser
1704
            $objWriter->startElement('c:ser');
1705
1706
            // c:idx
1707
            $objWriter->startElement('c:idx');
1708
            $objWriter->writeAttribute('val', $seriesIndex);
1709 15
            $objWriter->endElement();
1710
1711
            // c:order
1712 15
            $objWriter->startElement('c:order');
1713
            $objWriter->writeAttribute('val', $seriesIndex);
1714
            $objWriter->endElement();
1715 15
1716 15
            // c:tx
1717 15
            $objWriter->startElement('c:tx');
1718
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1719
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1720 15
            $objWriter->endElement();
1721 15
1722
            // c:spPr
1723 11
            $objWriter->startElement('c:spPr');
1724
            // Write fill
1725
            $this->writeFill($objWriter, $series->getFill());
1726 11
            // Write outline
1727 11
            $this->writeOutline($objWriter, $series->getOutline());
1728 11
            // ## c:spPr
1729
            $objWriter->endElement();
1730
1731 11
            // Marker
1732 11
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1733 11
1734
            // c:dLbls
1735
            $objWriter->startElement('c:dLbls');
1736 11
1737 11
            // c:txPr
1738 11
            $objWriter->startElement('c:txPr');
1739 11
1740
            // a:bodyPr
1741
            $objWriter->writeElement('a:bodyPr', null);
1742 11
1743
            // a:lstStyle
1744 11
            $objWriter->writeElement('a:lstStyle', null);
1745
1746 11
            // a:p
1747
            $objWriter->startElement('a:p');
1748 11
1749
            // a:pPr
1750
            $objWriter->startElement('a:pPr');
1751 11
1752
            // a:defRPr
1753
            $objWriter->startElement('a:defRPr');
1754 11
1755
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1756
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1757 11
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1758
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1759
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1760 11
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1761
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1762
1763 11
            // Font - a:solidFill
1764
            $objWriter->startElement('a:solidFill');
1765
1766 11
            $this->writeColor($objWriter, $series->getFont()->getColor());
1767
1768
            $objWriter->endElement();
1769 11
1770
            // Font - a:latin
1771
            $objWriter->startElement('a:latin');
1772 11
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1773
            $objWriter->endElement();
1774 11
1775 11
            $objWriter->endElement();
1776 11
1777 11
            $objWriter->endElement();
1778 11
1779 11
            // a:endParaRPr
1780 11
            $objWriter->startElement('a:endParaRPr');
1781
            $objWriter->writeAttribute('lang', 'en-US');
1782
            $objWriter->writeAttribute('dirty', '0');
1783 11
            $objWriter->endElement();
1784
1785 11
            $objWriter->endElement();
1786
1787 11
            $objWriter->endElement();
1788
1789
            // c:showVal
1790 11
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1791 11
1792 11
            // c:showCatName
1793
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1794 11
1795
            // c:showSerName
1796 11
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1797
1798
            // c:showPercent
1799 11
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1800 11
1801 11
            // c:showLeaderLines
1802 11
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1803
1804 11
            // > c:dLbls
1805
            $objWriter->endElement();
1806 11
1807
            // Write X axis data
1808
            $axisXData = array_keys($series->getValues());
1809 11
1810
            // c:cat
1811
            $objWriter->startElement('c:cat');
1812 11
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1813
            $objWriter->endElement();
1814
1815 11
            // Write Y axis data
1816
            $axisYData = array_values($series->getValues());
1817
1818 11
            // c:val
1819
            $objWriter->startElement('c:val');
1820
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1821 11
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1822
            $objWriter->endElement();
1823
1824 11
            $objWriter->endElement();
1825
1826
            ++$seriesIndex;
1827 11
        }
1828
1829
        // c:marker
1830 11
        $objWriter->startElement('c:marker');
1831
        $objWriter->writeAttribute('val', '1');
1832
        $objWriter->endElement();
1833 11
1834 11
        // c:smooth
1835 11
        $objWriter->startElement('c:smooth');
1836
        $objWriter->writeAttribute('val', '0');
1837
        $objWriter->endElement();
1838 11
1839
        // c:axId
1840
        $objWriter->startElement('c:axId');
1841 11
        $objWriter->writeAttribute('val', '52743552');
1842 11
        $objWriter->endElement();
1843 11
1844 11
        // c:axId
1845
        $objWriter->startElement('c:axId');
1846 11
        $objWriter->writeAttribute('val', '52749440');
1847
        $objWriter->endElement();
1848 11
1849
        $objWriter->endElement();
1850
    }
1851
1852 15
    /**
1853 15
     * Write Type Scatter
1854 15
     *
1855
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1856
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter $subject
1857 15
     * @param  boolean $includeSheet
1858 15
     * @throws \Exception
1859 15
     */
1860
    protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, $includeSheet = false)
1861
    {
1862 15
        // c:scatterChart
1863 15
        $objWriter->startElement('c:scatterChart');
1864 15
1865
        // c:scatterStyle
1866
        $objWriter->startElement('c:scatterStyle');
1867 15
        $objWriter->writeAttribute('val', 'lineMarker');
1868 15
        $objWriter->endElement();
1869 15
1870
        // c:varyColors
1871 15
        $objWriter->startElement('c:varyColors');
1872 15
        $objWriter->writeAttribute('val', '0');
1873
        $objWriter->endElement();
1874
1875
        // Write series
1876
        $seriesIndex = 0;
1877
        foreach ($subject->getSeries() as $series) {
1878
            // c:ser
1879
            $objWriter->startElement('c:ser');
1880
1881
            // c:idx
1882 5
            $objWriter->startElement('c:idx');
1883
            $objWriter->writeAttribute('val', $seriesIndex);
1884
            $objWriter->endElement();
1885 5
1886
            // c:order
1887
            $objWriter->startElement('c:order');
1888 5
            $objWriter->writeAttribute('val', $seriesIndex);
1889 5
            $objWriter->endElement();
1890 5
1891
            // c:tx
1892
            $objWriter->startElement('c:tx');
1893 5
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1894 5
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1895 5
            $objWriter->endElement();
1896
1897
            // c:spPr
1898 5
            $objWriter->startElement('c:spPr');
1899 5
            // Write fill
1900
            $this->writeFill($objWriter, $series->getFill());
1901 5
            // Write outline
1902
            $this->writeOutline($objWriter, $series->getOutline());
1903
            // ## c:spPr
1904 5
            $objWriter->endElement();
1905 5
1906 5
            // Marker
1907
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1908
1909 5
            // c:dLbls
1910 5
            $objWriter->startElement('c:dLbls');
1911 5
1912
            // c:txPr
1913
            $objWriter->startElement('c:txPr');
1914 5
1915 5
            // a:bodyPr
1916 5
            $objWriter->writeElement('a:bodyPr', null);
1917 5
1918
            // a:lstStyle
1919
            $objWriter->writeElement('a:lstStyle', null);
1920 5
1921
            // a:p
1922
            $objWriter->startElement('a:p');
1923 5
1924
            // a:pPr
1925
            $objWriter->startElement('a:pPr');
1926 5
1927
            // a:defRPr
1928
            $objWriter->startElement('a:defRPr');
1929 5
1930
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1931
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1932 5
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1933
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1934
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1935 5
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1936
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1937
1938 5
            // Font - a:solidFill
1939
            $objWriter->startElement('a:solidFill');
1940
1941 5
            $this->writeColor($objWriter, $series->getFont()->getColor());
1942
1943 5
            $objWriter->endElement();
1944 5
1945 5
            // Font - a:latin
1946 5
            $objWriter->startElement('a:latin');
1947 5
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1948 5
            $objWriter->endElement();
1949 5
1950
            $objWriter->endElement();
1951
1952 5
            $objWriter->endElement();
1953
1954 5
            // a:endParaRPr
1955
            $objWriter->startElement('a:endParaRPr');
1956 5
            $objWriter->writeAttribute('lang', 'en-US');
1957
            $objWriter->writeAttribute('dirty', '0');
1958
            $objWriter->endElement();
1959 5
1960 5
            $objWriter->endElement();
1961 5
1962
            $objWriter->endElement();
1963 5
1964
            // c:showLegendKey
1965 5
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
1966
1967
            // c:showVal
1968 5
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1969 5
1970 5
            // c:showCatName
1971 5
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1972
1973 5
            // c:showSerName
1974
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1975 5
1976
            // c:showPercent
1977
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1978 5
1979
            // c:separator
1980
            $separator = $series->getSeparator();
1981 5
            if (!empty($separator) && $separator != PHP_EOL) {
1982
                // c:dLbls\c:separator
1983
                $objWriter->writeElement('c:separator', $separator);
1984 5
            }
1985
1986
            // c:showLeaderLines
1987 5
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1988
1989
            $objWriter->endElement();
1990 5
1991
            // Write X axis data
1992
            $axisXData = array_keys($series->getValues());
1993 5
1994
            // c:xVal
1995
            $objWriter->startElement('c:xVal');
1996 5
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1997
            $objWriter->endElement();
1998 5
1999
            // Write Y axis data
2000
            $axisYData = array_values($series->getValues());
2001 5
2002
            // c:yVal
2003 5
            $objWriter->startElement('c:yVal');
2004
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
2005 5
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
2006
            $objWriter->endElement();
2007 5
2008
            // c:smooth
2009
            $objWriter->startElement('c:smooth');
2010 5
            $objWriter->writeAttribute('val', '0');
2011
            $objWriter->endElement();
2012
2013 5
            $objWriter->endElement();
2014 5
2015 5
            ++$seriesIndex;
2016
        }
2017
2018 5
        // c:axId
2019
        $objWriter->startElement('c:axId');
2020
        $objWriter->writeAttribute('val', '52743552');
2021 5
        $objWriter->endElement();
2022 5
2023 5
        // c:axId
2024 5
        $objWriter->startElement('c:axId');
2025
        $objWriter->writeAttribute('val', '52749440');
2026
        $objWriter->endElement();
2027 5
2028 5
        $objWriter->endElement();
2029 5
    }
2030
2031 5
    /**
2032
     * Write chart relationships to XML format
2033 5
     *
2034
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $pChart
2035
     * @return string                    XML Output
2036
     * @throws \Exception
2037 5
     */
2038 5
    public function writeChartRelationships(Chart $pChart)
2039 5
    {
2040
        // Create XML writer
2041
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
2042 5
2043 5
        // XML header
2044 5
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
2045
2046 5
        // Relationships
2047 5
        $objWriter->startElement('Relationships');
2048
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
2049
2050
        // Write spreadsheet relationship?
2051
        if ($pChart->hasIncludedSpreadsheet()) {
2052
            $this->writeRelationship($objWriter, 1, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package', '../embeddings/' . $pChart->getIndexedFilename() . '.xlsx');
2053
        }
2054
2055
        $objWriter->endElement();
2056
2057
        // Return
2058
        return $objWriter->getData();
2059
    }
2060
2061
    /**
2062
     * @param XMLWriter $objWriter
2063
     * @param Chart\Marker $oMarker
2064
     */
2065
    protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker)
2066
    {
2067
        // c:marker
2068
        $objWriter->startElement('c:marker');
2069
        // c:marker > c:symbol
2070
        $objWriter->startElement('c:symbol');
2071
        $objWriter->writeAttribute('val', $oMarker->getSymbol());
2072
        $objWriter->endElement();
2073
2074
        // Size if different of none
2075
        if ($oMarker->getSymbol() != Chart\Marker::SYMBOL_NONE) {
2076
            $markerSize = (int)$oMarker->getSize();
2077
            if ($markerSize < 2) {
2078
                $markerSize = 2;
2079
            }
2080
            if ($markerSize > 72) {
2081
                $markerSize = 72;
2082
            }
2083 16
2084
            /**
2085
             * c:marker > c:size
2086 16
             * Size in points
2087
             * @link : https://msdn.microsoft.com/en-us/library/hh658135(v=office.12).aspx
2088 16
             */
2089 16
            $objWriter->startElement('c:size');
2090 16
            $objWriter->writeAttribute('val', $markerSize);
2091
            $objWriter->endElement();
2092
        }
2093 16
        $objWriter->endElement();
2094 2
    }
2095 2
2096 2
    /**
2097
     * @param XMLWriter $objWriter
2098 2
     * @param Chart\Axis $oAxis
2099 2
     * @param $typeAxis
2100
     * @param Chart\Type\AbstractType $typeChart
2101
     * @throws \Exception
2102
     */
2103
    protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, $typeAxis, Chart\Type\AbstractType $typeChart)
2104
    {
2105
        if ($typeAxis != Chart\Axis::AXIS_X && $typeAxis != Chart\Axis::AXIS_Y) {
2106
            return;
2107 2
        }
2108 2
2109 2
        if ($typeAxis == Chart\Axis::AXIS_X) {
2110
            $mainElement = 'c:catAx';
2111 16
            $axIdVal = '52743552';
2112 16
            $axPosVal = 'b';
2113
            $crossAxVal = '52749440';
2114
        } else {
2115
            $mainElement = 'c:valAx';
2116
            $axIdVal = '52749440';
2117
            $axPosVal = 'l';
2118
            $crossAxVal = '52743552';
2119
        }
2120
2121 28
        // $mainElement
2122
        $objWriter->startElement($mainElement);
2123 28
2124
        // $mainElement > c:axId
2125
        $objWriter->startElement('c:axId');
2126
        $objWriter->writeAttribute('val', $axIdVal);
2127 28
        $objWriter->endElement();
2128 28
2129 28
        // $mainElement > c:scaling
2130 28
        $objWriter->startElement('c:scaling');
2131 28
2132
        // $mainElement > c:scaling > c:orientation
2133 28
        $objWriter->startElement('c:orientation');
2134 28
        $objWriter->writeAttribute('val', 'minMax');
2135 28
        $objWriter->endElement();
2136 28
2137
        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...
2138
            $objWriter->startElement('c:max');
2139
            $objWriter->writeAttribute('val', $oAxis->getMaxBounds());
2140 28
            $objWriter->endElement();
2141
        }
2142
2143 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...
2144 28
            $objWriter->startElement('c:min');
2145 28
            $objWriter->writeAttribute('val', $oAxis->getMinBounds());
2146
            $objWriter->endElement();
2147
        }
2148 28
2149
        // $mainElement > ##c:scaling
2150
        $objWriter->endElement();
2151 28
2152 28
        // $mainElement > c:delete
2153 28
        $objWriter->startElement('c:delete');
2154
        $objWriter->writeAttribute('val', $oAxis->isVisible() ? '0' : '1');
2155 28
        $objWriter->endElement();
2156 1
2157 1
        // $mainElement > c:axPos
2158 1
        $objWriter->startElement('c:axPos');
2159
        $objWriter->writeAttribute('val', $axPosVal);
2160
        $objWriter->endElement();
2161 28
2162 1
        $oMajorGridlines = $oAxis->getMajorGridlines();
2163 1
        if ($oMajorGridlines instanceof Gridlines) {
2164 1
            $objWriter->startElement('c:majorGridlines');
2165
2166
            $this->writeAxisGridlines($objWriter, $oMajorGridlines);
2167
2168 28
            $objWriter->endElement();
2169
        }
2170
2171 28
        $oMinorGridlines = $oAxis->getMinorGridlines();
2172 28
        if ($oMinorGridlines instanceof Gridlines) {
2173 28
            $objWriter->startElement('c:minorGridlines');
2174
2175
            $this->writeAxisGridlines($objWriter, $oMinorGridlines);
2176 28
2177 28
            $objWriter->endElement();
2178 28
        }
2179
2180 28
        if ($oAxis->getTitle() != '') {
2181 28
            // c:title
2182 1
            $objWriter->startElement('c:title');
2183
2184 1
            // c:tx
2185
            $objWriter->startElement('c:tx');
2186 1
2187
            // c:rich
2188
            $objWriter->startElement('c:rich');
2189 28
2190 28
            // a:bodyPr
2191 1
            $objWriter->writeElement('a:bodyPr', null);
2192
2193 1
            // a:lstStyle
2194
            $objWriter->writeElement('a:lstStyle', null);
2195 1
2196
            // a:p
2197
            $objWriter->startElement('a:p');
2198 28
2199
            // a:pPr
2200 28
            $objWriter->startElement('a:pPr');
2201
2202
            // a:defRPr
2203 28
            $objWriter->startElement('a:defRPr');
2204
2205
            $objWriter->writeAttribute('b', ($oAxis->getFont()->isBold() ? 'true' : 'false'));
2206 28
            $objWriter->writeAttribute('i', ($oAxis->getFont()->isItalic() ? 'true' : 'false'));
2207
            $objWriter->writeAttribute('strike', ($oAxis->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
2208
            $objWriter->writeAttribute('sz', ($oAxis->getFont()->getSize() * 100));
2209 28
            $objWriter->writeAttribute('u', $oAxis->getFont()->getUnderline());
2210
            $objWriter->writeAttributeIf($oAxis->getFont()->isSuperScript(), 'baseline', '300000');
2211
            $objWriter->writeAttributeIf($oAxis->getFont()->isSubScript(), 'baseline', '-250000');
2212 28
2213
            // Font - a:solidFill
2214
            $objWriter->startElement('a:solidFill');
2215 28
            $this->writeColor($objWriter, $oAxis->getFont()->getColor());
2216
            $objWriter->endElement();
2217
2218 28
            // Font - a:latin
2219
            $objWriter->startElement('a:latin');
2220
            $objWriter->writeAttribute('typeface', $oAxis->getFont()->getName());
2221 28
            $objWriter->endElement();
2222
2223 28
            $objWriter->endElement();
2224 28
2225 28
            // ## a:pPr
2226 28
            $objWriter->endElement();
2227 28
2228 28
            // a:r
2229 28
            $objWriter->startElement('a:r');
2230
2231
            // a:rPr
2232 28
            $objWriter->startElement('a:rPr');
2233 28
            $objWriter->writeAttribute('lang', 'en-US');
2234 28
            $objWriter->writeAttribute('dirty', '0');
2235
            $objWriter->endElement();
2236
2237 28
            // a:t
2238 28
            $objWriter->writeElement('a:t', $oAxis->getTitle());
2239 28
2240
            // ## a:r
2241 28
            $objWriter->endElement();
2242
2243
            // a:endParaRPr
2244 28
            $objWriter->startElement('a:endParaRPr');
2245
            $objWriter->writeAttribute('lang', 'en-US');
2246
            $objWriter->writeAttribute('dirty', '0');
2247 28
            $objWriter->endElement();
2248
2249
            // ## a:p
2250 28
            $objWriter->endElement();
2251 28
2252 28
            // ## c:rich
2253 28
            $objWriter->endElement();
2254
2255
            // ## c:tx
2256 28
            $objWriter->endElement();
2257
2258
            // ## c:title
2259 28
            $objWriter->endElement();
2260
        }
2261
2262 28
        // c:numFmt
2263 28
        $objWriter->startElement('c:numFmt');
2264 28
        $objWriter->writeAttribute('formatCode', $oAxis->getFormatCode());
2265 28
        $objWriter->writeAttribute('sourceLinked', '1');
2266
        $objWriter->endElement();
2267
2268 28
        // c:majorTickMark
2269
        $objWriter->startElement('c:majorTickMark');
2270
        $objWriter->writeAttribute('val', $oAxis->getMajorTickMark());
2271 28
        $objWriter->endElement();
2272
2273
        // c:minorTickMark
2274 28
        $objWriter->startElement('c:minorTickMark');
2275
        $objWriter->writeAttribute('val', $oAxis->getMinorTickMark());
2276
        $objWriter->endElement();
2277 28
2278
        // c:tickLblPos
2279
        $objWriter->startElement('c:tickLblPos');
2280
        $objWriter->writeAttribute('val', 'nextTo');
2281 28
        $objWriter->endElement();
2282 28
2283 28
        // c:spPr
2284 28
        $objWriter->startElement('c:spPr');
2285
        // Outline
2286
        $this->writeOutline($objWriter, $oAxis->getOutline());
2287 28
        // ##c:spPr
2288 28
        $objWriter->endElement();
2289 28
2290
        // c:crossAx
2291
        $objWriter->startElement('c:crossAx');
2292 28
        $objWriter->writeAttribute('val', $crossAxVal);
2293 28
        $objWriter->endElement();
2294 28
2295
        // c:crosses
2296
        $objWriter->startElement('c:crosses');
2297 28
        $objWriter->writeAttribute('val', 'autoZero');
2298 28
        $objWriter->endElement();
2299 28
2300
        if ($typeAxis == Chart\Axis::AXIS_X) {
2301
            // c:lblAlgn
2302 28
            $objWriter->startElement('c:lblAlgn');
2303
            $objWriter->writeAttribute('val', 'ctr');
2304 28
            $objWriter->endElement();
2305
2306 28
            // c:lblOffset
2307
            $objWriter->startElement('c:lblOffset');
2308
            $objWriter->writeAttribute('val', '100');
2309 28
            $objWriter->endElement();
2310 28
        }
2311 28
2312
        if ($typeAxis == Chart\Axis::AXIS_Y) {
2313
            // c:crossBetween
2314 28
            $objWriter->startElement('c:crossBetween');
2315 28
            // midCat : Position Axis On Tick Marks
2316 28
            // between : Between Tick Marks
2317
            if ($typeChart instanceof Area) {
2318 28
                $objWriter->writeAttribute('val', 'midCat');
2319
            } else {
2320 28
                $objWriter->writeAttribute('val', 'between');
2321 28
            }
2322 28
            $objWriter->endElement();
2323
2324
            // c:majorUnit
2325 28
            if ($oAxis->getMajorUnit() != null) {
2326 28
                $objWriter->startElement('c:majorUnit');
2327 28
                $objWriter->writeAttribute('val', $oAxis->getMajorUnit());
2328
                $objWriter->endElement();
2329
            }
2330 28
2331
            // c:minorUnit
2332 28
            if ($oAxis->getMinorUnit() != null) {
2333
                $objWriter->startElement('c:minorUnit');
2334
                $objWriter->writeAttribute('val', $oAxis->getMinorUnit());
2335 28
                $objWriter->endElement();
2336 1
            }
2337
        }
2338 27
2339
        $objWriter->endElement();
2340 28
    }
2341
2342
    /**
2343 28
     * @param XMLWriter $objWriter
2344 1
     * @param Gridlines $oGridlines
2345 1
     * @throws \Exception
2346 1
     */
2347
    protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines)
2348
    {
2349
        // c:spPr
2350 28
        $objWriter->startElement('c:spPr');
2351 1
2352 1
        // Outline
2353 1
        $this->writeOutline($objWriter, $oGridlines->getOutline());
2354
2355
        // ##c:spPr
2356
        $objWriter->endElement();
2357 28
    }
2358
}
2359