Completed
Pull Request — develop (#390)
by Franck
06:30
created

PptCharts::writeTypePie()   D

Complexity

Conditions 15
Paths 17

Size

Total Lines 157

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 76
CRAP Score 15.0281

Importance

Changes 0
Metric Value
dl 0
loc 157
ccs 76
cts 80
cp 0.95
rs 4.7333
c 0
b 0
f 0
cc 15
nc 17
nop 3
crap 15.0281

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