Completed
Pull Request — develop (#565)
by
unknown
07:15
created

PptCharts::writeSeriesMarker()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 30
ccs 16
cts 16
cp 1
rs 9.44
c 0
b 0
f 0
cc 4
nc 5
nop 2
crap 4
1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\XMLWriter;
7
use PhpOffice\PhpPresentation\PhpPresentation;
8
use PhpOffice\PhpPresentation\Shape\Chart;
9
use PhpOffice\PhpPresentation\Shape\Chart\Gridlines;
10
use PhpOffice\PhpPresentation\Shape\Chart\Legend;
11
use PhpOffice\PhpPresentation\Shape\Chart\PlotArea;
12
use PhpOffice\PhpPresentation\Shape\Chart\Title;
13
use PhpOffice\PhpPresentation\Shape\Chart\Type\Area;
14
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar;
15
use PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D;
16
use PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut;
17
use PhpOffice\PhpPresentation\Shape\Chart\Type\Line;
18
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie;
19
use PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D;
20
use PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter;
21
use PhpOffice\PhpPresentation\Style\Border;
22
use PhpOffice\PhpPresentation\Style\Fill;
23
24
class PptCharts extends AbstractDecoratorWriter
25
{
26
    /**
27
     * @return \PhpOffice\Common\Adapter\Zip\ZipInterface
28
     * @throws \Exception
29
     */
30 113
    public function render()
31
    {
32 113
        for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) {
33 44
            $shape = $this->getDrawingHashTable()->getByIndex($i);
34 44
            if ($shape instanceof Chart) {
35 35
                $this->getZip()->addFromString('ppt/charts/' . $shape->getIndexedFilename(), $this->writeChart($shape));
36
37 34
                if ($shape->hasIncludedSpreadsheet()) {
38
                    $this->getZip()->addFromString('ppt/charts/_rels/' . $shape->getIndexedFilename() . '.rels', $this->writeChartRelationships($shape));
39
                    $pFilename = tempnam(sys_get_temp_dir(), 'PHPExcel');
40
                    $this->getZip()->addFromString('ppt/embeddings/' . $shape->getIndexedFilename() . '.xlsx', $this->writeSpreadsheet($this->getPresentation(), $shape, $pFilename . '.xlsx'));
41
42
                    // remove temp file
43
                    if (@unlink($pFilename) === false) {
44
                        throw new \Exception('The file ' . $pFilename . ' could not removed.');
45
                    }
46
                }
47
            }
48
        }
49 112
        return $this->getZip();
50
    }
51
52
53
    /**
54
     * Write chart to XML format
55
     *
56
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
57
     * @return string                    XML Output
58
     * @throws \Exception
59
     */
60 35
    public function writeChart(Chart $chart)
61
    {
62
        // Create XML writer
63 35
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
64
65
        // XML header
66 35
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
67
68
        // c:chartSpace
69 35
        $objWriter->startElement('c:chartSpace');
70 35
        $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
71 35
        $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
72 35
        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
73
74
        // c:date1904
75 35
        $objWriter->startElement('c:date1904');
76 35
        $objWriter->writeAttribute('val', '1');
77 35
        $objWriter->endElement();
78
79
        // c:lang
80 35
        $objWriter->startElement('c:lang');
81 35
        $objWriter->writeAttribute('val', 'en-US');
82 35
        $objWriter->endElement();
83
84
        // c:chart
85 35
        $objWriter->startElement('c:chart');
86
87
        // Title?
88 35
        if ($chart->getTitle()->isVisible()) {
89
            // Write title
90 34
            $this->writeTitle($objWriter, $chart->getTitle());
91
        }
92
93
        // c:autoTitleDeleted
94 35
        $objWriter->startElement('c:autoTitleDeleted');
95 35
        $objWriter->writeAttribute('val', $chart->getTitle()->isVisible() ? '0' : '1');
96 35
        $objWriter->endElement();
97
98
        // c:view3D
99 35
        $objWriter->startElement('c:view3D');
100
101
        // c:rotX
102 35
        $objWriter->startElement('c:rotX');
103 35
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationX());
104 35
        $objWriter->endElement();
105
106
        // c:hPercent
107 35
        $hPercent = $chart->getView3D()->getHeightPercent();
108 35
        $objWriter->writeElementIf($hPercent != null, 'c:hPercent', 'val', $hPercent);
109
110
        // c:rotY
111 35
        $objWriter->startElement('c:rotY');
112 35
        $objWriter->writeAttribute('val', $chart->getView3D()->getRotationY());
113 35
        $objWriter->endElement();
114
115
        // c:depthPercent
116 35
        $objWriter->startElement('c:depthPercent');
117 35
        $objWriter->writeAttribute('val', $chart->getView3D()->getDepthPercent());
118 35
        $objWriter->endElement();
119
120
        // c:rAngAx
121 35
        $objWriter->startElement('c:rAngAx');
122 35
        $objWriter->writeAttribute('val', $chart->getView3D()->hasRightAngleAxes() ? '1' : '0');
123 35
        $objWriter->endElement();
124
125
        // c:perspective
126 35
        $objWriter->startElement('c:perspective');
127 35
        $objWriter->writeAttribute('val', $chart->getView3D()->getPerspective());
128 35
        $objWriter->endElement();
129
130 35
        $objWriter->endElement();
131
132
        // Write plot area
133 35
        $this->writePlotArea($objWriter, $chart->getPlotArea(), $chart);
134
135
        // Legend?
136 34
        if ($chart->getLegend()->isVisible()) {
137
            // Write legend
138 34
            $this->writeLegend($objWriter, $chart->getLegend());
139
        }
140
141
        // c:plotVisOnly
142 34
        $objWriter->startElement('c:plotVisOnly');
143 34
        $objWriter->writeAttribute('val', '1');
144 34
        $objWriter->endElement();
145
146 34
        $objWriter->endElement();
147
148
        // c:spPr
149 34
        $objWriter->startElement('c:spPr');
150
151
        // Fill
152 34
        $this->writeFill($objWriter, $chart->getFill());
0 ignored issues
show
Bug introduced by
It seems like $chart->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
153
154
        // Border
155 34
        if ($chart->getBorder()->getLineStyle() != Border::LINE_NONE) {
156
            $this->writeBorder($objWriter, $chart->getBorder(), '');
157
        }
158
159
        // Shadow
160 34
        if ($chart->getShadow()->isVisible()) {
161
            // a:effectLst
162
            $objWriter->startElement('a:effectLst');
163
164
            // a:outerShdw
165
            $objWriter->startElement('a:outerShdw');
166
            $objWriter->writeAttribute('blurRad', CommonDrawing::pixelsToEmu($chart->getShadow()->getBlurRadius()));
167
            $objWriter->writeAttribute('dist', CommonDrawing::pixelsToEmu($chart->getShadow()->getDistance()));
168
            $objWriter->writeAttribute('dir', CommonDrawing::degreesToAngle($chart->getShadow()->getDirection()));
169
            $objWriter->writeAttribute('algn', $chart->getShadow()->getAlignment());
170
            $objWriter->writeAttribute('rotWithShape', '0');
171
172
            $this->writeColor($objWriter, $chart->getShadow()->getColor(), $chart->getShadow()->getAlpha());
173
174
            $objWriter->endElement();
175
176
            $objWriter->endElement();
177
        }
178
179 34
        $objWriter->endElement();
180
181
        // External data?
182 34
        if ($chart->hasIncludedSpreadsheet()) {
183
            // c:externalData
184
            $objWriter->startElement('c:externalData');
185
            $objWriter->writeAttribute('r:id', 'rId1');
186
187
            // c:autoUpdate
188
            $objWriter->startElement('c:autoUpdate');
189
            $objWriter->writeAttribute('val', '0');
190
            $objWriter->endElement();
191
192
            $objWriter->endElement();
193
        }
194
195 34
        $objWriter->endElement();
196
197
        // Return
198 34
        return $objWriter->getData();
199
    }
200
201
    /**
202
     * Write chart to XML format
203
     *
204
     * @param  PhpPresentation $presentation
205
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
206
     * @param  string $tempName
207
     * @return string                    String output
208
     * @throws \Exception
209
     */
210
    public function writeSpreadsheet(PhpPresentation $presentation, Chart $chart, $tempName)
211
    {
212
        // Need output?
213
        if (!$chart->hasIncludedSpreadsheet()) {
214
            throw new \Exception('No spreadsheet output is required for the given chart.');
215
        }
216
217
        // Verify PHPExcel
218
        if (!class_exists('PHPExcel')) {
219
            throw new \Exception('PHPExcel has not been loaded. Include PHPExcel.php in your script, e.g. require_once \'PHPExcel.php\'.');
220
        }
221
222
        // Create new spreadsheet
223
        $workbook = new \PHPExcel();
224
225
        // Set properties
226
        $title = $chart->getTitle()->getText();
227
        if (strlen($title) == 0) {
228
            $title = 'Chart';
229
        }
230
        $workbook->getProperties()->setCreator($presentation->getDocumentProperties()->getCreator())->setLastModifiedBy($presentation->getDocumentProperties()->getLastModifiedBy())->setTitle($title);
231
232
        // Add chart data
233
        $sheet = $workbook->setActiveSheetIndex(0);
234
        $sheet->setTitle('Sheet1');
235
236
        // Write series
237
        $seriesIndex = 0;
238
        foreach ($chart->getPlotArea()->getType()->getSeries() as $series) {
239
            // Title
240
            $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, 1, $series->getTitle());
241
242
            // X-axis
243
            $axisXData = array_keys($series->getValues());
244
            $numAxisXData = count($axisXData);
245
            for ($i = 0; $i < $numAxisXData; $i++) {
246
                $sheet->setCellValueByColumnAndRow(0, $i + 2, $axisXData[$i]);
247
            }
248
249
            // Y-axis
250
            $axisYData = array_values($series->getValues());
251
            $numAxisYData = count($axisYData);
252
            for ($i = 0; $i < $numAxisYData; $i++) {
253
                $sheet->setCellValueByColumnAndRow(1 + $seriesIndex, $i + 2, $axisYData[$i]);
254
            }
255
256
            ++$seriesIndex;
257
        }
258
259
        // Save to string
260
        $writer = \PHPExcel_IOFactory::createWriter($workbook, 'Excel2007');
261
        $writer->save($tempName);
262
263
        // Load file in memory
264
        $returnValue = file_get_contents($tempName);
265
        if (@unlink($tempName) === false) {
266
            throw new \Exception('The file ' . $tempName . ' could not removed.');
267
        }
