Completed
Pull Request — develop (#435)
by
unknown
23:25
created

PptCharts::writeMultipleValuesOrReference()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 45
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 9.6738

Importance

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