4 * PHPExcel_Writer_Excel2007_Chart
6 * Copyright (c) 2006 - 2015 PHPExcel
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.
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.
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
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##
28 class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart
30 protected $calculateCellValues;
33 * Write charts to XML format
35 * @param PHPExcel_Chart $pChart
37 * @return string XML Output
38 * @throws PHPExcel_Writer_Exception
40 public function writeChart(PHPExcel_Chart $pChart = null, $calculateCellValues = true)
42 $this->calculateCellValues = $calculateCellValues;
46 if ($this->getParentWriter()->getUseDiskCaching()) {
47 $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
49 $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
51 // Ensure that data series values are up-to-date before we save
52 if ($this->calculateCellValues) {
57 $objWriter->startDocument('1.0', 'UTF-8', 'yes');
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');
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();
75 $this->writeAlternateContent($objWriter);
77 $objWriter->startElement('c:chart');
79 $this->writeTitle($pChart->getTitle(), $objWriter);
81 $objWriter->startElement('c:autoTitleDeleted');
82 $objWriter->writeAttribute('val', 0);
83 $objWriter->endElement();
85 $this->writePlotArea($pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $objWriter, $pChart->getWorksheet(), $pChart->getChartAxisX(), $pChart->getChartAxisY(), $pChart->getMajorGridlines(), $pChart->getMinorGridlines());
87 $this->writeLegend($pChart->getLegend(), $objWriter);
89 $objWriter->startElement('c:plotVisOnly');
90 $objWriter->writeAttribute('val', 1);
91 $objWriter->endElement();
93 $objWriter->startElement('c:dispBlanksAs');
94 $objWriter->writeAttribute('val', "gap");
95 $objWriter->endElement();
97 $objWriter->startElement('c:showDLblsOverMax');
98 $objWriter->writeAttribute('val', 0);
99 $objWriter->endElement();
101 $objWriter->endElement();
103 $this->writePrintSettings($objWriter);
105 $objWriter->endElement();
108 return $objWriter->getData();
114 * @param PHPExcel_Chart_Title $title
115 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
117 * @throws PHPExcel_Writer_Exception
119 private function writeTitle(PHPExcel_Chart_Title $title = null, $objWriter)
121 if (is_null($title)) {
125 $objWriter->startElement('c:title');
126 $objWriter->startElement('c:tx');
127 $objWriter->startElement('c:rich');
129 $objWriter->startElement('a:bodyPr');
130 $objWriter->endElement();
132 $objWriter->startElement('a:lstStyle');
133 $objWriter->endElement();
135 $objWriter->startElement('a:p');
137 $caption = $title->getCaption();
138 if ((is_array($caption)) && (count($caption) > 0)) {
139 $caption = $caption[0];
141 $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a');
143 $objWriter->endElement();
144 $objWriter->endElement();
145 $objWriter->endElement();
147 $this->writeLayout($title->getLayout(), $objWriter);
149 $objWriter->startElement('c:overlay');
150 $objWriter->writeAttribute('val', 0);
151 $objWriter->endElement();
153 $objWriter->endElement();
159 * @param PHPExcel_Chart_Legend $legend
160 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
162 * @throws PHPExcel_Writer_Exception
164 private function writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter)
166 if (is_null($legend)) {
170 $objWriter->startElement('c:legend');
172 $objWriter->startElement('c:legendPos');
173 $objWriter->writeAttribute('val', $legend->getPosition());
174 $objWriter->endElement();
176 $this->writeLayout($legend->getLayout(), $objWriter);
178 $objWriter->startElement('c:overlay');
179 $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0');
180 $objWriter->endElement();
182 $objWriter->startElement('c:txPr');
183 $objWriter->startElement('a:bodyPr');
184 $objWriter->endElement();
186 $objWriter->startElement('a:lstStyle');
187 $objWriter->endElement();
189 $objWriter->startElement('a:p');
190 $objWriter->startElement('a:pPr');
191 $objWriter->writeAttribute('rtl', 0);
193 $objWriter->startElement('a:defRPr');
194 $objWriter->endElement();
195 $objWriter->endElement();
197 $objWriter->startElement('a:endParaRPr');
198 $objWriter->writeAttribute('lang', "en-US");
199 $objWriter->endElement();
201 $objWriter->endElement();
202 $objWriter->endElement();
204 $objWriter->endElement();
208 * Write Chart Plot Area
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
217 * @throws PHPExcel_Writer_Exception
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)
221 if (is_null($plotArea)) {
226 $this->_seriesIndex = 0;
227 $objWriter->startElement('c:plotArea');
229 $layout = $plotArea->getLayout();
231 $this->writeLayout($layout, $objWriter);
233 $chartTypes = self::getChartType($plotArea);
234 $catIsMultiLevelSeries = $valIsMultiLevelSeries = false;
235 $plotGroupingType = '';
236 foreach ($chartTypes as $chartType) {
237 $objWriter->startElement('c:' . $chartType);
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();
255 $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType, $pSheet);
259 $this->writeDataLabels($objWriter, $layout);
261 if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
262 // Line only, Line3D can't be smoothed
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();
272 if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') {
273 $objWriter->startElement('c:overlap');
274 $objWriter->writeAttribute('val', 100);
275 $objWriter->endElement();
277 } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
278 $objWriter->startElement('c:bubbleScale');
279 $objWriter->writeAttribute('val', 25);
280 $objWriter->endElement();
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();
289 $objWriter->startElement('c:upDownBars');
291 $objWriter->startElement('c:gapWidth');
292 $objWriter->writeAttribute('val', 300);
293 $objWriter->endElement();
295 $objWriter->startElement('c:upBars');
296 $objWriter->endElement();
298 $objWriter->startElement('c:downBars');
299 $objWriter->endElement();
301 $objWriter->endElement();
304 // Generate 2 unique numbers to use for axId values
305 // $id1 = $id2 = rand(10000000,99999999);
307 // $id2 = rand(10000000,99999999);
308 // } while ($id1 == $id2);
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();
320 $objWriter->startElement('c:firstSliceAng');
321 $objWriter->writeAttribute('val', 0);
322 $objWriter->endElement();
324 if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) {
325 $objWriter->startElement('c:holeSize');
326 $objWriter->writeAttribute('val', 50);
327 $objWriter->endElement();
331 $objWriter->endElement();
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);
338 $this->writeCategoryAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis);
341 $this->writeValueAxis($objWriter, $plotArea, $yAxisLabel, $chartType, $id1, $id2, $valIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines);
344 $objWriter->endElement();
350 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
351 * @param PHPExcel_Chart_Layout $chartLayout Chart layout
353 * @throws PHPExcel_Writer_Exception
355 private function writeDataLabels($objWriter, $chartLayout)
357 $objWriter->startElement('c:dLbls');
359 $objWriter->startElement('c:showLegendKey');
360 $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey();
361 $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1));
362 $objWriter->endElement();
364 $objWriter->startElement('c:showVal');
365 $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal();
366 $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1));
367 $objWriter->endElement();
369 $objWriter->startElement('c:showCatName');
370 $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName();
371 $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1));
372 $objWriter->endElement();
374 $objWriter->startElement('c:showSerName');
375 $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName();
376 $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1));
377 $objWriter->endElement();
379 $objWriter->startElement('c:showPercent');
380 $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent();
381 $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1));
382 $objWriter->endElement();
384 $objWriter->startElement('c:showBubbleSize');
385 $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize();
386 $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1));
387 $objWriter->endElement();
389 $objWriter->startElement('c:showLeaderLines');
390 $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines();
391 $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1));
392 $objWriter->endElement();
394 $objWriter->endElement();
398 * Write Category Axis
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
406 * @param boolean $isMultiLevelSeries
408 * @throws PHPExcel_Writer_Exception
410 private function writeCategoryAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis)
412 $objWriter->startElement('c:catAx');
415 $objWriter->startElement('c:axId');
416 $objWriter->writeAttribute('val', $id1);
417 $objWriter->endElement();
420 $objWriter->startElement('c:scaling');
421 $objWriter->startElement('c:orientation');
422 $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation'));
423 $objWriter->endElement();
424 $objWriter->endElement();
426 $objWriter->startElement('c:delete');
427 $objWriter->writeAttribute('val', 0);
428 $objWriter->endElement();
430 $objWriter->startElement('c:axPos');
431 $objWriter->writeAttribute('val', "b");
432 $objWriter->endElement();
434 if (!is_null($xAxisLabel)) {
435 $objWriter->startElement('c:title');
436 $objWriter->startElement('c:tx');
437 $objWriter->startElement('c:rich');
439 $objWriter->startElement('a:bodyPr');
440 $objWriter->endElement();
442 $objWriter->startElement('a:lstStyle');
443 $objWriter->endElement();
445 $objWriter->startElement('a:p');
446 $objWriter->startElement('a:r');
448 $caption = $xAxisLabel->getCaption();
449 if (is_array($caption)) {
450 $caption = $caption[0];
452 $objWriter->startElement('a:t');
453 // $objWriter->writeAttribute('xml:space', 'preserve');
454 $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption));
455 $objWriter->endElement();
457 $objWriter->endElement();
458 $objWriter->endElement();
459 $objWriter->endElement();
460 $objWriter->endElement();
462 $layout = $xAxisLabel->getLayout();
463 $this->writeLayout($layout, $objWriter);
465 $objWriter->startElement('c:overlay');
466 $objWriter->writeAttribute('val', 0);
467 $objWriter->endElement();
469 $objWriter->endElement();
472 $objWriter->startElement('c:numFmt');
473 $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat());
474 $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked());
475 $objWriter->endElement();
477 $objWriter->startElement('c:majorTickMark');
478 $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark'));
479 $objWriter->endElement();
481 $objWriter->startElement('c:minorTickMark');
482 $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark'));
483 $objWriter->endElement();
485 $objWriter->startElement('c:tickLblPos');
486 $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels'));
487 $objWriter->endElement();
490 $objWriter->startElement('c:crossAx');
491 $objWriter->writeAttribute('val', $id2);
492 $objWriter->endElement();
494 $objWriter->startElement('c:crosses');
495 $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses'));
496 $objWriter->endElement();
499 $objWriter->startElement('c:auto');
500 $objWriter->writeAttribute('val', 1);
501 $objWriter->endElement();
503 $objWriter->startElement('c:lblAlgn');
504 $objWriter->writeAttribute('val', "ctr");
505 $objWriter->endElement();
507 $objWriter->startElement('c:lblOffset');
508 $objWriter->writeAttribute('val', 100);
509 $objWriter->endElement();
511 if ($isMultiLevelSeries) {
512 $objWriter->startElement('c:noMultiLvlLbl');
513 $objWriter->writeAttribute('val', 0);
514 $objWriter->endElement();
516 $objWriter->endElement();
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
528 * @param boolean $isMultiLevelSeries
530 * @throws PHPExcel_Writer_Exception
532 private function writeValueAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines)
534 $objWriter->startElement('c:valAx');
537 $objWriter->startElement('c:axId');
538 $objWriter->writeAttribute('val', $id2);
539 $objWriter->endElement();
542 $objWriter->startElement('c:scaling');
544 if (!is_null($xAxis->getAxisOptionsProperty('maximum'))) {
545 $objWriter->startElement('c:max');
546 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum'));
547 $objWriter->endElement();
550 if (!is_null($xAxis->getAxisOptionsProperty('minimum'))) {
551 $objWriter->startElement('c:min');
552 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum'));
553 $objWriter->endElement();
556 $objWriter->startElement('c:orientation');
557 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation'));
560 $objWriter->endElement();
561 $objWriter->endElement();
563 $objWriter->startElement('c:delete');
564 $objWriter->writeAttribute('val', 0);
565 $objWriter->endElement();
567 $objWriter->startElement('c:axPos');
568 $objWriter->writeAttribute('val', "l");
569 $objWriter->endElement();
571 $objWriter->startElement('c:majorGridlines');
572 $objWriter->startElement('c:spPr');
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
586 $objWriter->startElement('a:prstDash');
587 $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash'));
588 $objWriter->endElement();
590 if ($majorGridlines->getLineStyleProperty('join') == 'miter') {
591 $objWriter->startElement('a:miter');
592 $objWriter->writeAttribute('lim', '800000');
593 $objWriter->endElement();
595 $objWriter->startElement('a:bevel');
596 $objWriter->endElement();
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();
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();
614 $objWriter->endElement(); //end ln
616 $objWriter->startElement('a:effectLst');
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
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'));
635 if (!is_null($majorGridlines->getShadowProperty('distance'))) {
636 $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance'));
638 if (!is_null($majorGridlines->getShadowProperty('direction'))) {
639 $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction'));
641 if (!is_null($majorGridlines->getShadowProperty('algn'))) {
642 $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn'));
644 if (!is_null($majorGridlines->getShadowProperty(array('size', 'sx')))) {
645 $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(array('size', 'sx')));
647 if (!is_null($majorGridlines->getShadowProperty(array('size', 'sy')))) {
648 $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(array('size', 'sy')));
650 if (!is_null($majorGridlines->getShadowProperty(array('size', 'kx')))) {
651 $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(array('size', 'kx')));
653 if (!is_null($majorGridlines->getShadowProperty('rotWithShape'))) {
654 $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape'));
656 $objWriter->startElement("a:{$majorGridlines->getShadowProperty(array('color', 'type'))}");
657 $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'value')));
659 $objWriter->startElement('a:alpha');
660 $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'alpha')));
661 $objWriter->endElement(); //end alpha
663 $objWriter->endElement(); //end color:type
664 $objWriter->endElement(); //end shadow
667 if (!is_null($majorGridlines->getSoftEdgesSize())) {
668 $objWriter->startElement('a:softEdge');
669 $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize());
670 $objWriter->endElement(); //end softEdge
673 $objWriter->endElement(); //end effectLst
674 $objWriter->endElement(); //end spPr
675 $objWriter->endElement(); //end majorGridLines
677 if ($minorGridlines->getObjectState()) {
678 $objWriter->startElement('c:minorGridlines');
679 $objWriter->startElement('c:spPr');
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
693 $objWriter->startElement('a:prstDash');
694 $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash'));
695 $objWriter->endElement();
697 if ($minorGridlines->getLineStyleProperty('join') == 'miter') {
698 $objWriter->startElement('a:miter');
699 $objWriter->writeAttribute('lim', '800000');
700 $objWriter->endElement();
702 $objWriter->startElement('a:bevel');
703 $objWriter->endElement();
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();
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();
721 $objWriter->endElement(); //end ln
724 $objWriter->startElement('a:effectLst');
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
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'));
743 if (!is_null($minorGridlines->getShadowProperty('distance'))) {
744 $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance'));
746 if (!is_null($minorGridlines->getShadowProperty('direction'))) {
747 $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction'));
749 if (!is_null($minorGridlines->getShadowProperty('algn'))) {
750 $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn'));
752 if (!is_null($minorGridlines->getShadowProperty(array('size', 'sx')))) {
753 $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(array('size', 'sx')));
755 if (!is_null($minorGridlines->getShadowProperty(array('size', 'sy')))) {
756 $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(array('size', 'sy')));
758 if (!is_null($minorGridlines->getShadowProperty(array('size', 'kx')))) {
759 $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(array('size', 'kx')));
761 if (!is_null($minorGridlines->getShadowProperty('rotWithShape'))) {
762 $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape'));
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
773 if (!is_null($minorGridlines->getSoftEdgesSize())) {
774 $objWriter->startElement('a:softEdge');
775 $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize());
776 $objWriter->endElement(); //end softEdge
779 $objWriter->endElement(); //end effectLst
780 $objWriter->endElement(); //end spPr
781 $objWriter->endElement(); //end minorGridLines
784 if (!is_null($yAxisLabel)) {
785 $objWriter->startElement('c:title');
786 $objWriter->startElement('c:tx');
787 $objWriter->startElement('c:rich');
789 $objWriter->startElement('a:bodyPr');
790 $objWriter->endElement();
792 $objWriter->startElement('a:lstStyle');
793 $objWriter->endElement();
795 $objWriter->startElement('a:p');
796 $objWriter->startElement('a:r');
798 $caption = $yAxisLabel->getCaption();
799 if (is_array($caption)) {
800 $caption = $caption[0];
803 $objWriter->startElement('a:t');
804 // $objWriter->writeAttribute('xml:space', 'preserve');
805 $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption));
806 $objWriter->endElement();
808 $objWriter->endElement();
809 $objWriter->endElement();
810 $objWriter->endElement();
811 $objWriter->endElement();
813 if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
814 $layout = $yAxisLabel->getLayout();
815 $this->writeLayout($layout, $objWriter);
818 $objWriter->startElement('c:overlay');
819 $objWriter->writeAttribute('val', 0);
820 $objWriter->endElement();
822 $objWriter->endElement();
825 $objWriter->startElement('c:numFmt');
826 $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat());
827 $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked());
828 $objWriter->endElement();
830 $objWriter->startElement('c:majorTickMark');
831 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark'));
832 $objWriter->endElement();
834 $objWriter->startElement('c:minorTickMark');
835 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark'));
836 $objWriter->endElement();
838 $objWriter->startElement('c:tickLblPos');
839 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels'));
840 $objWriter->endElement();
842 $objWriter->startElement('c:spPr');
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();
855 $objWriter->startElement('a:ln');
857 $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width'));
858 $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap'));
859 $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound'));
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();
872 $objWriter->startElement('a:prstDash');
873 $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash'));
874 $objWriter->endElement();
876 if ($xAxis->getLineStyleProperty('join') == 'miter') {
877 $objWriter->startElement('a:miter');
878 $objWriter->writeAttribute('lim', '800000');
879 $objWriter->endElement();
881 $objWriter->startElement('a:bevel');
882 $objWriter->endElement();
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();
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();
901 $objWriter->endElement();
903 $objWriter->startElement('a:effectLst');
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();
917 if (!is_null($xAxis->getShadowProperty('presets'))) {
918 $objWriter->startElement("a:{$xAxis->getShadowProperty('effect')}");
920 if (!is_null($xAxis->getShadowProperty('blur'))) {
921 $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur'));
923 if (!is_null($xAxis->getShadowProperty('distance'))) {
924 $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance'));
926 if (!is_null($xAxis->getShadowProperty('direction'))) {
927 $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction'));
929 if (!is_null($xAxis->getShadowProperty('algn'))) {
930 $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn'));
932 if (!is_null($xAxis->getShadowProperty(array('size','sx')))) {
933 $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(array('size','sx')));
935 if (!is_null($xAxis->getShadowProperty(array('size','sy')))) {
936 $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(array('size','sy')));
938 if (!is_null($xAxis->getShadowProperty(array('size','kx')))) {
939 $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(array('size','kx')));
941 if (!is_null($xAxis->getShadowProperty('rotWithShape'))) {
942 $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape'));
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();
952 $objWriter->endElement();
955 if (!is_null($xAxis->getSoftEdgesSize())) {
956 $objWriter->startElement('a:softEdge');
957 $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize());
958 $objWriter->endElement();
961 $objWriter->endElement(); //effectList
962 $objWriter->endElement(); //end spPr
965 $objWriter->startElement('c:crossAx');
966 $objWriter->writeAttribute('val', $id2);
967 $objWriter->endElement();
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();
974 $objWriter->startElement('c:crosses');
975 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses'));
976 $objWriter->endElement();
979 $objWriter->startElement('c:crossBetween');
980 $objWriter->writeAttribute('val', "midCat");
981 $objWriter->endElement();
983 if (!is_null($xAxis->getAxisOptionsProperty('major_unit'))) {
984 $objWriter->startElement('c:majorUnit');
985 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit'));
986 $objWriter->endElement();
989 if (!is_null($xAxis->getAxisOptionsProperty('minor_unit'))) {
990 $objWriter->startElement('c:minorUnit');
991 $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit'));
992 $objWriter->endElement();
996 if ($isMultiLevelSeries) {
997 if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
998 $objWriter->startElement('c:noMultiLvlLbl');
999 $objWriter->writeAttribute('val', 0);
1000 $objWriter->endElement();
1004 $objWriter->endElement();
1008 * Get the data series type(s) for a chart plot series
1010 * @param PHPExcel_Chart_PlotArea $plotArea
1012 * @return string|array
1013 * @throws PHPExcel_Writer_Exception
1015 private static function getChartType($plotArea)
1017 $groupCount = $plotArea->getPlotGroupCount();
1019 if ($groupCount == 1) {
1020 $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType());
1022 $chartTypes = array();
1023 for ($i = 0; $i < $groupCount; ++$i) {
1024 $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType();
1026 $chartType = array_unique($chartTypes);
1027 if (count($chartTypes) == 0) {
1028 throw new PHPExcel_Writer_Exception('Chart is not yet implemented');
1036 * Write Plot Group (series of related plots)
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
1046 * @throws PHPExcel_Writer_Exception
1048 private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType, PHPExcel_Worksheet $pSheet)
1050 if (is_null($plotGroup)) {
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();
1060 if (!is_null($plotGroup->getPlotGrouping())) {
1061 $plotGroupingType = $plotGroup->getPlotGrouping();
1062 $objWriter->startElement('c:grouping');
1063 $objWriter->writeAttribute('val', $plotGroupingType);
1064 $objWriter->endElement();
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);
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();
1078 $objWriter->startElement('c:varyColors');
1079 $objWriter->writeAttribute('val', 0);
1080 $objWriter->endElement();
1085 foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
1086 $objWriter->startElement('c:ser');
1088 $objWriter->startElement('c:idx');
1089 $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesIdx);
1090 $objWriter->endElement();
1092 $objWriter->startElement('c:order');
1093 $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesRef);
1094 $objWriter->endElement();
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();
1102 $objWriter->startElement('c:bubble3D');
1103 $objWriter->writeAttribute('val', 0);
1104 $objWriter->endElement();
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();
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();
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();
1135 $objWriter->endElement();
1136 $objWriter->endElement();
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();
1148 if ($plotSeriesMarker !== 'none') {
1149 $objWriter->startElement('c:size');
1150 $objWriter->writeAttribute('val', 3);
1151 $objWriter->endElement();
1154 $objWriter->endElement();
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();
1165 $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef);
1166 if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) {
1167 $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
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();
1173 $objWriter->startElement('c:explosion');
1174 $objWriter->writeAttribute('val', 25);
1175 $objWriter->endElement();
1180 if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {
1181 $objWriter->startElement('c:xVal');
1183 $objWriter->startElement('c:cat');
1186 $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str', $pSheet);
1187 $objWriter->endElement();
1191 if ($plotSeriesValues) {
1192 $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries();
1194 if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {
1195 $objWriter->startElement('c:yVal');
1197 $objWriter->startElement('c:val');
1200 $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num', $pSheet);
1201 $objWriter->endElement();
1204 if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
1205 $this->writeBubbles($plotSeriesValues, $objWriter, $pSheet);
1208 $objWriter->endElement();
1211 $this->_seriesIndex += $plotSeriesIdx + 1;
1215 * Write Plot Series Label
1217 * @param PHPExcel_Chart_DataSeriesValues $plotSeriesLabel
1218 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
1220 * @throws PHPExcel_Writer_Exception
1222 private function writePlotSeriesLabel($plotSeriesLabel, $objWriter)
1224 if (is_null($plotSeriesLabel)) {
1228 $objWriter->startElement('c:f');
1229 $objWriter->writeRawData($plotSeriesLabel->getDataSource());
1230 $objWriter->endElement();
1232 $objWriter->startElement('c:strCache');
1233 $objWriter->startElement('c:ptCount');
1234 $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount());
1235 $objWriter->endElement();
1237 foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) {
1238 $objWriter->startElement('c:pt');
1239 $objWriter->writeAttribute('idx', $plotLabelKey);
1241 $objWriter->startElement('c:v');
1242 $objWriter->writeRawData($plotLabelValue);
1243 $objWriter->endElement();
1244 $objWriter->endElement();
1246 $objWriter->endElement();
1250 * Write Plot Series Values
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
1258 * @throws PHPExcel_Writer_Exception
1260 private function writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, $dataType = 'str', PHPExcel_Worksheet $pSheet)
1262 if (is_null($plotSeriesValues)) {
1266 if ($plotSeriesValues->isMultiLevelSeries()) {
1267 $levelCount = $plotSeriesValues->multiLevelCount();
1269 $objWriter->startElement('c:multiLvlStrRef');
1271 $objWriter->startElement('c:f');
1272 $objWriter->writeRawData($plotSeriesValues->getDataSource());
1273 $objWriter->endElement();
1275 $objWriter->startElement('c:multiLvlStrCache');
1277 $objWriter->startElement('c:ptCount');
1278 $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1279 $objWriter->endElement();
1281 for ($level = 0; $level < $levelCount; ++$level) {
1282 $objWriter->startElement('c:lvl');
1284 foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
1285 if (isset($plotSeriesValue[$level])) {
1286 $objWriter->startElement('c:pt');
1287 $objWriter->writeAttribute('idx', $plotSeriesKey);
1289 $objWriter->startElement('c:v');
1290 $objWriter->writeRawData($plotSeriesValue[$level]);
1291 $objWriter->endElement();
1292 $objWriter->endElement();
1296 $objWriter->endElement();
1299 $objWriter->endElement();
1301 $objWriter->endElement();
1303 $objWriter->startElement('c:' . $dataType . 'Ref');
1305 $objWriter->startElement('c:f');
1306 $objWriter->writeRawData($plotSeriesValues->getDataSource());
1307 $objWriter->endElement();
1309 $objWriter->startElement('c:' . $dataType . 'Cache');
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();
1319 $objWriter->startElement('c:ptCount');
1320 $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1321 $objWriter->endElement();
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);
1330 $objWriter->startElement('c:v');
1331 $objWriter->writeRawData($plotSeriesValue);
1332 $objWriter->endElement();
1333 $objWriter->endElement();
1338 $objWriter->endElement();
1340 $objWriter->endElement();
1345 * Write Bubble Chart Details
1347 * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues
1348 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
1350 * @throws PHPExcel_Writer_Exception
1352 private function writeBubbles($plotSeriesValues, $objWriter, PHPExcel_Worksheet $pSheet)
1354 if (is_null($plotSeriesValues)) {
1358 $objWriter->startElement('c:bubbleSize');
1359 $objWriter->startElement('c:numLit');
1361 $objWriter->startElement('c:formatCode');
1362 $objWriter->writeRawData('General');
1363 $objWriter->endElement();
1365 $objWriter->startElement('c:ptCount');
1366 $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount());
1367 $objWriter->endElement();
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();
1383 $objWriter->endElement();
1384 $objWriter->endElement();
1386 $objWriter->startElement('c:bubble3D');
1387 $objWriter->writeAttribute('val', 0);
1388 $objWriter->endElement();
1394 * @param PHPExcel_Chart_Layout $layout
1395 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
1397 * @throws PHPExcel_Writer_Exception
1399 private function writeLayout(PHPExcel_Chart_Layout $layout = null, $objWriter)
1401 $objWriter->startElement('c:layout');
1403 if (!is_null($layout)) {
1404 $objWriter->startElement('c:manualLayout');
1406 $layoutTarget = $layout->getLayoutTarget();
1407 if (!is_null($layoutTarget)) {
1408 $objWriter->startElement('c:layoutTarget');
1409 $objWriter->writeAttribute('val', $layoutTarget);
1410 $objWriter->endElement();
1413 $xMode = $layout->getXMode();
1414 if (!is_null($xMode)) {
1415 $objWriter->startElement('c:xMode');
1416 $objWriter->writeAttribute('val', $xMode);
1417 $objWriter->endElement();
1420 $yMode = $layout->getYMode();
1421 if (!is_null($yMode)) {
1422 $objWriter->startElement('c:yMode');
1423 $objWriter->writeAttribute('val', $yMode);
1424 $objWriter->endElement();
1427 $x = $layout->getXPosition();
1429 $objWriter->startElement('c:x');
1430 $objWriter->writeAttribute('val', $x);
1431 $objWriter->endElement();
1434 $y = $layout->getYPosition();
1436 $objWriter->startElement('c:y');
1437 $objWriter->writeAttribute('val', $y);
1438 $objWriter->endElement();
1441 $w = $layout->getWidth();
1443 $objWriter->startElement('c:w');
1444 $objWriter->writeAttribute('val', $w);
1445 $objWriter->endElement();
1448 $h = $layout->getHeight();
1450 $objWriter->startElement('c:h');
1451 $objWriter->writeAttribute('val', $h);
1452 $objWriter->endElement();
1455 $objWriter->endElement();
1458 $objWriter->endElement();
1462 * Write Alternate Content block
1464 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
1466 * @throws PHPExcel_Writer_Exception
1468 private function writeAlternateContent($objWriter)
1470 $objWriter->startElement('mc:AlternateContent');
1471 $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
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');
1477 $objWriter->startElement('c14:style');
1478 $objWriter->writeAttribute('val', '102');
1479 $objWriter->endElement();
1480 $objWriter->endElement();
1482 $objWriter->startElement('mc:Fallback');
1483 $objWriter->startElement('c:style');
1484 $objWriter->writeAttribute('val', '2');
1485 $objWriter->endElement();
1486 $objWriter->endElement();
1488 $objWriter->endElement();
1492 * Write Printer Settings
1494 * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
1496 * @throws PHPExcel_Writer_Exception
1498 private function writePrintSettings($objWriter)
1500 $objWriter->startElement('c:printSettings');
1502 $objWriter->startElement('c:headerFooter');
1503 $objWriter->endElement();
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();
1514 $objWriter->startElement('c:pageSetup');
1515 $objWriter->writeAttribute('orientation', "portrait");
1516 $objWriter->endElement();
1518 $objWriter->endElement();