[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/phpexcel/PHPExcel/Writer/Excel2007/ -> Chart.php (source)

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


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1