Completed
Pull Request — develop (#614)
by
unknown
18:55
created

PptCharts::writeChart()   C

Complexity

Conditions 8
Paths 32

Size

Total Lines 140

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 53
CRAP Score 8.9171

Importance

Changes 0
Metric Value
dl 0
loc 140
ccs 53
cts 70
cp 0.7571
rs 6.7555
c 0
b 0
f 0
cc 8
nc 32
nop 1
crap 8.9171

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\XMLWriter;
7
use PhpOffice\PhpPresentation\PhpPresentation;
8
use PhpOffice\PhpPresentation\Shape\Chart;
9
use PhpOffice\PhpPresentation\Shape\Chart\Gridlines;
10
use PhpOffice\PhpPresentation\Shape\Chart\Legend;
11
use PhpOffice\PhpPresentation\Shape\Chart\PlotArea;
12
use PhpOffice\PhpPresentation\Shape\Chart\Title;
13
use PhpOffice\PhpPresentation\Shape\Chart\Type\Area;
14
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar;
15
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D;
16
use PhpOffice\PhpPresentation\Shape\Chart\Type\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
use PhpOffice\PhpSpreadsheet\IOFactory;
24
use PhpOffice\PhpSpreadsheet\Spreadsheet;
25
26
class PptCharts extends AbstractDecoratorWriter
27
{
28
    /**
29
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
30 113
     * @throws \Exception
31
     */
32 113
    public function render()
33 44
    {
34 44
        for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
35 35
            $shape = $this->getDrawingHashTable()->getByIndex($i);
36
            if ($shape instanceof Chart) {
37 34
                $this->getZip()->addFromString('ppt/charts/' . $shape->getIndexedFilename(), $this->writeChart($shape));
38
39
                if ($shape->hasIncludedSpreadsheet()) {
40
                    $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape));
41
                    $pFilename = tempnam(sys_get_temp_dir(), 'PhpSpreadsheet');
42
                    $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx'));
43
44
                    // remove temp file
45
                    if (@unlink($pFilename) === false) {
46
                        throw new \Exception('The file ' . $pFilename . ' could not removed.');
47
                    }
48
                }
49 112
            }
50
        }
51
        return $this->getZip();
52
    }
53
54
55
    /**
56
     * Write chart to XML format
57
     *
58
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
59
     * @return string                    XML Output
60 35
     * @throws \Exception
61
     */
62
    public function writeChart(Chart $chart)
63 35
    {
64
        // Create XML writer
65
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
66 35
67
        // XML header
68
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
69 35
70 35
        // c:chartSpace
71 35
        $objWriter->startElement('c:chartSpace');
72 35
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
73
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
74
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
75 35
76 35
        // c:date1904
77 35
        $objWriter->startElement('c:date1904');
78
        $objWriter->writeAttribute('val', '1');
79
        $objWriter->endElement();
80 35
81 35
        // c:lang
82 35
        $objWriter->startElement('c:lang');
83
        $objWriter->writeAttribute('val', 'en-US');
84
        $objWriter->endElement();
85 35
86
        // c:chart
87
        $objWriter->startElement('c:chart');
88 35
89
        // Title?
90 34
        if ($chart->getTitle()->isVisible()) {
91
            // Write title
92
            $this->writeTitle($objWriter, $chart->getTitle());
93
        }
94 35
95 35
        // c:autoTitleDeleted
96 35
        $objWriter->startElement('c:autoTitleDeleted');
97
        $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1');
98
        $objWriter->endElement();
99 35
100
        // c:view3D
101
        $objWriter->startElement('c:view3D');
102 35
103 35
        // c:rotX
104 35
        $objWriter->startElement('c:rotX');
105
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
106
        $objWriter->endElement();
107 35
108 35
        // c:hPercent
109
        $hPercent = $chart->getView3D()->getHeightPercent();
110
        $objWriter->writeElementIf($hPercent != null, 'c:hPercent', 'val', $hPercent);
111 35
112 35
        // c:rotY
113 35
        $objWriter->startElement('c:rotY');
114
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
115
        $objWriter->endElement();
116 35
117 35
        // c:depthPercent
118 35
        $objWriter->startElement('c:depthPercent');
119
        $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
120
        $objWriter->endElement();
121 35
122 35
        // c:rAngAx
123 35
        $objWriter->startElement('c:rAngAx');
124
        $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
125
        $objWriter->endElement();
126 35
127 35
        // c:perspective
128 35
        $objWriter->startElement('c:perspective');
129
        $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
130 35
        $objWriter->endElement();
131
132
        $objWriter->endElement();
133 35
134
        // Write plot area
135
        $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart);
136 34
137
        // Legend?
138 34
        if ($chart->getLegend()->isVisible()) {
139
            // Write legend
140
            $this->writeLegend($objWriter, $chart->getLegend());
141
        }
142 34
143 34
        // c:plotVisOnly
144 34
        $objWriter->startElement('c:plotVisOnly');
145
        $objWriter->writeAttribute('val', '1');
146 34
        $objWriter->endElement();
147
148
        $objWriter->endElement();
149 34
150
        // c:spPr
151
        $objWriter->startElement('c:spPr');
152 34
153
        // Fill
154
        $this->writeFill($objWriter, $chart->getFill());
155 34
156
        // Border
157
        if ($chart->getBorder()->getLineStyle() != Border::LINE_NONE) {
158
            $this->writeBorder($objWriter, $chart->getBorder(), '');
159
        }
160 34
161
        // Shadow
162
        if ($chart->getShadow()->isVisible()) {
163
            // a:effectLst
164
            $objWriter->startElement('a:effectLst');
165
166
            // a:outerShdw
167
            $objWriter->startElement('a:outerShdw');
168
            $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius()));
169
            $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance()));
170
            $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($chart->getShadow()->getDirection()));
171
            $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment());
172
            $objWriter->writeAttribute('rotWithShape', '0');
173
174
            $this->writeColor($objWriter, $chart->getShadow()->getColor(), $chart->getShadow()->getAlpha());
175
176
            $objWriter->endElement();
177
178
            $objWriter->endElement();
179 34
        }
180
181
        $objWriter->endElement();
182 34
183
        // External data?
184
        if ($chart->hasIncludedSpreadsheet()) {
185
            // c:externalData
186
            $objWriter->startElement('c:externalData');
187
            $objWriter->writeAttribute('r:id', 'rId1');
188
189
            // c:autoUpdate
190
            $objWriter->startElement('c:autoUpdate');
191
            $objWriter->writeAttribute('val', '0');
192
            $objWriter->endElement();
193
194
            $objWriter->endElement();
195 34
        }
196
197
        $objWriter->endElement();
198 34
199
        // Return
200
        return $objWriter->getData();
201
    }
202
203
    /**
204
     * Write chart to XML format
205
     *
206
     * @param  PhpPresentation $presentation
207
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
208
     * @param  string $tempName
209
     * @return string                    String output
210
     * @throws \Exception
211
     */
212
    public function writeSpreadsheet(PhpPresentation $presentation, $chart, $tempName)
213
    {
214
        // Need output?
215
        if (!$chart->hasIncludedSpreadsheet()) {
216
            throw new \Exception('No spreadsheet output is required for the given chart.');
217
        }
218
219
        // Verify PhpSpreadsheet
220
        if (!class_exists(Spreadsheet::class')) {
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

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