268
269
        return $returnValue;
270
    }
271
272
    /**
273
     * Write element with value attribute
274
     *
275
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
276
     * @param string $elementName
277
     * @param string $value
278
     */
279 30
    protected function writeElementWithValAttribute(XMLWriter $objWriter, $elementName, $value)
280
    {
281 30
        $objWriter->startElement($elementName);
282 30
        $objWriter->writeAttribute('val', $value);
283 30
        $objWriter->endElement();
284 30
    }
285
286
    /**
287
     * Write single value or reference
288
     *
289
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
290
     * @param boolean $isReference
291
     * @param mixed $value
292
     * @param string $reference
293
     */
294 30
    protected function writeSingleValueOrReference(XMLWriter $objWriter, $isReference, $value, $reference)
295
    {
296 30
        if (!$isReference) {
297
            // Value
298 30
            $objWriter->writeElement('c:v', $value);
299 30
            return;
300
        }
301
302
        // Reference and cache
303
        $objWriter->startElement('c:strRef');
304
        $objWriter->writeElement('c:f', $reference);
305
        $objWriter->startElement('c:strCache');
306
        $objWriter->startElement('c:ptCount');
307
        $objWriter->writeAttribute('val', '1');
308
        $objWriter->endElement();
309
310
        $objWriter->startElement('c:pt');
311
        $objWriter->writeAttribute('idx', '0');
312
        $objWriter->writeElement('c:v', $value);
313
        $objWriter->endElement();
314
        $objWriter->endElement();
315
        $objWriter->endElement();
316
    }
317
318
    /**
319
     * Write series value or reference
320
     *
321
     * @param \PhpOffice\Common\XMLWriter $objWriter XML Writer
322
     * @param boolean $isReference
323
     * @param mixed $values
324
     * @param string $reference
325
     */
326 30
    protected function writeMultipleValuesOrReference(XMLWriter $objWriter, $isReference, $values, $reference)
327
    {
328
        // c:strLit / c:numLit
329
        // c:strRef / c:numRef
330 30
        $referenceType = ($isReference ? 'Ref' : 'Lit');
331 30
        $dataType = 'str';
332 30
        if (is_int($values[0]) || is_float($values[0])) {
333 30
            $dataType = 'num';
334
        }
335 30
        $objWriter->startElement('c:' . $dataType . $referenceType);
336
337 30
        $numValues = count($values);
338 30
        if (!$isReference) {
339
            // Value
340
341
            // c:ptCount
342 30
            $objWriter->startElement('c:ptCount');
343 30
            $objWriter->writeAttribute('val', count($values));
344 30
            $objWriter->endElement();
345
346
            // Add points
347 30
            for ($i = 0; $i < $numValues; $i++) {
348
                // c:pt
349 30
                $objWriter->startElement('c:pt');
350 30
                $objWriter->writeAttribute('idx', $i);
351 30
                $objWriter->writeElement('c:v', $values[$i]);
352 30
                $objWriter->endElement();
353
            }
354
        } else {
355
            // Reference
356
            $objWriter->writeElement('c:f', $reference);
357
            $objWriter->startElement('c:' . $dataType . 'Cache');
358
359
            // c:ptCount
360
            $objWriter->startElement('c:ptCount');
361
            $objWriter->writeAttribute('val', count($values));
362
            $objWriter->endElement();
363
364
            // Add points
365
            for ($i = 0; $i < $numValues; $i++) {
366
                // c:pt
367
                $objWriter->startElement('c:pt');
368
                $objWriter->writeAttribute('idx', $i);
369
                $objWriter->writeElement('c:v', $values[$i]);
370
                $objWriter->endElement();
371
            }
372
373
            $objWriter->endElement();
374
        }
375
376 30
        $objWriter->endElement();
377 30
    }
378
379
    /**
380
     * Write Title
381
     *
382
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
383
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Title $subject
384
     * @throws \Exception
385
     */
386 34
    protected function writeTitle(XMLWriter $objWriter, Title $subject)
387
    {
388
        // c:title
389 34
        $objWriter->startElement('c:title');
390
391
        // c:tx
392 34
        $objWriter->startElement('c:tx');
393
394
        // c:rich
395 34
        $objWriter->startElement('c:rich');
396
397
        // a:bodyPr
398 34
        $objWriter->writeElement('a:bodyPr', null);
399
400
        // a:lstStyle
401 34
        $objWriter->writeElement('a:lstStyle', null);
402
403
        // a:p
404 34
        $objWriter->startElement('a:p');
405
406
        // a:pPr
407 34
        $objWriter->startElement('a:pPr');
408 34
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
409 34
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
410 34
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
411 34
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
412 34
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
413 34
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
414
415
        // a:defRPr
416 34
        $objWriter->writeElement('a:defRPr', null);
417
418 34
        $objWriter->endElement();
419
420
        // a:r
421 34
        $objWriter->startElement('a:r');
422
423
        // a:rPr
424 34
        $objWriter->startElement('a:rPr');
425 34
        $objWriter->writeAttribute('lang', 'en-US');
426 34
        $objWriter->writeAttribute('dirty', '0');
427 34
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
428 34
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
429 34
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
430 34
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
431 34
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
432 34
        $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '300000');
433 34
        $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-250000');
434
435
        // Font - a:solidFill
436 34
        $objWriter->startElement('a:solidFill');
437
438 34
        $this->writeColor($objWriter, $subject->getFont()->getColor());
439
440 34
        $objWriter->endElement();
441
442
        // Font - a:latin
443 34
        $objWriter->startElement('a:latin');
444 34
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
445 34
        $objWriter->endElement();
446
447 34
        $objWriter->endElement();
448
449
        // a:t
450 34
        $objWriter->writeElement('a:t', $subject->getText());
451
452 34
        $objWriter->endElement();
453
454
        // a:endParaRPr
455 34
        $objWriter->startElement('a:endParaRPr');
456 34
        $objWriter->writeAttribute('lang', 'en-US');
457 34
        $objWriter->writeAttribute('dirty', '0');
458 34
        $objWriter->endElement();
459
460 34
        $objWriter->endElement();
461
462 34
        $objWriter->endElement();
463
464 34
        $objWriter->endElement();
465
466
        // Write layout
467 34
        $this->writeLayout($objWriter, $subject);
468
469
        // c:overlay
470 34
        $objWriter->startElement('c:overlay');
471 34
        $objWriter->writeAttribute('val', '0');
472 34
        $objWriter->endElement();
473
474 34
        $objWriter->endElement();
475 34
    }
476
477
    /**
478
     * Write Plot Area
479
     *
480
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
481
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\PlotArea $subject
482
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $chart
483
     * @throws \Exception
484
     */
485 35
    protected function writePlotArea(XMLWriter $objWriter, PlotArea $subject, Chart $chart)
