Completed
Pull Request — develop (#339)
by Franck
08:16
created

PptCharts::writeChartRelationships()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 22
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

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