Completed
Push — develop ( 097d50...7bd91a )
by Franck
13s
created

PptCharts   F

Complexity

Total Complexity 194

Size/Duplication

Total Lines 2351
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 30

Test Coverage

Coverage 90.5%

Importance

Changes 7
Bugs 0 Features 0
Metric Value
wmc 194
c 7
b 0
f 0
lcom 1
cbo 30
dl 0
loc 2351
rs 0.5217
ccs 953
cts 1053
cp 0.905

22 Methods

Rating   Name   Duplication   Size   Complexity  
B render() 0 21 5
C writeChart() 0 140 8
B writeSpreadsheet() 0 61 8
A writeElementWithValAttribute() 0 6 1
A writeSingleValueOrReference() 0 23 2
B writeMultipleValuesOrReference() 0 52 7
B writeTitle() 0 91 4
C writePlotArea() 0 42 11
B writeLegend() 0 91 5
B writeLayout() 0 48 5
C writeTypeArea() 0 94 9
D writeTypeBar() 0 213 19
D writeTypeBar3D() 0 193 15
D writeTypeDoughnut() 0 149 17
D writeTypePie() 0 160 15
D writeTypePie3D() 0 154 13
C writeTypeLine() 0 164 12
D writeTypeScatter() 0 166 13
A writeChartRelationships() 0 22 2
B writeSeriesMarker() 0 30 4
F writeAxis() 0 238 18
A writeAxisGridlines() 0 11 1

How to fix   Complexity   

Complex Class

Complex classes like PptCharts often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PptCharts, and based on these observations, apply Extract Interface, too.

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

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

foreach ($a as $b) {
}

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


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

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