OSDN Git Service

Добавлены некоторые тесты сайта. Доавлен, но не подключён модуль импорта из .xls...
[invent/invent.git] / vendor / phpoffice / phpexcel / Classes / PHPExcel / Writer / Excel2007 / Chart.php
1 <?php
2
3 /**
4  * PHPExcel_Writer_Excel2007_Chart
5  *
6  * Copyright (c) 2006 - 2015 PHPExcel
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  *
22  * @category   PHPExcel
23  * @package    PHPExcel_Writer_Excel2007
24  * @copyright  Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
25  * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt    LGPL
26  * @version    ##VERSION##, ##DATE##
27  */
28 class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart
29 {
30     protected $calculateCellValues;
31
32     /**
33      * Write charts to XML format
34      *
35      * @param  PHPExcel_Chart $pChart
36      *
37      * @return  string            XML Output
38      * @throws  PHPExcel_Writer_Exception
39      */
40     public function writeChart(PHPExcel_Chart $pChart = null, $calculateCellValues = true)
41     {
42         $this->calculateCellValues = $calculateCellValues;
43
44         // Create XML writer
45         $objWriter = null;
46         if ($this->getParentWriter()->getUseDiskCaching()) {
47             $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
48         } else {
49             $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
50         }
51         //    Ensure that data series values are up-to-date before we save
52         if ($this->calculateCellValues) {
53             $pChart->refresh();
54         }
55
56         // XML header
57         $objWriter->startDocument('1.0', 'UTF-8', 'yes');
58
59         // c:chartSpace
60         $objWriter->startElement('c:chartSpace');
61         $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
62         $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
63         $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
64
65         $objWriter->startElement('c:date1904');
66         $objWriter->writeAttribute('val', 0);
67         $objWriter->endElement();
68         $objWriter->startElement('c:lang');
69         $objWriter->writeAttribute('val', "en-GB");
70         $objWriter->endElement();
71         $objWriter->startElement('c:roundedCorners');
72         $objWriter->writeAttribute('val', 0);
73         $objWriter->endElement();
74
75         $this->writeAlternateContent($objWriter);
76
77         $objWriter->startElement('c:chart');
78
79         $this->writeTitle($pChart->getTitle(), $objWriter);
80
81         $objWriter->startElement('c:autoTitleDeleted');
82         $objWriter->writeAttribute('val', 0);
83         $objWriter->endElement();
84
85         $this->writePlotArea($pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $objWriter, $pChart->getWorksheet(), $pChart->getChartAxisX(), $pChart->getChartAxisY(), $pChart->getMajorGridlines(), $pChart->getMinorGridlines());
86
87         $this->writeLegend($pChart->getLegend(), $objWriter);
88
89         $objWriter->startElement('c:plotVisOnly');
90         $objWriter->writeAttribute('val', 1);
91         $objWriter->endElement();
92
93         $objWriter->startElement('c:dispBlanksAs');
94         $objWriter->writeAttribute('val', "gap");
95         $objWriter->endElement();
96
97         $objWriter->startElement('c:showDLblsOverMax');
98         $objWriter->writeAttribute('val', 0);
99         $objWriter->endElement();
100
101         $objWriter->endElement();
102
103         $this->writePrintSettings($objWriter);
104
105         $objWriter->endElement();
106
107         // Return
108         return $objWriter->getData();
109     }
110
111     /**
112      * Write Chart Title
113      *
114      * @param  PHPExcel_Chart_Title $title
115      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
116      *
117      * @throws  PHPExcel_Writer_Exception
118      */
119     private function writeTitle(PHPExcel_Chart_Title $title = null, $objWriter)
120     {
121         if (is_null($title)) {
122             return;
123         }
124
125         $objWriter->startElement('c:title');
126         $objWriter->startElement('c:tx');
127         $objWriter->startElement('c:rich');
128
129         $objWriter->startElement('a:bodyPr');
130         $objWriter->endElement();
131
132         $objWriter->startElement('a:lstStyle');
133         $objWriter->endElement();
134
135         $objWriter->startElement('a:p');
136
137         $caption = $title->getCaption();
138         if ((is_array($caption)) && (count($caption) > 0)) {
139             $caption = $caption[0];
140         }
141         $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a');
142
143         $objWriter->endElement();
144         $objWriter->endElement();
145         $objWriter->endElement();
146
147         $this->writeLayout($title->getLayout(), $objWriter);
148
149         $objWriter->startElement('c:overlay');
150         $objWriter->writeAttribute('val', 0);
151         $objWriter->endElement();
152
153         $objWriter->endElement();
154     }
155
156     /**
157      * Write Chart Legend
158      *
159      * @param  PHPExcel_Chart_Legend $legend
160      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
161      *
162      * @throws  PHPExcel_Writer_Exception
163      */
164     private function writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter)
165     {
166         if (is_null($legend)) {
167             return;
168         }
169
170         $objWriter->startElement('c:legend');
171
172         $objWriter->startElement('c:legendPos');
173         $objWriter->writeAttribute('val', $legend->getPosition());
174         $objWriter->endElement();
175
176         $this->writeLayout($legend->getLayout(), $objWriter);
177
178         $objWriter->startElement('c:overlay');
179         $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0');
180         $objWriter->endElement();
181
182         $objWriter->startElement('c:txPr');
183         $objWriter->startElement('a:bodyPr');
184         $objWriter->endElement();
185
186         $objWriter->startElement('a:lstStyle');
187         $objWriter->endElement();
188
189         $objWriter->startElement('a:p');
190         $objWriter->startElement('a:pPr');
191         $objWriter->writeAttribute('rtl', 0);
192
193         $objWriter->startElement('a:defRPr');
194         $objWriter->endElement();
195         $objWriter->endElement();
196
197         $objWriter->startElement('a:endParaRPr');
198         $objWriter->writeAttribute('lang', "en-US");
199         $objWriter->endElement();
200
201         $objWriter->endElement();
202         $objWriter->endElement();
203
204         $objWriter->endElement();
205     }
206
207     /**
208      * Write Chart Plot Area
209      *
210      * @param  PHPExcel_Chart_PlotArea $plotArea
211      * @param  PHPExcel_Chart_Title $xAxisLabel
212      * @param  PHPExcel_Chart_Title $yAxisLabel
213      * @param  PHPExcel_Chart_Axis $xAxis
214      * @param  PHPExcel_Chart_Axis $yAxis
215      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
216      *
217      * @throws  PHPExcel_Writer_Exception
218      */
219     private function writePlotArea(PHPExcel_Chart_PlotArea $plotArea, PHPExcel_Chart_Title $xAxisLabel = null, PHPExcel_Chart_Title $yAxisLabel = null, $objWriter, PHPExcel_Worksheet $pSheet, PHPExcel_Chart_Axis $xAxis, PHPExcel_Chart_Axis $yAxis, PHPExcel_Chart_GridLines $majorGridlines, PHPExcel_Chart_GridLines $minorGridlines)
220     {
221         if (is_null($plotArea)) {
222             return;
223         }
224
225         $id1 = $id2 = 0;
226         $this->_seriesIndex = 0;
227         $objWriter->startElement('c:plotArea');
228
229         $layout = $plotArea->getLayout();
230
231         $this->writeLayout($layout, $objWriter);
232
233         $chartTypes = self::getChartType($plotArea);
234         $catIsMultiLevelSeries = $valIsMultiLevelSeries = false;
235         $plotGroupingType = '';
236         foreach ($chartTypes as $chartType) {
237             $objWriter->startElement('c:' . $chartType);
238
239             $groupCount = $plotArea->getPlotGroupCount();
240             for ($i = 0; $i < $groupCount; ++$i) {
241                 $plotGroup = $plotArea->getPlotGroupByIndex($i);
242                 $groupType = $plotGroup->getPlotType();
243                 if ($groupType == $chartType) {
244                     $plotStyle = $plotGroup->getPlotStyle();
245                     if ($groupType === PHPExcel_Chart_DataSeries::TYPE_RADARCHART) {
246                         $objWriter->startElement('c:radarStyle');
247                         $objWriter->writeAttribute('val', $plotStyle);
248                         $objWriter->endElement();
249                     } elseif ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART) {
250                         $objWriter->startElement('c:scatterStyle');
251                         $objWriter->writeAttribute('val', $plotStyle);
252                         $objWriter->endElement();
253                     }
254
255                     $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType, $pSheet);
256                 }
257             }
258
259             $this->writeDataLabels($objWriter, $layout);
260
261             if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
262                 //    Line only, Line3D can't be smoothed
263
264                 $objWriter->startElement('c:smooth');
265                 $objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine());
266                 $objWriter->endElement();
267             } elseif (($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) ||($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) {
268                 $objWriter->startElement('c:gapWidth');
269                 $objWriter->writeAttribute('val', 150);
270                 $objWriter->endElement();
271
272                 if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') {
273                     $objWriter->startElement('c:overlap');
274                     $objWriter->writeAttribute('val', 100);
275                     $objWriter->endElement();
276                 }
277             } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
278                 $objWriter->startElement('c:bubbleScale');
279                 $objWriter->writeAttribute('val', 25);
280                 $objWriter->endElement();
281
282                 $objWriter->startElement('c:showNegBubbles');
283                 $objWriter->writeAttribute('val', 0);
284                 $objWriter->endElement();
285             } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
286                 $objWriter->startElement('c:hiLowLines');
287                 $objWriter->endElement();
288
289                 $objWriter->startElement('c:upDownBars');
290
291                 $objWriter->startElement('c:gapWidth');
292                 $objWriter->writeAttribute('val', 300);
293                 $objWriter->endElement();
294
295                 $objWriter->startElement('c:upBars');
296                 $objWriter->endElement();
297
298                 $objWriter->startElement('c:downBars');
299                 $objWriter->endElement();
300
301                 $objWriter->endElement();
302             }
303
304             //    Generate 2 unique numbers to use for axId values
305             //                    $id1 = $id2 = rand(10000000,99999999);
306             //                    do {
307             //                        $id2 = rand(10000000,99999999);
308             //                    } while ($id1 == $id2);
309             $id1 = '75091328';
310             $id2 = '75089408';
311
312             if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
313                 $objWriter->startElement('c:axId');
314                 $objWriter->writeAttribute('val', $id1);
315                 $objWriter->endElement();
316                 $objWriter->startElement('c:axId');
317                 $objWriter->writeAttribute('val', $id2);
318                 $objWriter->endElement();
319             } else {
320                 $objWriter->startElement('c:firstSliceAng');
321                 $objWriter->writeAttribute('val', 0);
322                 $objWriter->endElement();
323
324                 if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) {
325                     $objWriter->startElement('c:holeSize');
326                     $objWriter->writeAttribute('val', 50);
327                     $objWriter->endElement();
328                 }
329             }
330
331             $objWriter->endElement();
332         }
333
334         if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
335             if ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
336                 $this->writeValueAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines);
337             } else {
338                 $this->writeCategoryAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis);
339             }
340
341             $this->writeValueAxis($objWriter, $plotArea, $yAxisLabel, $chartType, $id1, $id2, $valIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines);
342         }
343
344         $objWriter->endElement();
345     }
346
347     /**
348      * Write Data Labels
349      *
350      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
351      * @param  PHPExcel_Chart_Layout $chartLayout Chart layout
352      *
353      * @throws  PHPExcel_Writer_Exception
354      */
355     private function writeDataLabels($objWriter, $chartLayout)
356     {
357         $objWriter->startElement('c:dLbls');
358
359         $objWriter->startElement('c:showLegendKey');
360         $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey();
361         $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1));
362         $objWriter->endElement();
363
364         $objWriter->startElement('c:showVal');
365         $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal();
366         $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1));
367         $objWriter->endElement();
368
369         $objWriter->startElement('c:showCatName');
370         $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName();
371         $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1));
372         $objWriter->endElement();
373
374         $objWriter->startElement('c:showSerName');
375         $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName();
376         $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1));
377         $objWriter->endElement();
378
379         $objWriter->startElement('c:showPercent');
380         $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent();
381         $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1));
382         $objWriter->endElement();
383
384         $objWriter->startElement('c:showBubbleSize');
385         $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize();
386         $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1));
387         $objWriter->endElement();
388
389         $objWriter->startElement('c:showLeaderLines');
390         $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines();
391         $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1));
392         $objWriter->endElement();
393
394         $objWriter->endElement();
395     }
396
397     /**
398      * Write Category Axis
399      *
400      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
401      * @param  PHPExcel_Chart_PlotArea $plotArea
402      * @param  PHPExcel_Chart_Title $xAxisLabel
403      * @param  string $groupType Chart type
404      * @param  string $id1
405      * @param  string $id2
406      * @param  boolean $isMultiLevelSeries
407      *
408      * @throws  PHPExcel_Writer_Exception
409      */
410     private function writeCategoryAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis)
411     {
412         $objWriter->startElement('c:catAx');
413
414         if ($id1 > 0) {
415             $objWriter->startElement('c:axId');
416             $objWriter->writeAttribute('val', $id1);
417             $objWriter->endElement();
418         }
419
420         $objWriter->startElement('c:scaling');
421         $objWriter->startElement('c:orientation');
422         $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation'));
423         $objWriter->endElement();
424         $objWriter->endElement();
425
426         $objWriter->startElement('c:delete');
427         $objWriter->writeAttribute('val', 0);
428         $objWriter->endElement();
429
430         $objWriter->startElement('c:axPos');
431         $objWriter->writeAttribute('val', "b");
432         $objWriter->endElement();
433
434         if (!is_null($xAxisLabel)) {
435             $objWriter->startElement('c:title');
436             $objWriter->startElement('c:tx');
437             $objWriter->startElement('c:rich');
438
439             $objWriter->startElement('a:bodyPr');
440             $objWriter->endElement();
441
442             $objWriter->startElement('a:lstStyle');
443             $objWriter->endElement();
444
445             $objWriter->startElement('a:p');
446             $objWriter->startElement('a:r');
447
448             $caption = $xAxisLabel->getCaption();
449             if (is_array($caption)) {
450                 $caption = $caption[0];
451             }
452             $objWriter->startElement('a:t');
453             //                                        $objWriter->writeAttribute('xml:space', 'preserve');
454             $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption));
455             $objWriter->endElement();
456
457             $objWriter->endElement();
458             $objWriter->endElement();
459             $objWriter->endElement();
460             $objWriter->endElement();
461
462             $layout = $xAxisLabel->getLayout();
463             $this->writeLayout($layout, $objWriter);
464
465             $objWriter->startElement('c:overlay');
466             $objWriter->writeAttribute('val', 0);
467             $objWriter->endElement();
468
469             $objWriter->endElement();
470         }
471
472         $objWriter->startElement('c:numFmt');
473         $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat());
474         $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked());
475         $objWriter->endElement();
476
477         $objWriter->startElement('c:majorTickMark');
478         $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark'));
479         $objWriter->endElement();
480
481         $objWriter->startElement('c:minorTickMark');
482         $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark'));
483         $objWriter->endElement();
484
485         $objWriter->startElement('c:tickLblPos');
486         $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels'));
487         $objWriter->endElement();
488
489         if ($id2 > 0) {
490             $objWriter->startElement('c:crossAx');
491             $objWriter->writeAttribute('val', $id2);
492             $objWriter->endElement();
493
494             $objWriter->startElement('c:crosses');
495             $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses'));
496             $objWriter->endElement();
497         }
498
499         $objWriter->startElement('c:auto');
500         $objWriter->writeAttribute('val', 1);
501         $objWriter->endElement();
502
503         $objWriter->startElement('c:lblAlgn');
504         $objWriter->writeAttribute('val', "ctr");
505         $objWriter->endElement();
506
507         $objWriter->startElement('c:lblOffset');
508         $objWriter->writeAttribute('val', 100);
509         $objWriter->endElement();
510
511         if ($isMultiLevelSeries) {
512             $objWriter->startElement('c:noMultiLvlLbl');
513             $objWriter->writeAttribute('val', 0);
514             $objWriter->endElement();
515         }
516         $objWriter->endElement();
517     }
518
519     /**
520      * Write Value Axis
521      *
522      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
523      * @param  PHPExcel_Chart_PlotArea $plotArea
524      * @param  PHPExcel_Chart_Title $yAxisLabel
525      * @param  string $groupType Chart type
526      * @param  string $id1
527      * @param  string $id2
528      * @param  boolean $isMultiLevelSeries
529      *
530      * @throws  PHPExcel_Writer_Exception
531      */
532     private function writeValueAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines)
533     {
534         $objWriter->startElement('c:valAx');
535
536         if ($id2 > 0) {
537             $objWriter->startElement('c:axId');
538             $objWriter->writeAttribute('val', $id2);
539             $objWriter->endElement();
540         }
541
542         $objWriter->startElement('c:scaling');
543
544         if (!is_null($xAxis->getAxisOptionsProperty('maximum'))) {
545             $objWriter->startElement('c:max');
546             $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum'));
547             $objWriter->endElement();
548         }
549
550         if (!is_null($xAxis->getAxisOptionsProperty('minimum'))) {
551             $objWriter->startElement('c:min');
552             $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum'));
553             $objWriter->endElement();
554         }
555
556         $objWriter->startElement('c:orientation');
557         $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation'));
558
559
560         $objWriter->endElement();
561         $objWriter->endElement();
562
563         $objWriter->startElement('c:delete');
564         $objWriter->writeAttribute('val', 0);
565         $objWriter->endElement();
566
567         $objWriter->startElement('c:axPos');
568         $objWriter->writeAttribute('val', "l");
569         $objWriter->endElement();
570
571         $objWriter->startElement('c:majorGridlines');
572         $objWriter->startElement('c:spPr');
573
574         if (!is_null($majorGridlines->getLineColorProperty('value'))) {
575             $objWriter->startElement('a:ln');
576             $objWriter->writeAttribute('w', $majorGridlines->getLineStyleProperty('width'));
577             $objWriter->startElement('a:solidFill');
578             $objWriter->startElement("a:{$majorGridlines->getLineColorProperty('type')}");
579             $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('value'));
580             $objWriter->startElement('a:alpha');
581             $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('alpha'));
582             $objWriter->endElement(); //end alpha
583             $objWriter->endElement(); //end srgbClr
584             $objWriter->endElement(); //end solidFill
585
586             $objWriter->startElement('a:prstDash');
587             $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash'));
588             $objWriter->endElement();
589
590             if ($majorGridlines->getLineStyleProperty('join') == 'miter') {
591                 $objWriter->startElement('a:miter');
592                 $objWriter->writeAttribute('lim', '800000');
593                 $objWriter->endElement();
594             } else {
595                 $objWriter->startElement('a:bevel');
596                 $objWriter->endElement();
597             }
598
599             if (!is_null($majorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')))) {
600                 $objWriter->startElement('a:headEnd');
601                 $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')));
602                 $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('head', 'w'));
603                 $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('head', 'len'));
604                 $objWriter->endElement();
605             }
606
607             if (!is_null($majorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')))) {
608                 $objWriter->startElement('a:tailEnd');
609                 $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')));
610                 $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('end', 'w'));
611                 $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('end', 'len'));
612                 $objWriter->endElement();
613             }
614             $objWriter->endElement(); //end ln
615         }
616         $objWriter->startElement('a:effectLst');
617
618         if (!is_null($majorGridlines->getGlowSize())) {
619             $objWriter->startElement('a:glow');
620             $objWriter->writeAttribute('rad', $majorGridlines->getGlowSize());
621             $objWriter->startElement("a:{$majorGridlines->getGlowColor('type')}");
622             $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('value'));
623             $objWriter->startElement('a:alpha');
624             $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('alpha'));
625             $objWriter->endElement(); //end alpha
626             $objWriter->endElement(); //end schemeClr
627             $objWriter->endElement(); //end glow
628         }
629
630         if (!is_null($majorGridlines->getShadowProperty('presets'))) {
631             $objWriter->startElement("a:{$majorGridlines->getShadowProperty('effect')}");
632             if (!is_null($majorGridlines->getShadowProperty('blur'))) {
633                 $objWriter->writeAttribute('blurRad', $majorGridlines->getShadowProperty('blur'));
634             }
635             if (!is_null($majorGridlines->getShadowProperty('distance'))) {
636                 $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance'));
637             }
638             if (!is_null($majorGridlines->getShadowProperty('direction'))) {
639                 $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction'));
640             }
641             if (!is_null($majorGridlines->getShadowProperty('algn'))) {
642                 $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn'));
643             }
644             if (!is_null($majorGridlines->getShadowProperty(array('size', 'sx')))) {
645                 $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(array('size', 'sx')));
646             }
647             if (!is_null($majorGridlines->getShadowProperty(array('size', 'sy')))) {
648                 $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(array('size', 'sy')));
649             }
650             if (!is_null($majorGridlines->getShadowProperty(array('size', 'kx')))) {
651                 $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(array('size', 'kx')));
652             }
653             if (!is_null($majorGridlines->getShadowProperty('rotWithShape'))) {
654                 $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape'));
655             }
656             $objWriter->startElement("a:{$majorGridlines->getShadowProperty(array('color', 'type'))}");
657             $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'value')));
658
659             $objWriter->startElement('a:alpha');
660             $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'alpha')));
661             $objWriter->endElement(); //end alpha
662
663             $objWriter->endElement(); //end color:type
664             $objWriter->endElement(); //end shadow
665         }
666
667         if (!is_null($majorGridlines->getSoftEdgesSize())) {
668             $objWriter->startElement('a:softEdge');
669             $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize());
670             $objWriter->endElement(); //end softEdge
671         }
672
673         $objWriter->endElement(); //end effectLst
674         $objWriter->endElement(); //end spPr
675         $objWriter->endElement(); //end majorGridLines
676
677         if ($minorGridlines->getObjectState()) {
678             $objWriter->startElement('c:minorGridlines');
679             $objWriter->startElement('c:spPr');
680
681             if (!is_null($minorGridlines->getLineColorProperty('value'))) {
682                 $objWriter->startElement('a:ln');
683                 $objWriter->writeAttribute('w', $minorGridlines->getLineStyleProperty('width'));
684                 $objWriter->startElement('a:solidFill');
685                 $objWriter->startElement("a:{$minorGridlines->getLineColorProperty('type')}");
686                 $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('value'));
687                 $objWriter->startElement('a:alpha');
688                 $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('alpha'));
689                 $objWriter->endElement(); //end alpha
690                 $objWriter->endElement(); //end srgbClr
691                 $objWriter->endElement(); //end solidFill
692
693                 $objWriter->startElement('a:prstDash');
694                 $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash'));
695                 $objWriter->endElement();
696
697                 if ($minorGridlines->getLineStyleProperty('join') == 'miter') {
698                     $objWriter->startElement('a:miter');
699                     $objWriter->writeAttribute('lim', '800000');
700                     $objWriter->endElement();
701                 } else {
702                     $objWriter->startElement('a:bevel');
703                     $objWriter->endElement();
704                 }
705
706                 if (!is_null($minorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')))) {
707                     $objWriter->startElement('a:headEnd');
708                     $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')));
709                     $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('head', 'w'));
710                     $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('head', 'len'));
711                     $objWriter->endElement();
712                 }
713
714                 if (!is_null($minorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')))) {
715                     $objWriter->startElement('a:tailEnd');
716                     $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')));
717                     $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('end', 'w'));
718                     $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('end', 'len'));
719                     $objWriter->endElement();
720                 }
721                 $objWriter->endElement(); //end ln
722             }
723
724             $objWriter->startElement('a:effectLst');
725
726             if (!is_null($minorGridlines->getGlowSize())) {
727                 $objWriter->startElement('a:glow');
728                 $objWriter->writeAttribute('rad', $minorGridlines->getGlowSize());
729                 $objWriter->startElement("a:{$minorGridlines->getGlowColor('type')}");
730                 $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('value'));
731                 $objWriter->startElement('a:alpha');
732                 $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('alpha'));
733                 $objWriter->endElement(); //end alpha
734                 $objWriter->endElement(); //end schemeClr
735                 $objWriter->endElement(); //end glow
736             }
737
738             if (!is_null($minorGridlines->getShadowProperty('presets'))) {
739                 $objWriter->startElement("a:{$minorGridlines->getShadowProperty('effect')}");
740                 if (!is_null($minorGridlines->getShadowProperty('blur'))) {
741                     $objWriter->writeAttribute('blurRad', $minorGridlines->getShadowProperty('blur'));
742                 }
743                 if (!is_null($minorGridlines->getShadowProperty('distance'))) {
744                     $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance'));
745                 }
746                 if (!is_null($minorGridlines->getShadowProperty('direction'))) {
747                     $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction'));
748                 }
749                 if (!is_null($minorGridlines->getShadowProperty('algn'))) {
750                     $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn'));
751                 }
752                 if (!is_null($minorGridlines->getShadowProperty(array('size', 'sx')))) {
753                     $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(array('size', 'sx')));
754                 }
755                 if (!is_null($minorGridlines->getShadowProperty(array('size', 'sy')))) {
756                     $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(array('size', 'sy')));
757                 }
758                 if (!is_null($minorGridlines->getShadowProperty(array('size', 'kx')))) {
759                     $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(array('size', 'kx')));
760                 }
761                 if (!is_null($minorGridlines->getShadowProperty('rotWithShape'))) {
762                     $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape'));
763                 }
764                 $objWriter->startElement("a:{$minorGridlines->getShadowProperty(array('color', 'type'))}");
765                 $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(array('color', 'value')));
766                 $objWriter->startElement('a:alpha');
767                 $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(array('color', 'alpha')));
768                 $objWriter->endElement(); //end alpha
769                 $objWriter->endElement(); //end color:type
770                 $objWriter->endElement(); //end shadow
771             }
772
773             if (!is_null($minorGridlines->getSoftEdgesSize())) {
774                 $objWriter->startElement('a:softEdge');
775                 $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize());
776                 $objWriter->endElement(); //end softEdge
777             }
778
779             $objWriter->endElement(); //end effectLst
780             $objWriter->endElement(); //end spPr
781             $objWriter->endElement(); //end minorGridLines
782         }
783
784         if (!is_null($yAxisLabel)) {
785             $objWriter->startElement('c:title');
786             $objWriter->startElement('c:tx');
787             $objWriter->startElement('c:rich');
788
789             $objWriter->startElement('a:bodyPr');
790             $objWriter->endElement();
791
792             $objWriter->startElement('a:lstStyle');
793             $objWriter->endElement();
794
795             $objWriter->startElement('a:p');
796             $objWriter->startElement('a:r');
797
798             $caption = $yAxisLabel->getCaption();
799             if (is_array($caption)) {
800                 $caption = $caption[0];
801             }
802
803             $objWriter->startElement('a:t');
804             //                                        $objWriter->writeAttribute('xml:space', 'preserve');
805             $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption));
806             $objWriter->endElement();
807
808             $objWriter->endElement();
809             $objWriter->endElement();
810             $objWriter->endElement();
811             $objWriter->endElement();
812
813             if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
814                 $layout = $yAxisLabel->getLayout();
815                 $this->writeLayout($layout, $objWriter);
816             }
817
818             $objWriter->startElement('c:overlay');
819             $objWriter->writeAttribute('val', 0);
820             $objWriter->endElement();
821
822             $objWriter->endElement();
823         }
824
825         $objWriter->startElement('c:numFmt');
826         $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat());
827         $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked());
828         $objWriter->endElement();
829
830         $objWriter->startElement('c:majorTickMark');
831         $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark'));
832         $objWriter->endElement();
833
834         $objWriter->startElement('c:minorTickMark');
835         $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark'));
836         $objWriter->endElement();
837
838         $objWriter->startElement('c:tickLblPos');
839         $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels'));
840         $objWriter->endElement();
841
842         $objWriter->startElement('c:spPr');
843
844         if (!is_null($xAxis->getFillProperty('value'))) {
845             $objWriter->startElement('a:solidFill');
846             $objWriter->startElement("a:" . $xAxis->getFillProperty('type'));
847             $objWriter->writeAttribute('val', $xAxis->getFillProperty('value'));
848             $objWriter->startElement('a:alpha');
849             $objWriter->writeAttribute('val', $xAxis->getFillProperty('alpha'));
850             $objWriter->endElement();
851             $objWriter->endElement();
852             $objWriter->endElement();
853         }
854
855         $objWriter->startElement('a:ln');
856
857         $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width'));
858         $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap'));
859         $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound'));
860
861         if (!is_null($xAxis->getLineProperty('value'))) {
862             $objWriter->startElement('a:solidFill');
863             $objWriter->startElement("a:" . $xAxis->getLineProperty('type'));
864             $objWriter->writeAttribute('val', $xAxis->getLineProperty('value'));
865             $objWriter->startElement('a:alpha');
866             $objWriter->writeAttribute('val', $xAxis->getLineProperty('alpha'));
867             $objWriter->endElement();
868             $objWriter->endElement();
869             $objWriter->endElement();
870         }
871
872         $objWriter->startElement('a:prstDash');
873         $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash'));
874         $objWriter->endElement();
875
876         if ($xAxis->getLineStyleProperty('join') == 'miter') {
877             $objWriter->startElement('a:miter');
878             $objWriter->writeAttribute('lim', '800000');
879             $objWriter->endElement();
880         } else {
881             $objWriter->startElement('a:bevel');
882             $objWriter->endElement();
883         }
884
885         if (!is_null($xAxis->getLineStyleProperty(array('arrow', 'head', 'type')))) {
886             $objWriter->startElement('a:headEnd');
887             $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(array('arrow', 'head', 'type')));
888             $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('head'));
889             $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('head'));
890             $objWriter->endElement();
891         }
892
893         if (!is_null($xAxis->getLineStyleProperty(array('arrow', 'end', 'type')))) {
894             $objWriter->startElement('a:tailEnd');
895             $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(array('arrow', 'end', 'type')));
896             $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('end'));
897             $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('end'));
898             $objWriter->endElement();
899         }
900
901         $objWriter->endElement();
902
903         $objWriter->startElement('a:effectLst');
904
905         if (!is_null($xAxis->getGlowProperty('size'))) {
906             $objWriter->startElement('a:glow');
907             $objWriter->writeAttribute('rad', $xAxis->getGlowProperty('size'));
908             $objWriter->startElement("a:{$xAxis->getGlowProperty(array('color','type'))}");
909             $objWriter->writeAttribute('val', $xAxis->getGlowProperty(array('color','value')));
910             $objWriter->startElement('a:alpha');
911             $objWriter->writeAttribute('val', $xAxis->getGlowProperty(array('color','alpha')));
912             $objWriter->endElement();
913             $objWriter->endElement();
914             $objWriter->endElement();
915         }
916
917         if (!is_null($xAxis->getShadowProperty('presets'))) {
918             $objWriter->startElement("a:{$xAxis->getShadowProperty('effect')}");
919
920             if (!is_null($xAxis->getShadowProperty('blur'))) {
921                 $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur'));
922             }
923             if (!is_null($xAxis->getShadowProperty('distance'))) {
924                 $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance'));
925             }
926             if (!is_null($xAxis->getShadowProperty('direction'))) {
927                 $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction'));
928             }
929             if (!is_null($xAxis->getShadowProperty('algn'))) {
930                 $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn'));
931             }
932             if (!is_null($xAxis->getShadowProperty(array('size','sx')))) {
933                 $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(array('size','sx')));
934             }
935             if (!is_null($xAxis->getShadowProperty(array('size','sy')))) {
936                 $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(array('size','sy')));
937             }
938             if (!is_null($xAxis->getShadowProperty(array('size','kx')))) {
939                 $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(array('size','kx')));
940             }
941             if (!is_null($xAxis->getShadowProperty('rotWithShape'))) {
942                 $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape'));
943             }
944
945             $objWriter->startElement("a:{$xAxis->getShadowProperty(array('color','type'))}");
946             $objWriter->writeAttribute('val', $xAxis->getShadowProperty(array('color','value')));
947             $objWriter->startElement('a:alpha');
948             $objWriter->writeAttribute('val', $xAxis->getShadowProperty(array('color','alpha')));
949             $objWriter->endElement();
950             $objWriter->endElement();
951
952             $objWriter->endElement();
953         }
954
955         if (!is_null($xAxis->getSoftEdgesSize())) {
956             $objWriter->startElement('a:softEdge');
957             $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize());
958             $objWriter->endElement();
959         }
960
961         $objWriter->endElement(); //effectList
962         $objWriter->endElement(); //end spPr
963
964         if ($id1 > 0) {
965             $objWriter->startElement('c:crossAx');
966             $objWriter->writeAttribute('val', $id2);
967             $objWriter->endElement();
968
969             if (!is_null($xAxis->getAxisOptionsProperty('horizontal_crosses_value'))) {
970                 $objWriter->startElement('c:crossesAt');
971                 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value'));
972                 $objWriter->endElement();
973             } else {
974                 $objWriter->startElement('c:crosses');
975                 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses'));
976                 $objWriter->endElement();
977             }
978
979             $objWriter->startElement('c:crossBetween');
980             $objWriter->writeAttribute('val', "midCat");
981             $objWriter->endElement();
982
983             if (!is_null($xAxis->getAxisOptionsProperty('major_unit'))) {
984                 $objWriter->startElement('c:majorUnit');
985                 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));
986                 $objWriter->endElement();
987             }
988
989             if (!is_null($xAxis->getAxisOptionsProperty('minor_unit'))) {
990                 $objWriter->startElement('c:minorUnit');
991                 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit'));
992                 $objWriter->endElement();
993             }
994         }
995
996         if ($isMultiLevelSeries) {
997             if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
998                 $objWriter->startElement('c:noMultiLvlLbl');
999                 $objWriter->writeAttribute('val', 0);
1000                 $objWriter->endElement();
1001             }
1002         }
1003
1004         $objWriter->endElement();
1005     }
1006
1007     /**
1008      * Get the data series type(s) for a chart plot series
1009      *
1010      * @param  PHPExcel_Chart_PlotArea $plotArea
1011      *
1012      * @return  string|array
1013      * @throws  PHPExcel_Writer_Exception
1014      */
1015     private static function getChartType($plotArea)
1016     {
1017         $groupCount = $plotArea->getPlotGroupCount();
1018
1019         if ($groupCount == 1) {
1020             $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType());
1021         } else {
1022             $chartTypes = array();
1023             for ($i = 0; $i < $groupCount; ++$i) {
1024                 $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType();
1025             }
1026             $chartType = array_unique($chartTypes);
1027             if (count($chartTypes) == 0) {
1028                 throw new PHPExcel_Writer_Exception('Chart is not yet implemented');
1029             }
1030         }
1031
1032         return $chartType;
1033     }
1034
1035     /**
1036      * Write Plot Group (series of related plots)
1037      *
1038      * @param  PHPExcel_Chart_DataSeries $plotGroup
1039      * @param  string $groupType Type of plot for dataseries
1040      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1041      * @param  boolean &$catIsMultiLevelSeries Is category a multi-series category
1042      * @param  boolean &$valIsMultiLevelSeries Is value set a multi-series set
1043      * @param  string &$plotGroupingType Type of grouping for multi-series values
1044      * @param  PHPExcel_Worksheet $pSheet
1045      *
1046      * @throws  PHPExcel_Writer_Exception
1047      */
1048     private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType, PHPExcel_Worksheet $pSheet)
1049     {
1050         if (is_null($plotGroup)) {
1051             return;
1052         }
1053
1054         if (($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) {
1055             $objWriter->startElement('c:barDir');
1056             $objWriter->writeAttribute('val', $plotGroup->getPlotDirection());
1057             $objWriter->endElement();
1058         }
1059
1060         if (!is_null($plotGroup->getPlotGrouping())) {
1061             $plotGroupingType = $plotGroup->getPlotGrouping();
1062             $objWriter->startElement('c:grouping');
1063             $objWriter->writeAttribute('val', $plotGroupingType);
1064             $objWriter->endElement();
1065         }
1066
1067         //    Get these details before the loop, because we can use the count to check for varyColors
1068         $plotSeriesOrder = $plotGroup->getPlotOrder();
1069         $plotSeriesCount = count($plotSeriesOrder);
1070
1071         if (($groupType !== PHPExcel_Chart_DataSeries::TYPE_RADARCHART) && ($groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) {
1072             if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
1073                 if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) {
1074                     $objWriter->startElement('c:varyColors');
1075                     $objWriter->writeAttribute('val', 1);
1076                     $objWriter->endElement();
1077                 } else {
1078                     $objWriter->startElement('c:varyColors');
1079                     $objWriter->writeAttribute('val', 0);
1080                     $objWriter->endElement();
1081                 }
1082             }
1083         }
1084
1085         foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
1086             $objWriter->startElement('c:ser');
1087
1088             $objWriter->startElement('c:idx');
1089             $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesIdx);
1090             $objWriter->endElement();
1091
1092             $objWriter->startElement('c:order');
1093             $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesRef);
1094             $objWriter->endElement();
1095
1096             if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
1097                 $objWriter->startElement('c:dPt');
1098                 $objWriter->startElement('c:idx');
1099                 $objWriter->writeAttribute('val', 3);
1100                 $objWriter->endElement();
1101
1102                 $objWriter->startElement('c:bubble3D');
1103                 $objWriter->writeAttribute('val', 0);
1104                 $objWriter->endElement();
1105
1106                 $objWriter->startElement('c:spPr');
1107                 $objWriter->startElement('a:solidFill');
1108                 $objWriter->startElement('a:srgbClr');
1109                 $objWriter->writeAttribute('val', 'FF9900');
1110                 $objWriter->endElement();
1111                 $objWriter->endElement();
1112                 $objWriter->endElement();
1113                 $objWriter->endElement();
1114             }
1115
1116             //    Labels
1117             $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef);
1118             if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) {
1119                 $objWriter->startElement('c:tx');
1120                 $objWriter->startElement('c:strRef');
1121                 $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter);
1122                 $objWriter->endElement();
1123                 $objWriter->endElement();
1124             }
1125
1126             //    Formatting for the points
1127             if (($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) {
1128                 $objWriter->startElement('c:spPr');
1129                 $objWriter->startElement('a:ln');
1130                 $objWriter->writeAttribute('w', 12700);
1131                 if ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
1132                     $objWriter->startElement('a:noFill');
1133                     $objWriter->endElement();
1134                 }
1135                 $objWriter->endElement();
1136                 $objWriter->endElement();
1137             }
1138
1139             $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef);
1140             if ($plotSeriesValues) {
1141                 $plotSeriesMarker = $plotSeriesValues->getPointMarker();
1142                 if ($plotSeriesMarker) {
1143                     $objWriter->startElement('c:marker');
1144                     $objWriter->startElement('c:symbol');
1145                     $objWriter->writeAttribute('val', $plotSeriesMarker);
1146                     $objWriter->endElement();
1147
1148                     if ($plotSeriesMarker !== 'none') {
1149                         $objWriter->startElement('c:size');
1150                         $objWriter->writeAttribute('val', 3);
1151                         $objWriter->endElement();
1152                     }
1153
1154                     $objWriter->endElement();
1155                 }
1156             }
1157
1158             if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART)) {
1159                 $objWriter->startElement('c:invertIfNegative');
1160                 $objWriter->writeAttribute('val', 0);
1161                 $objWriter->endElement();
1162             }
1163
1164             //    Category Labels
1165             $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef);
1166             if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) {
1167                 $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
1168
1169                 if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
1170                     if (!is_null($plotGroup->getPlotStyle())) {
1171                         $plotStyle = $plotGroup->getPlotStyle();
1172                         if ($plotStyle) {
1173                             $objWriter->startElement('c:explosion');
1174                             $objWriter->writeAttribute('val', 25);
1175                             $objWriter->endElement();
1176                         }
1177                     }
1178                 }
1179
1180                 if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {
1181                     $objWriter->startElement('c:xVal');
1182                 } else {
1183                     $objWriter->startElement('c:cat');
1184                 }
1185
1186                 $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str', $pSheet);
1187                 $objWriter->endElement();
1188             }
1189
1190             //    Values
1191             if ($plotSeriesValues) {
1192                 $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries();
1193
1194                 if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {
1195                     $objWriter->startElement('c:yVal');
1196                 } else {
1197                     $objWriter->startElement('c:val');
1198                 }
1199
1200                 $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num', $pSheet);
1201                 $objWriter->endElement();
1202             }
1203
1204             if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
1205                 $this->writeBubbles($plotSeriesValues, $objWriter, $pSheet);
1206             }
1207
1208             $objWriter->endElement();
1209         }
1210
1211         $this->_seriesIndex += $plotSeriesIdx + 1;
1212     }
1213
1214     /**
1215      * Write Plot Series Label
1216      *
1217      * @param  PHPExcel_Chart_DataSeriesValues $plotSeriesLabel
1218      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1219      *
1220      * @throws  PHPExcel_Writer_Exception
1221      */
1222     private function writePlotSeriesLabel($plotSeriesLabel, $objWriter)
1223     {
1224         if (is_null($plotSeriesLabel)) {
1225             return;
1226         }
1227
1228         $objWriter->startElement('c:f');
1229         $objWriter->writeRawData($plotSeriesLabel->getDataSource());
1230         $objWriter->endElement();
1231
1232         $objWriter->startElement('c:strCache');
1233         $objWriter->startElement('c:ptCount');
1234         $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount());
1235         $objWriter->endElement();
1236
1237         foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) {
1238             $objWriter->startElement('c:pt');
1239             $objWriter->writeAttribute('idx', $plotLabelKey);
1240
1241             $objWriter->startElement('c:v');
1242             $objWriter->writeRawData($plotLabelValue);
1243             $objWriter->endElement();
1244             $objWriter->endElement();
1245         }
1246         $objWriter->endElement();
1247     }
1248
1249     /**
1250      * Write Plot Series Values
1251      *
1252      * @param  PHPExcel_Chart_DataSeriesValues $plotSeriesValues
1253      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1254      * @param  string $groupType Type of plot for dataseries
1255      * @param  string $dataType Datatype of series values
1256      * @param  PHPExcel_Worksheet $pSheet
1257      *
1258      * @throws  PHPExcel_Writer_Exception
1259      */
1260     private function writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, $dataType = 'str', PHPExcel_Worksheet $pSheet)
1261     {
1262         if (is_null($plotSeriesValues)) {
1263             return;
1264         }
1265
1266         if ($plotSeriesValues->isMultiLevelSeries()) {
1267             $levelCount = $plotSeriesValues->multiLevelCount();
1268
1269             $objWriter->startElement('c:multiLvlStrRef');
1270
1271             $objWriter->startElement('c:f');
1272             $objWriter->writeRawData($plotSeriesValues->getDataSource());
1273             $objWriter->endElement();
1274
1275             $objWriter->startElement('c:multiLvlStrCache');
1276
1277             $objWriter->startElement('c:ptCount');
1278             $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1279             $objWriter->endElement();
1280
1281             for ($level = 0; $level < $levelCount; ++$level) {
1282                 $objWriter->startElement('c:lvl');
1283
1284                 foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
1285                     if (isset($plotSeriesValue[$level])) {
1286                         $objWriter->startElement('c:pt');
1287                         $objWriter->writeAttribute('idx', $plotSeriesKey);
1288
1289                         $objWriter->startElement('c:v');
1290                         $objWriter->writeRawData($plotSeriesValue[$level]);
1291                         $objWriter->endElement();
1292                         $objWriter->endElement();
1293                     }
1294                 }
1295
1296                 $objWriter->endElement();
1297             }
1298
1299             $objWriter->endElement();
1300
1301             $objWriter->endElement();
1302         } else {
1303             $objWriter->startElement('c:' . $dataType . 'Ref');
1304
1305             $objWriter->startElement('c:f');
1306             $objWriter->writeRawData($plotSeriesValues->getDataSource());
1307             $objWriter->endElement();
1308
1309             $objWriter->startElement('c:' . $dataType . 'Cache');
1310
1311             if (($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($groupType != PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
1312                 if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) {
1313                     $objWriter->startElement('c:formatCode');
1314                     $objWriter->writeRawData($plotSeriesValues->getFormatCode());
1315                     $objWriter->endElement();
1316                 }
1317             }
1318
1319             $objWriter->startElement('c:ptCount');
1320             $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1321             $objWriter->endElement();
1322
1323             $dataValues = $plotSeriesValues->getDataValues();
1324             if (!empty($dataValues)) {
1325                 if (is_array($dataValues)) {
1326                     foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {
1327                         $objWriter->startElement('c:pt');
1328                         $objWriter->writeAttribute('idx', $plotSeriesKey);
1329
1330                         $objWriter->startElement('c:v');
1331                         $objWriter->writeRawData($plotSeriesValue);
1332                         $objWriter->endElement();
1333                         $objWriter->endElement();
1334                     }
1335                 }
1336             }
1337
1338             $objWriter->endElement();
1339
1340             $objWriter->endElement();
1341         }
1342     }
1343
1344     /**
1345      * Write Bubble Chart Details
1346      *
1347      * @param  PHPExcel_Chart_DataSeriesValues $plotSeriesValues
1348      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1349      *
1350      * @throws  PHPExcel_Writer_Exception
1351      */
1352     private function writeBubbles($plotSeriesValues, $objWriter, PHPExcel_Worksheet $pSheet)
1353     {
1354         if (is_null($plotSeriesValues)) {
1355             return;
1356         }
1357
1358         $objWriter->startElement('c:bubbleSize');
1359         $objWriter->startElement('c:numLit');
1360
1361         $objWriter->startElement('c:formatCode');
1362         $objWriter->writeRawData('General');
1363         $objWriter->endElement();
1364
1365         $objWriter->startElement('c:ptCount');
1366         $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1367         $objWriter->endElement();
1368
1369         $dataValues = $plotSeriesValues->getDataValues();
1370         if (!empty($dataValues)) {
1371             if (is_array($dataValues)) {
1372                 foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) {
1373                     $objWriter->startElement('c:pt');
1374                     $objWriter->writeAttribute('idx', $plotSeriesKey);
1375                     $objWriter->startElement('c:v');
1376                     $objWriter->writeRawData(1);
1377                     $objWriter->endElement();
1378                     $objWriter->endElement();
1379                 }
1380             }
1381         }
1382
1383         $objWriter->endElement();
1384         $objWriter->endElement();
1385
1386         $objWriter->startElement('c:bubble3D');
1387         $objWriter->writeAttribute('val', 0);
1388         $objWriter->endElement();
1389     }
1390
1391     /**
1392      * Write Layout
1393      *
1394      * @param  PHPExcel_Chart_Layout $layout
1395      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1396      *
1397      * @throws  PHPExcel_Writer_Exception
1398      */
1399     private function writeLayout(PHPExcel_Chart_Layout $layout = null, $objWriter)
1400     {
1401         $objWriter->startElement('c:layout');
1402
1403         if (!is_null($layout)) {
1404             $objWriter->startElement('c:manualLayout');
1405
1406             $layoutTarget = $layout->getLayoutTarget();
1407             if (!is_null($layoutTarget)) {
1408                 $objWriter->startElement('c:layoutTarget');
1409                 $objWriter->writeAttribute('val', $layoutTarget);
1410                 $objWriter->endElement();
1411             }
1412
1413             $xMode = $layout->getXMode();
1414             if (!is_null($xMode)) {
1415                 $objWriter->startElement('c:xMode');
1416                 $objWriter->writeAttribute('val', $xMode);
1417                 $objWriter->endElement();
1418             }
1419
1420             $yMode = $layout->getYMode();
1421             if (!is_null($yMode)) {
1422                 $objWriter->startElement('c:yMode');
1423                 $objWriter->writeAttribute('val', $yMode);
1424                 $objWriter->endElement();
1425             }
1426
1427             $x = $layout->getXPosition();
1428             if (!is_null($x)) {
1429                 $objWriter->startElement('c:x');
1430                 $objWriter->writeAttribute('val', $x);
1431                 $objWriter->endElement();
1432             }
1433
1434             $y = $layout->getYPosition();
1435             if (!is_null($y)) {
1436                 $objWriter->startElement('c:y');
1437                 $objWriter->writeAttribute('val', $y);
1438                 $objWriter->endElement();
1439             }
1440
1441             $w = $layout->getWidth();
1442             if (!is_null($w)) {
1443                 $objWriter->startElement('c:w');
1444                 $objWriter->writeAttribute('val', $w);
1445                 $objWriter->endElement();
1446             }
1447
1448             $h = $layout->getHeight();
1449             if (!is_null($h)) {
1450                 $objWriter->startElement('c:h');
1451                 $objWriter->writeAttribute('val', $h);
1452                 $objWriter->endElement();
1453             }
1454
1455             $objWriter->endElement();
1456         }
1457
1458         $objWriter->endElement();
1459     }
1460
1461     /**
1462      * Write Alternate Content block
1463      *
1464      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1465      *
1466      * @throws  PHPExcel_Writer_Exception
1467      */
1468     private function writeAlternateContent($objWriter)
1469     {
1470         $objWriter->startElement('mc:AlternateContent');
1471         $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
1472
1473         $objWriter->startElement('mc:Choice');
1474         $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart');
1475         $objWriter->writeAttribute('Requires', 'c14');
1476
1477         $objWriter->startElement('c14:style');
1478         $objWriter->writeAttribute('val', '102');
1479         $objWriter->endElement();
1480         $objWriter->endElement();
1481
1482         $objWriter->startElement('mc:Fallback');
1483         $objWriter->startElement('c:style');
1484         $objWriter->writeAttribute('val', '2');
1485         $objWriter->endElement();
1486         $objWriter->endElement();
1487
1488         $objWriter->endElement();
1489     }
1490
1491     /**
1492      * Write Printer Settings
1493      *
1494      * @param  PHPExcel_Shared_XMLWriter $objWriter XML Writer
1495      *
1496      * @throws  PHPExcel_Writer_Exception
1497      */
1498     private function writePrintSettings($objWriter)
1499     {
1500         $objWriter->startElement('c:printSettings');
1501
1502         $objWriter->startElement('c:headerFooter');
1503         $objWriter->endElement();
1504
1505         $objWriter->startElement('c:pageMargins');
1506         $objWriter->writeAttribute('footer', 0.3);
1507         $objWriter->writeAttribute('header', 0.3);
1508         $objWriter->writeAttribute('r', 0.7);
1509         $objWriter->writeAttribute('l', 0.7);
1510         $objWriter->writeAttribute('t', 0.75);
1511         $objWriter->writeAttribute('b', 0.75);
1512         $objWriter->endElement();
1513
1514         $objWriter->startElement('c:pageSetup');
1515         $objWriter->writeAttribute('orientation', "portrait");
1516         $objWriter->endElement();
1517
1518         $objWriter->endElement();
1519     }
1520 }