486
    {
487
        // c:plotArea
488 35
        $objWriter->startElement('c:plotArea');
489
490
        // Write layout
491 35
        $this->writeLayout($objWriter, $subject);
492
493
        // Write chart
494 35
        $chartType = $subject->getType();
495 35
        if ($chartType instanceof Area) {
496 1
            $this->writeTypeArea($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
497 34
        } elseif ($chartType instanceof Bar) {
498 3
            $this->writeTypeBar($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
499 31
        } elseif ($chartType instanceof Bar3D) {
500 4
            $this->writeTypeBar3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
501 27
        } elseif ($chartType instanceof Doughnut) {
502 1
            $this->writeTypeDoughnut($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
503 26
        } elseif ($chartType instanceof Pie) {
504 1
            $this->writeTypePie($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
505 25
        } elseif ($chartType instanceof Pie3D) {
506 4
            $this->writeTypePie3D($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
507 21
        } elseif ($chartType instanceof Line) {
508 14
            $this->writeTypeLine($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
509 7
        } elseif ($chartType instanceof Scatter) {
510 6
            $this->writeTypeScatter($objWriter, $chartType, $chart->hasIncludedSpreadsheet());
511
        } else {
512 1
            throw new \Exception('The chart type provided could not be rendered.');
513
        }
514
515
        // Write X axis?
516 34
        if ($chartType->hasAxisX()) {
517 28
            $this->writeAxis($objWriter, $subject->getAxisX(), Chart\Axis::AXIS_X, $chartType);
518
        }
519
520
        // Write Y axis?
521 34
        if ($chartType->hasAxisY()) {
522 28
            $this->writeAxis($objWriter, $subject->getAxisY(), Chart\Axis::AXIS_Y, $chartType);
523
        }
524
525 34
        $objWriter->endElement();
526 34
    }
527
528
    /**
529
     * Write Legend
530
     *
531
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
532
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Legend $subject
533
     * @throws \Exception
534
     */
535 34
    protected function writeLegend(XMLWriter $objWriter, Legend $subject)
536
    {
537
        // c:legend
538 34
        $objWriter->startElement('c:legend');
539
540
        // c:legendPos
541 34
        $objWriter->startElement('c:legendPos');
542 34
        $objWriter->writeAttribute('val', $subject->getPosition());
543 34
        $objWriter->endElement();
544
545
        // Write layout
546 34
        $this->writeLayout($objWriter, $subject);
547
548
        // c:overlay
549 34
        $objWriter->startElement('c:overlay');
550 34
        $objWriter->writeAttribute('val', '0');
551 34
        $objWriter->endElement();
552
553
        // c:spPr
554 34
        $objWriter->startElement('c:spPr');
555
556
        // Fill
557 34
        $this->writeFill($objWriter, $subject->getFill());
558
559
        // Border
560 34
        if ($subject->getBorder()->getLineStyle() != Border::LINE_NONE) {
561 34
            $this->writeBorder($objWriter, $subject->getBorder(), '');
562
        }
563
564 34
        $objWriter->endElement();
565
566
        // c:txPr
567 34
        $objWriter->startElement('c:txPr');
568
569
        // a:bodyPr
570 34
        $objWriter->writeElement('a:bodyPr', null);
571
572
        // a:lstStyle
573 34
        $objWriter->writeElement('a:lstStyle', null);
574
575
        // a:p
576 34
        $objWriter->startElement('a:p');
577
578
        // a:pPr
579 34
        $objWriter->startElement('a:pPr');
580 34
        $objWriter->writeAttribute('algn', $subject->getAlignment()->getHorizontal());
581 34
        $objWriter->writeAttribute('fontAlgn', $subject->getAlignment()->getVertical());
582 34
        $objWriter->writeAttribute('marL', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginLeft()));
583 34
        $objWriter->writeAttribute('marR', CommonDrawing::pixelsToEmu($subject->getAlignment()->getMarginRight()));
584 34
        $objWriter->writeAttribute('indent', CommonDrawing::pixelsToEmu($subject->getAlignment()->getIndent()));
585 34
        $objWriter->writeAttribute('lvl', $subject->getAlignment()->getLevel());
586
587
        // a:defRPr
588 34
        $objWriter->startElement('a:defRPr');
589
590 34
        $objWriter->writeAttribute('b', ($subject->getFont()->isBold() ? 'true' : 'false'));
591 34
        $objWriter->writeAttribute('i', ($subject->getFont()->isItalic() ? 'true' : 'false'));
592 34
        $objWriter->writeAttribute('strike', ($subject->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
593 34
        $objWriter->writeAttribute('sz', ($subject->getFont()->getSize() * 100));
594 34
        $objWriter->writeAttribute('u', $subject->getFont()->getUnderline());
595 34
        $objWriter->writeAttributeIf($subject->getFont()->isSuperScript(), 'baseline', '300000');
596 34
        $objWriter->writeAttributeIf($subject->getFont()->isSubScript(), 'baseline', '-250000');
597
598
        // Font - a:solidFill
599 34
        $objWriter->startElement('a:solidFill');
600
601 34
        $this->writeColor($objWriter, $subject->getFont()->getColor());
602
603 34
        $objWriter->endElement();
604
605
        // Font - a:latin
606 34
        $objWriter->startElement('a:latin');
607 34
        $objWriter->writeAttribute('typeface', $subject->getFont()->getName());
608 34
        $objWriter->endElement();
609
610 34
        $objWriter->endElement();
611
612 34
        $objWriter->endElement();
613
614
        // a:endParaRPr
615 34
        $objWriter->startElement('a:endParaRPr');
616 34
        $objWriter->writeAttribute('lang', 'en-US');
617 34
        $objWriter->writeAttribute('dirty', '0');
618 34
        $objWriter->endElement();
619
620 34
        $objWriter->endElement();
621
622 34
        $objWriter->endElement();
623
624 34
        $objWriter->endElement();
625 34
    }
626
627
    /**
628
     * Write Layout
629
     *
630
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
631
     * @param  mixed $subject
632
     * @throws \Exception
633
     */
634 35
    protected function writeLayout(XMLWriter $objWriter, $subject)
635
    {
636
        // c:layout
637 35
        $objWriter->startElement('c:layout');
638
639
        // c:manualLayout
640 35
        $objWriter->startElement('c:manualLayout');
641
        // c:xMode
642 35
        $objWriter->startElement('c:xMode');
643 35
        $objWriter->writeAttribute('val', 'edge');
644 35
        $objWriter->endElement();
645
646
        // c:yMode
647 35
        $objWriter->startElement('c:yMode');
648 35
        $objWriter->writeAttribute('val', 'edge');
649 35
        $objWriter->endElement();
650
651 35
        if ($subject->getOffsetX() != 0) {
652
            // c:x
653 34
            $objWriter->startElement('c:x');
654 34
            $objWriter->writeAttribute('val', $subject->getOffsetX());
655 34
            $objWriter->endElement();
656
        }
657
658 35
        if ($subject->getOffsetY() != 0) {
659
            // c:y
660 34
            $objWriter->startElement('c:y');
661 34
            $objWriter->writeAttribute('val', $subject->getOffsetY());
662 34
            $objWriter->endElement();
663
        }
664
665 35
        if ($subject->getWidth() != 0) {
666
            // c:w
667
            $objWriter->startElement('c:w');
668
            $objWriter->writeAttribute('val', $subject->getWidth());
669
            $objWriter->endElement();
670
        }
671
672 35
        if ($subject->getHeight() != 0) {
673
            // c:h
674
            $objWriter->startElement('c:h');
675
            $objWriter->writeAttribute('val', $subject->getHeight());
676
            $objWriter->endElement();
677
        }
678
679 35
        $objWriter->endElement();
680 35
        $objWriter->endElement();
681 35
    }
682
683
    /**
684
     * Write Type Area
685
     *
686
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
687
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Area $subject
688
     * @param  boolean $includeSheet
689
     * @throws \Exception
690
     */
691 1
    protected function writeTypeArea(XMLWriter $objWriter, Area $subject, $includeSheet = false)
692
    {
693
        // c:lineChart
694 1
        $objWriter->startElement('c:areaChart');
695
696
        // c:grouping
697 1
        $objWriter->startElement('c:grouping');
698 1
        $objWriter->writeAttribute('val', 'standard');
699 1
        $objWriter->endElement();
700
701
        // Write series
702 1
        $seriesIndex = 0;
703 1
        foreach ($subject->getSeries() as $series) {
704
            // c:ser
705 1
            $objWriter->startElement('c:ser');
706
707
            // c:ser > c:idx
708 1
            $objWriter->startElement('c:idx');
709 1
            $objWriter->writeAttribute('val', $seriesIndex);
710 1
            $objWriter->endElement();
711
712
            // c:ser > c:order
713 1
            $objWriter->startElement('c:order');
714 1
            $objWriter->writeAttribute('val', $seriesIndex);
715 1
            $objWriter->endElement();
716
717
            // c:ser > c:tx
718 1
            $objWriter->startElement('c:tx');
719 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
720 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
721 1
            $objWriter->endElement();
722
723
            // c:ser > c:dLbls
724
            // @link : https://msdn.microsoft.com/en-us/library/documentformat.openxml.drawing.charts.areachartseries.aspx
725 1
            $objWriter->startElement('c:dLbls');
726
727
            // c:ser > c:dLbls > c:showVal
728 1
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
729
730
            // c:ser > c:dLbls > c:showCatName
731 1
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
732
733
            // c:ser > c:dLbls > c:showSerName
734 1
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
735
736
            // c:ser > c:dLbls > c:showPercent
737 1
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
738
739
            // c:ser > ##c:dLbls
740 1
            $objWriter->endElement();
741
742 1
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
743
                // c:spPr
744
                $objWriter->startElement('c:spPr');
745
                // Write fill
746
                $this->writeFill($objWriter, $series->getFill());
0 ignored issues
show
Bug introduced by
It seems like $series->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
747
                // ## c:spPr
748
                $objWriter->endElement();
749
            }
750
751
            // Write X axis data
752 1
            $axisXData = array_keys($series->getValues());
753
754
            // c:cat
755 1
            $objWriter->startElement('c:cat');
756 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
757 1
            $objWriter->endElement();
758
759
            // Write Y axis data
760 1
            $axisYData = array_values($series->getValues());
761
762
            // c:val
763 1
            $objWriter->startElement('c:val');
764 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
765 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
766 1
            $objWriter->endElement();
767
768 1
            $objWriter->endElement();
769
770 1
            ++$seriesIndex;
771
        }
772
773
        // c:axId
774 1
        $objWriter->startElement('c:axId');
775 1
        $objWriter->writeAttribute('val', '52743552');
776 1
        $objWriter->endElement();
777
778
        // c:axId
779 1
        $objWriter->startElement('c:axId');
780 1
        $objWriter->writeAttribute('val', '52749440');
781 1
        $objWriter->endElement();
782
783 1
        $objWriter->endElement();
784 1
    }
785
786
    /**
787
     * Write Type Bar
788
     *
789
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
790
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar $subject
791
     * @param  boolean $includeSheet
792
     * @throws \Exception
793
     */
794 3
    protected function writeTypeBar(XMLWriter $objWriter, Bar $subject, $includeSheet = false)
795
    {
796
        // c:barChart
797 3
        $objWriter->startElement('c:barChart');
798
799
        // c:barDir
800 3
        $objWriter->startElement('c:barDir');
801 3
        $objWriter->writeAttribute('val', $subject->getBarDirection());
802 3
        $objWriter->endElement();
803
804
        // c:grouping
805 3
        $objWriter->startElement('c:grouping');
806 3
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
807 3
        $objWriter->endElement();
808
809
        // Write series
810 3
        $seriesIndex = 0;
811 3
        foreach ($subject->getSeries() as $series) {
812
            // c:ser
813 3
            $objWriter->startElement('c:ser');
814
815
            // c:idx
816 3
            $objWriter->startElement('c:idx');
817 3
            $objWriter->writeAttribute('val', $seriesIndex);
818 3
            $objWriter->endElement();
819
820
            // c:order
821 3
            $objWriter->startElement('c:order');
822 3
            $objWriter->writeAttribute('val', $seriesIndex);
823 3
            $objWriter->endElement();
824
825
            // c:tx
826 3
            $objWriter->startElement('c:tx');
827 3
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
828 3
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
829 3
            $objWriter->endElement();
830
831
            // c:spPr
832 3
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
833
                // c:spPr
834
                $objWriter->startElement('c:spPr');
835
                // Write fill
836
                $this->writeFill($objWriter, $series->getFill());
0 ignored issues
show
Bug introduced by
It seems like $series->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
837
                // ## c:spPr
838
                $objWriter->endElement();
839
            }
840
841
            // Fills for points?
842 3
            $dataPointFills = $series->getDataPointFills();
843 3
            foreach ($dataPointFills as $key => $value) {
844
                // c:dPt
845 1
                $objWriter->startElement('c:dPt');
846
847
                // c:idx
848 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
849
850 1
                if ($value->getFillType() != Fill::FILL_NONE) {
851
                    // c:spPr
852 1
                    $objWriter->startElement('c:spPr');
853
                    // Write fill
854 1
                    $this->writeFill($objWriter, $value);
855
                    // ## c:spPr
856 1
                    $objWriter->endElement();
857
                }
858
859
                // ## c:dPt
860 1
                $objWriter->endElement();
861
            }
862
863
            // c:dLbls
864 3
            $objWriter->startElement('c:dLbls');
865
866 3
            if ($series->hasDlblNumFormat()) {
867
                //c:numFmt
868
                $objWriter->startElement('c:numFmt');
869
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
870
                $objWriter->writeAttribute('sourceLinked', '0');
871
                $objWriter->endElement();
872
            }
873
874
            // c:txPr
875 3
            $objWriter->startElement('c:txPr');
876
877
            // a:bodyPr
878 3
            $objWriter->writeElement('a:bodyPr');
879
880
            // a:lstStyle
881 3
            $objWriter->writeElement('a:lstStyle');
882
883
            // a:p
884 3
            $objWriter->startElement('a:p');
885
886
            // a:pPr
887 3
            $objWriter->startElement('a:pPr');
888
889
            // a:defRPr
890 3
            $objWriter->startElement('a:defRPr');
891
892 3
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
893 3
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
894 3
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
895 3
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
896 3
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
897 3
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
898 3
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
899
900
            // a:solidFill
901 3
            $objWriter->startElement('a:solidFill');
902 3
            $this->writeColor($objWriter, $series->getFont()->getColor());
903
            // >a:solidFill
904 3
            $objWriter->endElement();
905
            // a:latin
906 3
            $objWriter->startElement('a:latin');
907 3
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
908
            // >a:latin
909 3
            $objWriter->endElement();
910
911
            // >a:defRPr
912 3
            $objWriter->endElement();
913
            // >a:pPr
914 3
            $objWriter->endElement();
915
916
            // a:endParaRPr
917 3
            $objWriter->startElement('a:endParaRPr');
918 3
            $objWriter->writeAttribute('lang', 'en-US');
919 3
            $objWriter->writeAttribute('dirty', '0');
920 3
            $objWriter->endElement();
921
922
            // >a:p
923 3
            $objWriter->endElement();
924
            // >a:lstStyle
925 3
            $objWriter->endElement();
926
927
            // c:dLblPos
928 3
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
929
930
            // c:showVal
931 3
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
932
933
            // c:showCatName
934 3
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
935
936
            // c:showSerName
937 3
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
938
939
            // c:showPercent
940 3
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
941
942
            // c:separator
943 3
            $objWriter->writeElement('c:separator', $series->hasShowSeparator() ? $series->getSeparator() : '');
944
945
            // c:showLeaderLines
946 3
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
947
948 3
            $objWriter->endElement();
949
950
            // Write X axis data
951 3
            $axisXData = array_keys($series->getValues());
952
953
            // c:cat
954 3
            $objWriter->startElement('c:cat');
955 3
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
956 3
            $objWriter->endElement();
957
958
            // Write Y axis data
959 3
            $axisYData = array_values($series->getValues());
960
961
            // c:val
962 3
            $objWriter->startElement('c:val');
963 3
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
964 3
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
965 3
            $objWriter->endElement();
966
967 3
            $objWriter->endElement();
968
969 3
            ++$seriesIndex;
970
        }
971
972
        // c:gapWidth
973 3
        $objWriter->startElement('c:gapWidth');
974 3
        $objWriter->writeAttribute('val', $subject->getGapWidthPercent());
975 3
        $objWriter->endElement();
976
977
        // c:overlap
978 3
        $barGrouping = $subject->getBarGrouping();
979 3
        $objWriter->startElement('c:overlap');
980 3
        if ($barGrouping === Bar::GROUPING_CLUSTERED) {
981 3
            $objWriter->writeAttribute('val', '0');
982
        } elseif ($barGrouping === Bar::GROUPING_STACKED || $barGrouping === Bar::GROUPING_PERCENTSTACKED) {
983
            $objWriter->writeAttribute('val', '100');
984
        }
985 3
        $objWriter->endElement();
986
987
        // c:axId
988 3
        $objWriter->startElement('c:axId');
989 3
        $objWriter->writeAttribute('val', '52743552');
990 3
        $objWriter->endElement();
991
992
        // c:axId
993 3
        $objWriter->startElement('c:axId');
994 3
        $objWriter->writeAttribute('val', '52749440');
995 3
        $objWriter->endElement();
996
997
        // c:extLst
998 3
        $objWriter->startElement('c:extLst');
999 3
        $objWriter->endElement();
1000
1001 3
        $objWriter->endElement();
1002 3
    }
1003
1004
    /**
1005
     * Write Type Bar3D
1006
     *
1007
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1008
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Bar3D $subject
1009
     * @param  boolean $includeSheet
1010
     * @throws \Exception
1011
     */
1012 4
    protected function writeTypeBar3D(XMLWriter $objWriter, Bar3D $subject, $includeSheet = false)
1013
    {
1014
        // c:bar3DChart
1015 4
        $objWriter->startElement('c:bar3DChart');
1016
1017
        // c:barDir
1018 4
        $objWriter->startElement('c:barDir');
1019 4
        $objWriter->writeAttribute('val', $subject->getBarDirection());
1020 4
        $objWriter->endElement();
1021
1022
        // c:grouping
1023 4
        $objWriter->startElement('c:grouping');
1024 4
        $objWriter->writeAttribute('val', $subject->getBarGrouping());
1025 4
        $objWriter->endElement();
1026
1027
        // Write series
1028 4
        $seriesIndex = 0;
1029 4
        foreach ($subject->getSeries() as $series) {
1030
            // c:ser
1031 4
            $objWriter->startElement('c:ser');
1032
1033
            // c:idx
1034 4
            $objWriter->startElement('c:idx');
1035 4
            $objWriter->writeAttribute('val', $seriesIndex);
1036 4
            $objWriter->endElement();
1037
1038
            // c:order
1039 4
            $objWriter->startElement('c:order');
1040 4
            $objWriter->writeAttribute('val', $seriesIndex);
1041 4
            $objWriter->endElement();
1042
1043
            // c:tx
1044 4
            $objWriter->startElement('c:tx');
1045 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1046 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1047 4
            $objWriter->endElement();
1048
1049
            // c:spPr
1050 4
            if ($series->getFill()->getFillType() != Fill::FILL_NONE) {
1051
                // c:spPr
1052
                $objWriter->startElement('c:spPr');
1053
                // Write fill
1054
                $this->writeFill($objWriter, $series->getFill());
0 ignored issues
show
Bug introduced by
It seems like $series->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
1055
                // ## c:spPr
1056
                $objWriter->endElement();
1057
            }
1058
1059
            // Fills for points?
1060 4
            $dataPointFills = $series->getDataPointFills();
1061 4
            foreach ($dataPointFills as $key => $value) {
1062
                // c:dPt
1063 1
                $objWriter->startElement('c:dPt');
1064
1065
                // c:idx
1066 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1067
1068 1
                if ($value->getFillType() != Fill::FILL_NONE) {
1069
                    // c:spPr
1070 1
                    $objWriter->startElement('c:spPr');
1071
                    // Write fill
1072 1
                    $this->writeFill($objWriter, $value);
1073
                    // ## c:spPr
1074 1
                    $objWriter->endElement();
1075
                }
1076
1077
                // ## c:dPt
1078 1
                $objWriter->endElement();
1079
            }
1080
1081
            // c:dLbls
1082 4
            $objWriter->startElement('c:dLbls');
1083
1084
            // c:txPr
1085 4
            $objWriter->startElement('c:txPr');
1086
1087
            // a:bodyPr
1088 4
            $objWriter->writeElement('a:bodyPr', null);
1089
1090
            // a:lstStyle
1091 4
            $objWriter->writeElement('a:lstStyle', null);
1092
1093
            // a:p
1094 4
            $objWriter->startElement('a:p');
1095
1096
            // a:pPr
1097 4
            $objWriter->startElement('a:pPr');
1098
1099
            // a:defRPr
1100 4
            $objWriter->startElement('a:defRPr');
1101
1102 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1103 4
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1104 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1105 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1106 4
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1107 4
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1108 4
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1109
1110
            // Font - a:solidFill
1111 4
            $objWriter->startElement('a:solidFill');
1112
1113 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1114
1115 4
            $objWriter->endElement();
1116
1117
            // Font - a:latin
1118 4
            $objWriter->startElement('a:latin');
1119 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1120 4
            $objWriter->endElement();
1121
1122 4
            $objWriter->endElement();
1123
1124 4
            $objWriter->endElement();
1125
1126
            // a:endParaRPr
1127 4
            $objWriter->startElement('a:endParaRPr');
1128 4
            $objWriter->writeAttribute('lang', 'en-US');
1129 4
            $objWriter->writeAttribute('dirty', '0');
1130 4
            $objWriter->endElement();
1131
1132 4
            $objWriter->endElement();
1133
1134 4
            $objWriter->endElement();
1135
1136
            // c:showVal
1137 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1138
1139
            // c:showCatName
1140 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1141
1142
            // c:showSerName
1143 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1144
1145
            // c:showPercent
1146 4
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1147
1148
            // c:showLeaderLines
1149 4
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1150
1151 4
            $objWriter->endElement();
1152
1153
            // Write X axis data
1154 4
            $axisXData = array_keys($series->getValues());
1155
1156
            // c:cat
1157 4
            $objWriter->startElement('c:cat');
1158 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1159 4
            $objWriter->endElement();
1160
1161
            // Write Y axis data
1162 4
            $axisYData = array_values($series->getValues());
1163
1164
            // c:val
1165 4
            $objWriter->startElement('c:val');
1166 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1167 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1168 4
            $objWriter->endElement();
1169
1170 4
            $objWriter->endElement();
1171
1172 4
            ++$seriesIndex;
1173
        }
1174
1175
        // c:gapWidth
1176 4
        $objWriter->startElement('c:gapWidth');
1177 4
        $objWriter->writeAttribute('val', $subject->getGapWidthPercent());
1178 4
        $objWriter->endElement();
1179
1180
        // c:axId
1181 4
        $objWriter->startElement('c:axId');
1182 4
        $objWriter->writeAttribute('val', '52743552');
1183 4
        $objWriter->endElement();
1184
1185
        // c:axId
1186 4
        $objWriter->startElement('c:axId');
1187 4
        $objWriter->writeAttribute('val', '52749440');
1188 4
        $objWriter->endElement();
1189
1190
        // c:axId
1191 4
        $objWriter->startElement('c:axId');
1192 4
        $objWriter->writeAttribute('val', '0');
1193 4
        $objWriter->endElement();
1194
1195 4
        $objWriter->endElement();
1196 4
    }
1197
1198
    /**
1199
     * Write Type Pie
1200
     *
1201
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1202
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Doughnut $subject
1203
     * @param  boolean $includeSheet
1204
     * @throws \Exception
1205
     */
1206 1
    protected function writeTypeDoughnut(XMLWriter $objWriter, Doughnut $subject, $includeSheet = false)
1207
    {
1208
        // c:pieChart
1209 1
        $objWriter->startElement('c:doughnutChart');
1210
1211
        // c:varyColors
1212 1
        $objWriter->startElement('c:varyColors');
1213 1
        $objWriter->writeAttribute('val', '1');
1214 1
        $objWriter->endElement();
1215
1216
        // Write series
1217 1
        $seriesIndex = 0;
1218 1
        foreach ($subject->getSeries() as $series) {
1219
            // c:ser
1220 1
            $objWriter->startElement('c:ser');
1221
1222
            // c:idx
1223 1
            $objWriter->startElement('c:idx');
1224 1
            $objWriter->writeAttribute('val', $seriesIndex);
1225 1
            $objWriter->endElement();
1226
1227
            // c:order
1228 1
            $objWriter->startElement('c:order');
1229 1
            $objWriter->writeAttribute('val', $seriesIndex);
1230 1
            $objWriter->endElement();
1231
1232
            // c:tx
1233 1
            $objWriter->startElement('c:tx');
1234 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1235 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1236 1
            $objWriter->endElement();
1237
1238
            // Fills for points?
1239 1
            $dataPointFills = $series->getDataPointFills();
1240 1
            foreach ($dataPointFills as $key => $value) {
1241
                // c:dPt
1242 1
                $objWriter->startElement('c:dPt');
1243 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1244
                // c:dPt/c:spPr
1245 1
                $objWriter->startElement('c:spPr');
1246 1
                $this->writeFill($objWriter, $value);
1247
                // c:dPt/##c:spPr
1248 1
                $objWriter->endElement();
1249
                // ##c:dPt
1250 1
                $objWriter->endElement();
1251
            }
1252
1253
            // Write X axis data
1254 1
            $axisXData = array_keys($series->getValues());
1255
1256
            // c:cat
1257 1
            $objWriter->startElement('c:cat');
1258 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1259 1
            $objWriter->endElement();
1260
1261
            // Write Y axis data
1262 1
            $axisYData = array_values($series->getValues());
1263
1264
            // c:val
1265 1
            $objWriter->startElement('c:val');
1266 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1267 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1268 1
            $objWriter->endElement();
1269
1270 1
            $objWriter->endElement();
1271
1272 1
            ++$seriesIndex;
1273
        }
1274
1275
        // c:dLbls
1276 1
        $objWriter->startElement('c:dLbls');
1277
1278 1
        $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
0 ignored issues
show
Bug introduced by
The variable $series seems to be defined by a foreach iteration on line 1218. Are you sure the iterator is never empty, otherwise this variable is not defined?

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

foreach ($a as $b) {
}

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


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

// $b is now guaranteed to be defined here.
Loading history...
1279 1
        $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1280 1
        $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1281 1
        $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1282 1
        $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1283 1
        $this->writeElementWithValAttribute($objWriter, 'c:showBubbleSize', '0');
1284 1
        $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1285
1286 1
        if ($series->hasDlblNumFormat()) {
1287
            //c:numFmt
1288
            $objWriter->startElement('c:numFmt');
1289
            $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
1290
            $objWriter->writeAttribute('sourceLinked', '0');
1291
            $objWriter->endElement();
1292
        }
1293
1294
        // c:dLbls\c:txPr
1295 1
        $objWriter->startElement('c:txPr');
1296 1
        $objWriter->writeElement('a:bodyPr', null);
1297 1
        $objWriter->writeElement('a:lstStyle', null);
1298
1299
        // c:dLbls\c:txPr\a:p
1300 1
        $objWriter->startElement('a:p');
1301
1302
        // c:dLbls\c:txPr\a:p\a:pPr
1303 1
        $objWriter->startElement('a:pPr');
1304
1305
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr
1306 1
        $objWriter->startElement('a:defRPr');
1307 1
        $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1308 1
        $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1309 1
        $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1310 1
        $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1311 1
        $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1312 1
        $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1313 1
        $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1314
1315
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:solidFill
1316 1
        $objWriter->startElement('a:solidFill');
1317 1
        $this->writeColor($objWriter, $series->getFont()->getColor());
1318 1
        $objWriter->endElement();
1319
1320
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\a:latin
1321 1
        $objWriter->startElement('a:latin');
1322 1
        $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1323 1
        $objWriter->endElement();
1324
1325
        // c:dLbls\c:txPr\a:p\a:pPr\a:defRPr\
1326 1
        $objWriter->endElement();
1327
        // c:dLbls\c:txPr\a:p\a:pPr\
1328 1
        $objWriter->endElement();
1329
1330
        // c:dLbls\c:txPr\a:p\a:endParaRPr
1331 1
        $objWriter->startElement('a:endParaRPr');
1332 1
        $objWriter->writeAttribute('lang', 'en-US');
1333 1
        $objWriter->writeAttribute('dirty', '0');
1334 1
        $objWriter->endElement();
1335
1336
        // c:dLbls\c:txPr\a:p\
1337 1
        $objWriter->endElement();
1338
        // c:dLbls\c:txPr\
1339 1
        $objWriter->endElement();
1340
1341 1
        $separator = $series->getSeparator();
1342 1
        if (!empty($separator) && $separator != PHP_EOL) {
1343
            // c:dLbls\c:separator
1344 1
            $objWriter->writeElement('c:separator', $separator);
1345
        }
1346
1347
        // c:dLbls\
1348 1
        $objWriter->endElement();
1349
1350 1
        $this->writeElementWithValAttribute($objWriter, 'c:firstSliceAng', '0');
1351 1
        $this->writeElementWithValAttribute($objWriter, 'c:holeSize', $subject->getHoleSize());
1352
1353 1
        $objWriter->endElement();
1354 1
    }
1355
1356
    /**
1357
     * Write Type Pie
1358
     *
1359
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1360
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie $subject
1361
     * @param  boolean $includeSheet
1362
     * @throws \Exception
1363
     */
1364 1
    protected function writeTypePie(XMLWriter $objWriter, Pie $subject, $includeSheet = false)
1365
    {
1366
        // c:pieChart
1367 1
        $objWriter->startElement('c:pieChart');
1368
1369
        // c:varyColors
1370 1
        $objWriter->startElement('c:varyColors');
1371 1
        $objWriter->writeAttribute('val', '1');
1372 1
        $objWriter->endElement();
1373
1374
        // Write series
1375 1
        $seriesIndex = 0;
1376 1
        foreach ($subject->getSeries() as $series) {
1377
            // c:ser
1378 1
            $objWriter->startElement('c:ser');
1379
1380
            // c:idx
1381 1
            $objWriter->startElement('c:idx');
1382 1
            $objWriter->writeAttribute('val', $seriesIndex);
1383 1
            $objWriter->endElement();
1384
1385
            // c:order
1386 1
            $objWriter->startElement('c:order');
1387 1
            $objWriter->writeAttribute('val', $seriesIndex);
1388 1
            $objWriter->endElement();
1389
1390
            // c:tx
1391 1
            $objWriter->startElement('c:tx');
1392 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1393 1
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1394 1
            $objWriter->endElement();
1395
1396
            // Fills for points?
1397 1
            $dataPointFills = $series->getDataPointFills();
1398 1
            foreach ($dataPointFills as $key => $value) {
1399
                // c:dPt
1400 1
                $objWriter->startElement('c:dPt');
1401 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1402
                // c:dPt/c:spPr
1403 1
                $objWriter->startElement('c:spPr');
1404 1
                $this->writeFill($objWriter, $value);
1405
                // c:dPt/##c:spPr
1406 1
                $objWriter->endElement();
1407
                // ##c:dPt
1408 1
                $objWriter->endElement();
1409
            }
1410
1411
            // c:dLbls
1412 1
            $objWriter->startElement('c:dLbls');
1413
1414 1
            if ($series->hasDlblNumFormat()) {
1415
                //c:numFmt
1416
                $objWriter->startElement('c:numFmt');
1417
                $objWriter->writeAttribute('formatCode', $series->getDlblNumFormat());
1418
                $objWriter->writeAttribute('sourceLinked', '0');
1419
                $objWriter->endElement();
1420
            }
1421
1422
            // c:txPr
1423 1
            $objWriter->startElement('c:txPr');
1424
1425
            // a:bodyPr
1426 1
            $objWriter->writeElement('a:bodyPr', null);
1427
1428
            // a:lstStyle
1429 1
            $objWriter->writeElement('a:lstStyle', null);
1430
1431
            // a:p
1432 1
            $objWriter->startElement('a:p');
1433
1434
            // a:pPr
1435 1
            $objWriter->startElement('a:pPr');
1436
1437
            // a:defRPr
1438 1
            $objWriter->startElement('a:defRPr');
1439
1440 1
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1441 1
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1442 1
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1443 1
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1444 1
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1445 1
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1446 1
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1447
1448
            // Font - a:solidFill
1449 1
            $objWriter->startElement('a:solidFill');
1450
1451 1
            $this->writeColor($objWriter, $series->getFont()->getColor());
1452
1453 1
            $objWriter->endElement();
1454
1455
            // Font - a:latin
1456 1
            $objWriter->startElement('a:latin');
1457 1
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1458 1
            $objWriter->endElement();
1459
1460 1
            $objWriter->endElement();
1461
1462 1
            $objWriter->endElement();
1463
1464
            // a:endParaRPr
1465 1
            $objWriter->startElement('a:endParaRPr');
1466 1
            $objWriter->writeAttribute('lang', 'en-US');
1467 1
            $objWriter->writeAttribute('dirty', '0');
1468 1
            $objWriter->endElement();
1469
1470 1
            $objWriter->endElement();
1471
1472 1
            $objWriter->endElement();
1473
1474
            // c:dLblPos
1475 1
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1476
1477
            // c:showLegendKey
1478 1
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
1479
1480
            // c:showVal
1481 1
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1482
1483
            // c:showCatName
1484 1
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1485
1486
            // c:showSerName
1487 1
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1488
1489
            // c:showPercent
1490 1
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1491
1492
            // c:showLeaderLines
1493 1
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1494
1495 1
            $objWriter->endElement();
1496
1497
            // Write X axis data
1498 1
            $axisXData = array_keys($series->getValues());
1499
1500
            // c:cat
1501 1
            $objWriter->startElement('c:cat');
1502 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1503 1
            $objWriter->endElement();
1504
1505
            // Write Y axis data
1506 1
            $axisYData = array_values($series->getValues());
1507
1508
            // c:val
1509 1
            $objWriter->startElement('c:val');
1510 1
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1511 1
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1512 1
            $objWriter->endElement();
1513
1514 1
            $objWriter->endElement();
1515
1516 1
            ++$seriesIndex;
1517
        }
1518
1519 1
        $objWriter->endElement();
1520 1
    }
1521
1522
    /**
1523
     * Write Type Pie3D
1524
     *
1525
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1526
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Pie3D $subject
1527
     * @param  boolean $includeSheet
1528
     * @throws \Exception
1529
     */
1530 4
    protected function writeTypePie3D(XMLWriter $objWriter, Pie3D $subject, $includeSheet = false)
1531
    {
1532
        // c:pie3DChart
1533 4
        $objWriter->startElement('c:pie3DChart');
1534
1535
        // c:varyColors
1536 4
        $objWriter->startElement('c:varyColors');
1537 4
        $objWriter->writeAttribute('val', '1');
1538 4
        $objWriter->endElement();
1539
1540
        // Write series
1541 4
        $seriesIndex = 0;
1542 4
        foreach ($subject->getSeries() as $series) {
1543
            // c:ser
1544 4
            $objWriter->startElement('c:ser');
1545
1546
            // c:idx
1547 4
            $objWriter->startElement('c:idx');
1548 4
            $objWriter->writeAttribute('val', $seriesIndex);
1549 4
            $objWriter->endElement();
1550
1551
            // c:order
1552 4
            $objWriter->startElement('c:order');
1553 4
            $objWriter->writeAttribute('val', $seriesIndex);
1554 4
            $objWriter->endElement();
1555
1556
            // c:tx
1557 4
            $objWriter->startElement('c:tx');
1558 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1559 4
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1560 4
            $objWriter->endElement();
1561
1562
            // c:explosion
1563 4
            $objWriter->startElement('c:explosion');
1564 4
            $objWriter->writeAttribute('val', $subject->getExplosion());
1565 4
            $objWriter->endElement();
1566
1567
            // Fills for points?
1568 4
            $dataPointFills = $series->getDataPointFills();
1569 4
            foreach ($dataPointFills as $key => $value) {
1570
                // c:dPt
1571 1
                $objWriter->startElement('c:dPt');
1572 1
                $this->writeElementWithValAttribute($objWriter, 'c:idx', $key);
1573
                // c:dPt/c:spPr
1574 1
                $objWriter->startElement('c:spPr');
1575 1
                $this->writeFill($objWriter, $value);
1576
                // c:dPt/##c:spPr
1577 1
                $objWriter->endElement();
1578
                // ##c:dPt
1579 1
                $objWriter->endElement();
1580
            }
1581
1582
            // c:dLbls
1583 4
            $objWriter->startElement('c:dLbls');
1584
1585
            // c:txPr
1586 4
            $objWriter->startElement('c:txPr');
1587
1588
            // a:bodyPr
1589 4
            $objWriter->writeElement('a:bodyPr', null);
1590
1591
            // a:lstStyle
1592 4
            $objWriter->writeElement('a:lstStyle', null);
1593
1594
            // a:p
1595 4
            $objWriter->startElement('a:p');
1596
1597
            // a:pPr
1598 4
            $objWriter->startElement('a:pPr');
1599
1600
            // a:defRPr
1601 4
            $objWriter->startElement('a:defRPr');
1602
1603 4
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1604 4
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1605 4
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1606 4
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1607 4
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1608 4
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1609 4
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1610
1611
            // Font - a:solidFill
1612 4
            $objWriter->startElement('a:solidFill');
1613
1614 4
            $this->writeColor($objWriter, $series->getFont()->getColor());
1615
1616 4
            $objWriter->endElement();
1617
1618
            // Font - a:latin
1619 4
            $objWriter->startElement('a:latin');
1620 4
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1621 4
            $objWriter->endElement();
1622
1623 4
            $objWriter->endElement();
1624
1625 4
            $objWriter->endElement();
1626
1627
            // a:endParaRPr
1628 4
            $objWriter->startElement('a:endParaRPr');
1629 4
            $objWriter->writeAttribute('lang', 'en-US');
1630 4
            $objWriter->writeAttribute('dirty', '0');
1631 4
            $objWriter->endElement();
1632
1633 4
            $objWriter->endElement();
1634
1635 4
            $objWriter->endElement();
1636
1637
            // c:dLblPos
1638 4
            $this->writeElementWithValAttribute($objWriter, 'c:dLblPos', $series->getLabelPosition());
1639
1640
            // c:showVal
1641 4
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1642
1643
            // c:showCatName
1644 4
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1645
1646
            // c:showSerName
1647 4
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1648
1649
            // c:showPercent
1650 4
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1651
1652
            // c:showLeaderLines
1653 4
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1654
1655 4
            $objWriter->endElement();
1656
1657
            // Write X axis data
1658 4
            $axisXData = array_keys($series->getValues());
1659
1660
            // c:cat
1661 4
            $objWriter->startElement('c:cat');
1662 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1663 4
            $objWriter->endElement();
1664
1665
            // Write Y axis data
1666 4
            $axisYData = array_values($series->getValues());
1667
1668
            // c:val
1669 4
            $objWriter->startElement('c:val');
1670 4
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1671 4
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1672 4
            $objWriter->endElement();
1673
1674 4
            $objWriter->endElement();
1675
1676 4
            ++$seriesIndex;
1677
        }
1678
1679 4
        $objWriter->endElement();
1680 4
    }
1681
1682
    /**
1683
     * Write Type Line
1684
     *
1685
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1686
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Line $subject
1687
     * @param  boolean $includeSheet
1688
     * @throws \Exception
1689
     */
1690 14
    protected function writeTypeLine(XMLWriter $objWriter, Line $subject, $includeSheet = false)
1691
    {
1692
        // c:lineChart
1693 14
        $objWriter->startElement('c:lineChart');
1694
1695
        // c:grouping
1696 14
        $objWriter->startElement('c:grouping');
1697 14
        $objWriter->writeAttribute('val', 'standard');
1698 14
        $objWriter->endElement();
1699
1700
        // Write series
1701 14
        $seriesIndex = 0;
1702 14
        foreach ($subject->getSeries() as $series) {
1703
            // c:ser
1704 10
            $objWriter->startElement('c:ser');
1705
1706
            // c:idx
1707 10
            $objWriter->startElement('c:idx');
1708 10
            $objWriter->writeAttribute('val', $seriesIndex);
1709 10
            $objWriter->endElement();
1710
1711
            // c:order
1712 10
            $objWriter->startElement('c:order');
1713 10
            $objWriter->writeAttribute('val', $seriesIndex);
1714 10
            $objWriter->endElement();
1715
1716
            // c:tx
1717 10
            $objWriter->startElement('c:tx');
1718 10
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1719 10
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1720 10
            $objWriter->endElement();
1721
1722
            // c:spPr
1723 10
            $objWriter->startElement('c:spPr');
1724
            // Write fill
1725 10
            $this->writeFill($objWriter, $series->getFill());
0 ignored issues
show
Bug introduced by
It seems like $series->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
1726
            // Write outline
1727 10
            $this->writeOutline($objWriter, $series->getOutline());
1728
            // ## c:spPr
1729 10
            $objWriter->endElement();
1730
1731
            // Marker
1732 10
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1733
1734
            // c:dLbls
1735 10
            $objWriter->startElement('c:dLbls');
1736
1737
            // c:txPr
1738 10
            $objWriter->startElement('c:txPr');
1739
1740
            // a:bodyPr
1741 10
            $objWriter->writeElement('a:bodyPr', null);
1742
1743
            // a:lstStyle
1744 10
            $objWriter->writeElement('a:lstStyle', null);
1745
1746
            // a:p
1747 10
            $objWriter->startElement('a:p');
1748
1749
            // a:pPr
1750 10
            $objWriter->startElement('a:pPr');
1751
1752
            // a:defRPr
1753 10
            $objWriter->startElement('a:defRPr');
1754
1755 10
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1756 10
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1757 10
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1758 10
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1759 10
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1760 10
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1761 10
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1762
1763
            // Font - a:solidFill
1764 10
            $objWriter->startElement('a:solidFill');
1765
1766 10
            $this->writeColor($objWriter, $series->getFont()->getColor());
1767
1768 10
            $objWriter->endElement();
1769
1770
            // Font - a:latin
1771 10
            $objWriter->startElement('a:latin');
1772 10
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1773 10
            $objWriter->endElement();
1774
1775 10
            $objWriter->endElement();
1776
1777 10
            $objWriter->endElement();
1778
1779
            // a:endParaRPr
1780 10
            $objWriter->startElement('a:endParaRPr');
1781 10
            $objWriter->writeAttribute('lang', 'en-US');
1782 10
            $objWriter->writeAttribute('dirty', '0');
1783 10
            $objWriter->endElement();
1784
1785 10
            $objWriter->endElement();
1786
1787 10
            $objWriter->endElement();
1788
1789
            // c:showVal
1790 10
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1791
1792
            // c:showCatName
1793 10
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1794
1795
            // c:showSerName
1796 10
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1797
1798
            // c:showPercent
1799 10
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1800
1801
            // c:showLeaderLines
1802 10
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1803
1804
            // > c:dLbls
1805 10
            $objWriter->endElement();
1806
1807
            // Write X axis data
1808 10
            $axisXData = array_keys($series->getValues());
1809
1810
            // c:cat
1811 10
            $objWriter->startElement('c:cat');
1812 10
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1813 10
            $objWriter->endElement();
1814
1815
            // Write Y axis data
1816 10
            $axisYData = array_values($series->getValues());
1817
1818
            // c:val
1819 10
            $objWriter->startElement('c:val');
1820 10
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
1821 10
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
1822 10
            $objWriter->endElement();
1823
1824 10
            $objWriter->endElement();
1825
1826 10
            ++$seriesIndex;
1827
        }
1828
1829
        // c:marker
1830 14
        $objWriter->startElement('c:marker');
1831 14
        $objWriter->writeAttribute('val', '1');
1832 14
        $objWriter->endElement();
1833
1834
        // c:smooth
1835 14
        $objWriter->startElement('c:smooth');
1836 14
        $objWriter->writeAttribute('val', '0');
1837 14
        $objWriter->endElement();
1838
1839
        // c:axId
1840 14
        $objWriter->startElement('c:axId');
1841 14
        $objWriter->writeAttribute('val', '52743552');
1842 14
        $objWriter->endElement();
1843
1844
        // c:axId
1845 14
        $objWriter->startElement('c:axId');
1846 14
        $objWriter->writeAttribute('val', '52749440');
1847 14
        $objWriter->endElement();
1848
1849 14
        $objWriter->endElement();
1850 14
    }
1851
1852
    /**
1853
     * Write Type Scatter
1854
     *
1855
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
1856
     * @param  \PhpOffice\PhpPresentation\Shape\Chart\Type\Scatter $subject
1857
     * @param  boolean $includeSheet
1858
     * @throws \Exception
1859
     */
1860 6
    protected function writeTypeScatter(XMLWriter $objWriter, Scatter $subject, $includeSheet = false)
1861
    {
1862
        // c:scatterChart
1863 6
        $objWriter->startElement('c:scatterChart');
1864
1865
        // c:scatterStyle
1866 6
        $objWriter->startElement('c:scatterStyle');
1867 6
        $objWriter->writeAttribute('val', 'lineMarker');
1868 6
        $objWriter->endElement();
1869
1870
        // c:varyColors
1871 6
        $objWriter->startElement('c:varyColors');
1872 6
        $objWriter->writeAttribute('val', '0');
1873 6
        $objWriter->endElement();
1874
1875
        // Write series
1876 6
        $seriesIndex = 0;
1877 6
        foreach ($subject->getSeries() as $series) {
1878
            // c:ser
1879 6
            $objWriter->startElement('c:ser');
1880
1881
            // c:idx
1882 6
            $objWriter->startElement('c:idx');
1883 6
            $objWriter->writeAttribute('val', $seriesIndex);
1884 6
            $objWriter->endElement();
1885
1886
            // c:order
1887 6
            $objWriter->startElement('c:order');
1888 6
            $objWriter->writeAttribute('val', $seriesIndex);
1889 6
            $objWriter->endElement();
1890
1891
            // c:tx
1892 6
            $objWriter->startElement('c:tx');
1893 6
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex(1 + $seriesIndex) . '$1' : '');
1894 6
            $this->writeSingleValueOrReference($objWriter, $includeSheet, $series->getTitle(), $coords);
1895 6
            $objWriter->endElement();
1896
1897
            // c:spPr
1898 6
            $objWriter->startElement('c:spPr');
1899
            // Write fill
1900 6
            $this->writeFill($objWriter, $series->getFill());
0 ignored issues
show
Bug introduced by
It seems like $series->getFill() can be null; however, writeFill() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
1901
            // Write outline
1902 6
            $this->writeOutline($objWriter, $series->getOutline());
1903
            // ## c:spPr
1904 6
            $objWriter->endElement();
1905
1906
            // Marker
1907 6
            $this->writeSeriesMarker($objWriter, $series->getMarker());
1908
1909
            // c:dLbls
1910 6
            $objWriter->startElement('c:dLbls');
1911
1912
            // c:txPr
1913 6
            $objWriter->startElement('c:txPr');
1914
1915
            // a:bodyPr
1916 6
            $objWriter->writeElement('a:bodyPr', null);
1917
1918
            // a:lstStyle
1919 6
            $objWriter->writeElement('a:lstStyle', null);
1920
1921
            // a:p
1922 6
            $objWriter->startElement('a:p');
1923
1924
            // a:pPr
1925 6
            $objWriter->startElement('a:pPr');
1926
1927
            // a:defRPr
1928 6
            $objWriter->startElement('a:defRPr');
1929
1930 6
            $objWriter->writeAttribute('b', ($series->getFont()->isBold() ? 'true' : 'false'));
1931 6
            $objWriter->writeAttribute('i', ($series->getFont()->isItalic() ? 'true' : 'false'));
1932 6
            $objWriter->writeAttribute('strike', ($series->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
1933 6
            $objWriter->writeAttribute('sz', ($series->getFont()->getSize() * 100));
1934 6
            $objWriter->writeAttribute('u', $series->getFont()->getUnderline());
1935 6
            $objWriter->writeAttributeIf($series->getFont()->isSuperScript(), 'baseline', '300000');
1936 6
            $objWriter->writeAttributeIf($series->getFont()->isSubScript(), 'baseline', '-250000');
1937
1938
            // Font - a:solidFill
1939 6
            $objWriter->startElement('a:solidFill');
1940
1941 6
            $this->writeColor($objWriter, $series->getFont()->getColor());
1942
1943 6
            $objWriter->endElement();
1944
1945
            // Font - a:latin
1946 6
            $objWriter->startElement('a:latin');
1947 6
            $objWriter->writeAttribute('typeface', $series->getFont()->getName());
1948 6
            $objWriter->endElement();
1949
1950 6
            $objWriter->endElement();
1951
1952 6
            $objWriter->endElement();
1953
1954
            // a:endParaRPr
1955 6
            $objWriter->startElement('a:endParaRPr');
1956 6
            $objWriter->writeAttribute('lang', 'en-US');
1957 6
            $objWriter->writeAttribute('dirty', '0');
1958 6
            $objWriter->endElement();
1959
1960 6
            $objWriter->endElement();
1961
1962 6
            $objWriter->endElement();
1963
1964
            // c:showLegendKey
1965 6
            $this->writeElementWithValAttribute($objWriter, 'c:showLegendKey', $series->hasShowLegendKey() ? '1' : '0');
1966
1967
            // c:showVal
1968 6
            $this->writeElementWithValAttribute($objWriter, 'c:showVal', $series->hasShowValue() ? '1' : '0');
1969
1970
            // c:showCatName
1971 6
            $this->writeElementWithValAttribute($objWriter, 'c:showCatName', $series->hasShowCategoryName() ? '1' : '0');
1972
1973
            // c:showSerName
1974 6
            $this->writeElementWithValAttribute($objWriter, 'c:showSerName', $series->hasShowSeriesName() ? '1' : '0');
1975
1976
            // c:showPercent
1977 6
            $this->writeElementWithValAttribute($objWriter, 'c:showPercent', $series->hasShowPercentage() ? '1' : '0');
1978
1979
            // c:separator
1980 6
            $separator = $series->getSeparator();
1981 6
            if (!empty($separator) && $separator != PHP_EOL) {
1982
                // c:dLbls\c:separator
1983 1
                $objWriter->writeElement('c:separator', $separator);
1984
            }
1985
1986
            // c:showLeaderLines
1987 6
            $this->writeElementWithValAttribute($objWriter, 'c:showLeaderLines', $series->hasShowLeaderLines() ? '1' : '0');
1988
1989 6
            $objWriter->endElement();
1990
1991
            // Write X axis data
1992 6
            $axisXData = array_keys($series->getValues());
1993
1994
            // c:xVal
1995 6
            $objWriter->startElement('c:xVal');
1996 6
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisXData, 'Sheet1!$A$2:$A$' . (1 + count($axisXData)));
1997 6
            $objWriter->endElement();
1998
1999
            // Write Y axis data
2000 6
            $axisYData = array_values($series->getValues());
2001
2002
            // c:yVal
2003 6
            $objWriter->startElement('c:yVal');
2004 6
            $coords = ($includeSheet ? 'Sheet1!$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$2:$' . \PHPExcel_Cell::stringFromColumnIndex($seriesIndex + 1) . '$' . (1 + count($axisYData)) : '');
2005 6
            $this->writeMultipleValuesOrReference($objWriter, $includeSheet, $axisYData, $coords);
2006 6
            $objWriter->endElement();
2007
2008
            // c:smooth
2009 6
            $objWriter->startElement('c:smooth');
2010 6
            $objWriter->writeAttribute('val', '0');
2011 6
            $objWriter->endElement();
2012
2013 6
            $objWriter->endElement();
2014
2015 6
            ++$seriesIndex;
2016
        }
2017
2018
        // c:axId
2019 6
        $objWriter->startElement('c:axId');
2020 6
        $objWriter->writeAttribute('val', '52743552');
2021 6
        $objWriter->endElement();
2022
2023
        // c:axId
2024 6
        $objWriter->startElement('c:axId');
2025 6
        $objWriter->writeAttribute('val', '52749440');
2026 6
        $objWriter->endElement();
2027
2028 6
        $objWriter->endElement();
2029 6
    }
2030
2031
    /**
2032
     * Write chart relationships to XML format
2033
     *
2034
     * @param  \PhpOffice\PhpPresentation\Shape\Chart $pChart
2035
     * @return string                    XML Output
2036
     * @throws \Exception
2037
     */
2038
    public function writeChartRelationships(Chart $pChart)
2039
    {
2040
        // Create XML writer
2041
        $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
2042
2043
        // XML header
2044
        $objWriter->startDocument('1.0', 'UTF-8', 'yes');
2045
2046
        // Relationships
2047
        $objWriter->startElement('Relationships');
2048
        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
2049
2050
        // Write spreadsheet relationship?
2051
        if ($pChart->hasIncludedSpreadsheet()) {
2052
            $this->writeRelationship($objWriter, 1, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/package', '../embeddings/' . $pChart->getIndexedFilename() . '.xlsx');
2053
        }
2054
2055
        $objWriter->endElement();
2056
2057
        // Return
2058
        return $objWriter->getData();
2059
    }
2060
2061
    /**
2062
     * @param XMLWriter $objWriter
2063
     * @param Chart\Marker $oMarker
2064
     */
2065 16
    protected function writeSeriesMarker(XMLWriter $objWriter, Chart\Marker $oMarker)
2066
    {
2067
        // c:marker
2068 16
        $objWriter->startElement('c:marker');
2069
        // c:marker > c:symbol
2070 16
        $objWriter->startElement('c:symbol');
2071 16
        $objWriter->writeAttribute('val', $oMarker->getSymbol());
2072 16
        $objWriter->endElement();
2073
2074
        // Size if different of none
2075 16
        if ($oMarker->getSymbol() != Chart\Marker::SYMBOL_NONE) {
2076 2
            $markerSize = (int)$oMarker->getSize();
2077 2
            if ($markerSize < 2) {
2078 2
                $markerSize = 2;
2079
            }
2080 2
            if ($markerSize > 72) {
2081 2
                $markerSize = 72;
2082
            }
2083
2084
            /**
2085
             * c:marker > c:size
2086
             * Size in points
2087
             * @link : https://msdn.microsoft.com/en-us/library/hh658135(v=office.12).aspx
2088
             */
2089 2
            $objWriter->startElement('c:size');
2090 2
            $objWriter->writeAttribute('val', $markerSize);
2091 2
            $objWriter->endElement();
2092
        }
2093 16
        $objWriter->endElement();
2094 16
    }
2095
2096
    /**
2097
     * @param XMLWriter $objWriter
2098
     * @param Chart\Axis $oAxis
2099
     * @param $typeAxis
2100
     * @param Chart\Type\AbstractType $typeChart
2101
     * @throws \Exception
2102
     */
2103 28
    protected function writeAxis(XMLWriter $objWriter, Chart\Axis $oAxis, $typeAxis, Chart\Type\AbstractType $typeChart)
2104
    {
2105 28
        if ($typeAxis != Chart\Axis::AXIS_X && $typeAxis != Chart\Axis::AXIS_Y) {
2106
            return;
2107
        }
2108
2109 28
        if ($typeAxis == Chart\Axis::AXIS_X) {
2110 28
            $mainElement = 'c:catAx';
2111 28
            $axIdVal = '52743552';
2112 28
            $axPosVal = 'b';
2113 28
            $crossAxVal = '52749440';
2114
        } else {
2115 28
            $mainElement = 'c:valAx';
2116 28
            $axIdVal = '52749440';
2117 28
            $axPosVal = 'l';
2118 28
            $crossAxVal = '52743552';
2119
        }
2120
2121
        // $mainElement
2122 28
        $objWriter->startElement($mainElement);
2123
2124
        // $mainElement > c:axId
2125 28
        $objWriter->startElement('c:axId');
2126 28
        $objWriter->writeAttribute('val', $axIdVal);
2127 28
        $objWriter->endElement();
2128
2129
        // $mainElement > c:scaling
2130 28
        $objWriter->startElement('c:scaling');
2131
2132
        // $mainElement > c:scaling > c:orientation
2133 28
        $objWriter->startElement('c:orientation');
2134 28
        $objWriter->writeAttribute('val', 'minMax');
2135 28
        $objWriter->endElement();
2136
2137 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...
2138 1
            $objWriter->startElement('c:max');
2139 1
            $objWriter->writeAttribute('val', $oAxis->getMaxBounds());
2140 1
            $objWriter->endElement();
2141
        }
2142
2143 28
        if ($oAxis->getMinBounds() != null) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing $oAxis->getMinBounds() of type integer|null against null; this is ambiguous if the integer can be zero. Consider using a strict comparison !== instead.
Loading history...
2144 1
            $objWriter->startElement('c:min');
2145 1
            $objWriter->writeAttribute('val', $oAxis->getMinBounds());
2146 1
            $objWriter->endElement();
2147
        }
2148
2149
        // $mainElement > ##c:scaling
2150 28
        $objWriter->endElement();
2151
2152
        // $mainElement > c:delete
2153 28
        $objWriter->startElement('c:delete');
2154 28
        $objWriter->writeAttribute('val', $oAxis->isVisible() ? '0' : '1');
2155 28
        $objWriter->endElement();
2156
2157
        // $mainElement > c:axPos
2158 28
        $objWriter->startElement('c:axPos');
2159 28
        $objWriter->writeAttribute('val', $axPosVal);
2160 28
        $objWriter->endElement();
2161
2162 28
        $oMajorGridlines = $oAxis->getMajorGridlines();
2163 28
        if ($oMajorGridlines instanceof Gridlines) {
2164 1
            $objWriter->startElement('c:majorGridlines');
2165
2166 1
            $this->writeAxisGridlines($objWriter, $oMajorGridlines);
2167
2168 1
            $objWriter->endElement();
2169
        }
2170
2171 28
        $oMinorGridlines = $oAxis->getMinorGridlines();
2172 28
        if ($oMinorGridlines instanceof Gridlines) {
2173 1
            $objWriter->startElement('c:minorGridlines');
2174
2175 1
            $this->writeAxisGridlines($objWriter, $oMinorGridlines);
2176
2177 1
            $objWriter->endElement();
2178
        }
2179
2180 28
        if ($oAxis->getTitle() != '') {
2181
            // c:title
2182 28
            $objWriter->startElement('c:title');
2183
2184
            // c:tx
2185 28
            $objWriter->startElement('c:tx');
2186
2187
            // c:rich
2188 28
            $objWriter->startElement('c:rich');
2189
2190
            // a:bodyPr
2191 28
            $objWriter->writeElement('a:bodyPr', null);
2192
2193
            // a:lstStyle
2194 28
            $objWriter->writeElement('a:lstStyle', null);
2195
2196
            // a:p
2197 28
            $objWriter->startElement('a:p');
2198
2199
            // a:pPr
2200 28
            $objWriter->startElement('a:pPr');
2201
2202
            // a:defRPr
2203 28
            $objWriter->startElement('a:defRPr');
2204
2205 28
            $objWriter->writeAttribute('b', ($oAxis->getFont()->isBold() ? 'true' : 'false'));
2206 28
            $objWriter->writeAttribute('i', ($oAxis->getFont()->isItalic() ? 'true' : 'false'));
2207 28
            $objWriter->writeAttribute('strike', ($oAxis->getFont()->isStrikethrough() ? 'sngStrike' : 'noStrike'));
2208 28
            $objWriter->writeAttribute('sz', ($oAxis->getFont()->getSize() * 100));
2209 28
            $objWriter->writeAttribute('u', $oAxis->getFont()->getUnderline());
2210 28
            $objWriter->writeAttributeIf($oAxis->getFont()->isSuperScript(), 'baseline', '300000');
2211 28
            $objWriter->writeAttributeIf($oAxis->getFont()->isSubScript(), 'baseline', '-250000');
2212
2213
            // Font - a:solidFill
2214 28
            $objWriter->startElement('a:solidFill');
2215 28
            $this->writeColor($objWriter, $oAxis->getFont()->getColor());
2216 28
            $objWriter->endElement();
2217
2218
            // Font - a:latin
2219 28
            $objWriter->startElement('a:latin');
2220 28
            $objWriter->writeAttribute('typeface', $oAxis->getFont()->getName());
2221 28
            $objWriter->endElement();
2222
2223 28
            $objWriter->endElement();
2224
2225
            // ## a:pPr
2226 28
            $objWriter->endElement();
2227
2228
            // a:r
2229 28
            $objWriter->startElement('a:r');
2230
2231
            // a:rPr
2232 28
            $objWriter->startElement('a:rPr');
2233 28
            $objWriter->writeAttribute('lang', 'en-US');
2234 28
            $objWriter->writeAttribute('dirty', '0');
2235 28
            $objWriter->endElement();
2236
2237
            // a:t
2238 28
            $objWriter->writeElement('a:t', $oAxis->getTitle());
2239
2240
            // ## a:r
2241 28
            $objWriter->endElement();
2242
2243
            // a:endParaRPr
2244 28
            $objWriter->startElement('a:endParaRPr');
2245 28
            $objWriter->writeAttribute('lang', 'en-US');
2246 28
            $objWriter->writeAttribute('dirty', '0');
2247 28
            $objWriter->endElement();
2248
2249
            // ## a:p
2250 28
            $objWriter->endElement();
2251
2252
            // ## c:rich
2253 28
            $objWriter->endElement();
2254
2255
            // ## c:tx
2256 28
            $objWriter->endElement();
2257
2258
            // ## c:title
2259 28
            $objWriter->endElement();
2260
        }
2261
2262
        // c:numFmt
2263 28
        $objWriter->startElement('c:numFmt');
2264 28
        $objWriter->writeAttribute('formatCode', $oAxis->getFormatCode());
2265 28
        $objWriter->writeAttribute('sourceLinked', '1');
2266 28
        $objWriter->endElement();
2267
2268
        // c:majorTickMark
2269 28
        $objWriter->startElement('c:majorTickMark');
2270 28
        $objWriter->writeAttribute('val', $oAxis->getMajorTickMark());
2271 28
        $objWriter->endElement();
2272
2273
        // c:minorTickMark
2274 28
        $objWriter->startElement('c:minorTickMark');
2275 28
        $objWriter->writeAttribute('val', $oAxis->getMinorTickMark());
2276 28
        $objWriter->endElement();
2277
2278
        // c:tickLblPos
2279 28
        $objWriter->startElement('c:tickLblPos');
2280 28
        $objWriter->writeAttribute('val', 'nextTo');
2281 28
        $objWriter->endElement();
2282
2283
        // c:spPr
2284 28
        $objWriter->startElement('c:spPr');
2285
        // Outline
2286 28
        $this->writeOutline($objWriter, $oAxis->getOutline());
2287
        // ##c:spPr
2288 28
        $objWriter->endElement();
2289
2290
        // c:crossAx
2291 28
        $objWriter->startElement('c:crossAx');
2292 28
        $objWriter->writeAttribute('val', $crossAxVal);
2293 28
        $objWriter->endElement();
2294
2295
        // c:crosses
2296 28
        $objWriter->startElement('c:crosses');
2297 28
        $objWriter->writeAttribute('val', 'autoZero');
2298 28
        $objWriter->endElement();
2299
2300 28
        if ($typeAxis == Chart\Axis::AXIS_X) {
2301
            // c:lblAlgn
2302 28
            $objWriter->startElement('c:lblAlgn');
2303 28
            $objWriter->writeAttribute('val', 'ctr');
2304 28
            $objWriter->endElement();
2305
2306
            // c:lblOffset
2307 28
            $objWriter->startElement('c:lblOffset');
2308 28
            $objWriter->writeAttribute('val', '100');
2309 28
            $objWriter->endElement();
2310
        }
2311
2312 28
        if ($typeAxis == Chart\Axis::AXIS_Y) {
2313
            // c:crossBetween
2314 28
            $objWriter->startElement('c:crossBetween');
2315
            // midCat : Position Axis On Tick Marks
2316
            // between : Between Tick Marks
2317 28
            if ($typeChart instanceof Area) {
2318 1
                $objWriter->writeAttribute('val', 'midCat');
2319
            } else {
2320 27
                $objWriter->writeAttribute('val', 'between');
2321
            }
2322 28
            $objWriter->endElement();
2323
2324
            // c:majorUnit
2325 28
            if ($oAxis->getMajorUnit() != null) {
2326 1
                $objWriter->startElement('c:majorUnit');
2327 1
                $objWriter->writeAttribute('val', $oAxis->getMajorUnit());
2328 1
                $objWriter->endElement();
2329
            }
2330
2331
            // c:minorUnit
2332 28
            if ($oAxis->getMinorUnit() != null) {
2333 1
                $objWriter->startElement('c:minorUnit');
2334 1
                $objWriter->writeAttribute('val', $oAxis->getMinorUnit());
2335 1
                $objWriter->endElement();
2336
            }
2337
        }
2338
2339 28
        $objWriter->endElement();
2340 28
    }
2341
2342
    /**
2343
     * @param XMLWriter $objWriter
2344
     * @param Gridlines $oGridlines
2345
     * @throws \Exception
2346
     */
2347 1
    protected function writeAxisGridlines(XMLWriter $objWriter, Gridlines $oGridlines)
2348
    {
2349
        // c:spPr
2350 1
        $objWriter->startElement('c:spPr');
2351
2352
        // Outline
2353 1
        $this->writeOutline($objWriter, $oGridlines->getOutline());
2354
2355
        // ##c:spPr
2356 1
        $objWriter->endElement();
2357 1
    }
2358
}
2359