PageRenderTime 58ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/include/PHPExcel/Writer/Excel2007/Chart.php

https://bitbucket.org/sleininger/stock_online
PHP | 1140 lines | 755 code | 217 blank | 168 comment | 99 complexity | c22e3055f81a9e0d6ae75214bfa2e293 MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, GPL-3.0
  1. <?php
  2. /**
  3. * PHPExcel
  4. *
  5. * Copyright (c) 2006 - 2012 PHPExcel
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * @category PHPExcel
  22. * @package PHPExcel_Writer_Excel2007
  23. * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
  24. * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
  25. * @version 1.7.7, 2012-05-19
  26. */
  27. /**
  28. * PHPExcel_Writer_Excel2007_Chart
  29. *
  30. * @category PHPExcel
  31. * @package PHPExcel_Writer_Excel2007
  32. * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
  33. */
  34. class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart
  35. {
  36. /**
  37. * Write charts to XML format
  38. *
  39. * @param PHPExcel_Chart $pChart
  40. * @return string XML Output
  41. * @throws Exception
  42. */
  43. public function writeChart(PHPExcel_Chart $pChart = null)
  44. {
  45. // Create XML writer
  46. $objWriter = null;
  47. if ($this->getParentWriter()->getUseDiskCaching()) {
  48. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  49. } else {
  50. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
  51. }
  52. // Ensure that data series values are up-to-date before we save
  53. $pChart->refresh();
  54. // XML header
  55. $objWriter->startDocument('1.0','UTF-8','yes');
  56. // c:chartSpace
  57. $objWriter->startElement('c:chartSpace');
  58. $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
  59. $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
  60. $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
  61. $objWriter->startElement('c:date1904');
  62. $objWriter->writeAttribute('val', 0);
  63. $objWriter->endElement();
  64. $objWriter->startElement('c:lang');
  65. $objWriter->writeAttribute('val', "en-GB");
  66. $objWriter->endElement();
  67. $objWriter->startElement('c:roundedCorners');
  68. $objWriter->writeAttribute('val', 0);
  69. $objWriter->endElement();
  70. $this->_writeAlternateContent($objWriter);
  71. $objWriter->startElement('c:chart');
  72. $this->_writeTitle($pChart->getTitle(), $objWriter);
  73. $objWriter->startElement('c:autoTitleDeleted');
  74. $objWriter->writeAttribute('val', 0);
  75. $objWriter->endElement();
  76. $this->_writePlotArea($pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $objWriter);
  77. $this->_writeLegend($pChart->getLegend(), $objWriter);
  78. $objWriter->startElement('c:plotVisOnly');
  79. $objWriter->writeAttribute('val', 1);
  80. $objWriter->endElement();
  81. $objWriter->startElement('c:dispBlanksAs');
  82. $objWriter->writeAttribute('val', "gap");
  83. $objWriter->endElement();
  84. $objWriter->startElement('c:showDLblsOverMax');
  85. $objWriter->writeAttribute('val', 0);
  86. $objWriter->endElement();
  87. $objWriter->endElement();
  88. $this->_writePrintSettings($objWriter);
  89. $objWriter->endElement();
  90. // Return
  91. return $objWriter->getData();
  92. }
  93. /**
  94. * Write Chart Title
  95. *
  96. * @param PHPExcel_Chart_Title $title
  97. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  98. * @throws Exception
  99. */
  100. private function _writeTitle(PHPExcel_Chart_Title $title = null, $objWriter)
  101. {
  102. if (is_null($title)) {
  103. return;
  104. }
  105. $objWriter->startElement('c:title');
  106. $objWriter->startElement('c:tx');
  107. $objWriter->startElement('c:rich');
  108. $objWriter->startElement('a:bodyPr');
  109. $objWriter->endElement();
  110. $objWriter->startElement('a:lstStyle');
  111. $objWriter->endElement();
  112. $objWriter->startElement('a:p');
  113. $caption = $title->getCaption();
  114. if ((is_array($caption)) && (count($caption) > 0))
  115. $caption = $caption[0];
  116. $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a');
  117. $objWriter->endElement();
  118. $objWriter->endElement();
  119. $objWriter->endElement();
  120. $layout = $title->getLayout();
  121. $this->_writeLayout($layout, $objWriter);
  122. $objWriter->startElement('c:overlay');
  123. $objWriter->writeAttribute('val', 0);
  124. $objWriter->endElement();
  125. $objWriter->endElement();
  126. }
  127. /**
  128. * Write Chart Legend
  129. *
  130. * @param PHPExcel_Chart_Legend $legend
  131. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  132. * @throws Exception
  133. */
  134. private function _writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter)
  135. {
  136. if (is_null($legend)) {
  137. return;
  138. }
  139. $objWriter->startElement('c:legend');
  140. $objWriter->startElement('c:legendPos');
  141. $objWriter->writeAttribute('val', $legend->getPosition());
  142. $objWriter->endElement();
  143. $layout = $legend->getLayout();
  144. $this->_writeLayout($layout, $objWriter);
  145. $objWriter->startElement('c:overlay');
  146. $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0');
  147. $objWriter->endElement();
  148. $objWriter->startElement('c:txPr');
  149. $objWriter->startElement('a:bodyPr');
  150. $objWriter->endElement();
  151. $objWriter->startElement('a:lstStyle');
  152. $objWriter->endElement();
  153. $objWriter->startElement('a:p');
  154. $objWriter->startElement('a:pPr');
  155. $objWriter->writeAttribute('rtl', 0);
  156. $objWriter->startElement('a:defRPr');
  157. $objWriter->endElement();
  158. $objWriter->endElement();
  159. $objWriter->startElement('a:endParaRPr');
  160. $objWriter->writeAttribute('lang', "en-US");
  161. $objWriter->endElement();
  162. $objWriter->endElement();
  163. $objWriter->endElement();
  164. $objWriter->endElement();
  165. }
  166. /**
  167. * Write Chart Plot Area
  168. *
  169. * @param PHPExcel_Chart_PlotArea $plotArea
  170. * @param PHPExcel_Chart_Title $xAxisLabel
  171. * @param PHPExcel_Chart_Title $yAxisLabel
  172. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  173. * @throws Exception
  174. */
  175. private function _writePlotArea(PHPExcel_Chart_PlotArea $plotArea,
  176. PHPExcel_Chart_Title $xAxisLabel = NULL,
  177. PHPExcel_Chart_Title $yAxisLabel = NULL,
  178. $objWriter)
  179. {
  180. if (is_null($plotArea)) {
  181. return;
  182. }
  183. $id1 = $id2 = 0;
  184. $objWriter->startElement('c:plotArea');
  185. $layout = $plotArea->getLayout();
  186. $this->_writeLayout($layout, $objWriter);
  187. $chartTypes = self::_getChartType($plotArea);
  188. $catIsMultiLevelSeries = $valIsMultiLevelSeries = FALSE;
  189. $plotGroupingType = '';
  190. foreach($chartTypes as $chartType) {
  191. $objWriter->startElement('c:'.$chartType);
  192. $groupCount = $plotArea->getPlotGroupCount();
  193. for($i = 0; $i < $groupCount; ++$i) {
  194. $plotGroup = $plotArea->getPlotGroupByIndex($i);
  195. $groupType = $plotGroup->getPlotType();
  196. if ($groupType == $chartType) {
  197. $plotStyle = $plotGroup->getPlotStyle();
  198. if ($groupType === PHPExcel_Chart_DataSeries::TYPE_RADARCHART) {
  199. $objWriter->startElement('c:radarStyle');
  200. $objWriter->writeAttribute('val', $plotStyle );
  201. $objWriter->endElement();
  202. } elseif ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART) {
  203. $objWriter->startElement('c:scatterStyle');
  204. $objWriter->writeAttribute('val', $plotStyle );
  205. $objWriter->endElement();
  206. }
  207. $this->_writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType);
  208. }
  209. }
  210. $this->_writeDataLbls($objWriter);
  211. if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
  212. // Line only, Line3D can't be smoothed
  213. $objWriter->startElement('c:smooth');
  214. $objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine() );
  215. $objWriter->endElement();
  216. } elseif (($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) ||
  217. ($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) {
  218. $objWriter->startElement('c:gapWidth');
  219. $objWriter->writeAttribute('val', 150 );
  220. $objWriter->endElement();
  221. if ($plotGroupingType == 'percentStacked' ||
  222. $plotGroupingType == 'stacked') {
  223. $objWriter->startElement('c:overlap');
  224. $objWriter->writeAttribute('val', 100 );
  225. $objWriter->endElement();
  226. }
  227. } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
  228. $objWriter->startElement('c:bubbleScale');
  229. $objWriter->writeAttribute('val', 25 );
  230. $objWriter->endElement();
  231. $objWriter->startElement('c:showNegBubbles');
  232. $objWriter->writeAttribute('val', 0 );
  233. $objWriter->endElement();
  234. } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) {
  235. $objWriter->startElement('c:hiLowLines');
  236. $objWriter->endElement();
  237. }
  238. // Generate 2 unique numbers to use for axId values
  239. // $id1 = $id2 = rand(10000000,99999999);
  240. // do {
  241. // $id2 = rand(10000000,99999999);
  242. // } while ($id1 == $id2);
  243. $id1 = '75091328';
  244. $id2 = '75089408';
  245. if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) &&
  246. ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) &&
  247. ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
  248. $objWriter->startElement('c:axId');
  249. $objWriter->writeAttribute('val', $id1 );
  250. $objWriter->endElement();
  251. $objWriter->startElement('c:axId');
  252. $objWriter->writeAttribute('val', $id2 );
  253. $objWriter->endElement();
  254. } else {
  255. $objWriter->startElement('c:firstSliceAng');
  256. $objWriter->writeAttribute('val', 0);
  257. $objWriter->endElement();
  258. if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) {
  259. $objWriter->startElement('c:holeSize');
  260. $objWriter->writeAttribute('val', 50);
  261. $objWriter->endElement();
  262. }
  263. }
  264. $objWriter->endElement();
  265. }
  266. if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) &&
  267. ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) &&
  268. ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
  269. if ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
  270. $this->_writeValAx($objWriter,$plotArea,$xAxisLabel,$chartType,$id1,$id2,$catIsMultiLevelSeries);
  271. } else {
  272. $this->_writeCatAx($objWriter,$plotArea,$xAxisLabel,$chartType,$id1,$id2,$catIsMultiLevelSeries);
  273. }
  274. $this->_writeValAx($objWriter,$plotArea,$yAxisLabel,$chartType,$id1,$id2,$valIsMultiLevelSeries);
  275. }
  276. $objWriter->endElement();
  277. }
  278. /**
  279. * Write Data Labels
  280. *
  281. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  282. * @throws Exception
  283. */
  284. private function _writeDataLbls($objWriter)
  285. {
  286. $objWriter->startElement('c:dLbls');
  287. $objWriter->startElement('c:showLegendKey');
  288. $objWriter->writeAttribute('val', 0);
  289. $objWriter->endElement();
  290. $objWriter->startElement('c:showVal');
  291. $objWriter->writeAttribute('val', 0);
  292. $objWriter->endElement();
  293. $objWriter->startElement('c:showCatName');
  294. $objWriter->writeAttribute('val', 0);
  295. $objWriter->endElement();
  296. $objWriter->startElement('c:showSerName');
  297. $objWriter->writeAttribute('val', 0);
  298. $objWriter->endElement();
  299. $objWriter->startElement('c:showPercent');
  300. $objWriter->writeAttribute('val', 0);
  301. $objWriter->endElement();
  302. $objWriter->startElement('c:showBubbleSize');
  303. $objWriter->writeAttribute('val', 0);
  304. $objWriter->endElement();
  305. $objWriter->startElement('c:showLeaderLines');
  306. $objWriter->writeAttribute('val', 1);
  307. $objWriter->endElement();
  308. $objWriter->endElement();
  309. }
  310. /**
  311. * Write Category Axis
  312. *
  313. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  314. * @param PHPExcel_Chart_PlotArea $plotArea
  315. * @param PHPExcel_Chart_Title $xAxisLabel
  316. * @param string $groupType Chart type
  317. * @param string $id1
  318. * @param string $id2
  319. * @param boolean $isMultiLevelSeries
  320. * @throws Exception
  321. */
  322. private function _writeCatAx($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries)
  323. {
  324. $objWriter->startElement('c:catAx');
  325. if ($id1 > 0) {
  326. $objWriter->startElement('c:axId');
  327. $objWriter->writeAttribute('val', $id1);
  328. $objWriter->endElement();
  329. }
  330. $objWriter->startElement('c:scaling');
  331. $objWriter->startElement('c:orientation');
  332. $objWriter->writeAttribute('val', "minMax");
  333. $objWriter->endElement();
  334. $objWriter->endElement();
  335. $objWriter->startElement('c:delete');
  336. $objWriter->writeAttribute('val', 0);
  337. $objWriter->endElement();
  338. $objWriter->startElement('c:axPos');
  339. $objWriter->writeAttribute('val', "b");
  340. $objWriter->endElement();
  341. if (!is_null($xAxisLabel)) {
  342. $objWriter->startElement('c:title');
  343. $objWriter->startElement('c:tx');
  344. $objWriter->startElement('c:rich');
  345. $objWriter->startElement('a:bodyPr');
  346. $objWriter->endElement();
  347. $objWriter->startElement('a:lstStyle');
  348. $objWriter->endElement();
  349. $objWriter->startElement('a:p');
  350. $objWriter->startElement('a:r');
  351. $caption = $xAxisLabel->getCaption();
  352. if (is_array($caption))
  353. $caption = $caption[0];
  354. $objWriter->startElement('a:t');
  355. $objWriter->writeAttribute('xml:space', 'preserve');
  356. $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $caption ));
  357. $objWriter->endElement();
  358. $objWriter->endElement();
  359. $objWriter->endElement();
  360. $objWriter->endElement();
  361. $objWriter->endElement();
  362. $objWriter->startElement('c:overlay');
  363. $objWriter->writeAttribute('val', 0);
  364. $objWriter->endElement();
  365. $layout = $xAxisLabel->getLayout();
  366. $this->_writeLayout($layout, $objWriter);
  367. $objWriter->endElement();
  368. }
  369. $objWriter->startElement('c:numFmt');
  370. $objWriter->writeAttribute('formatCode', "General");
  371. $objWriter->writeAttribute('sourceLinked', 1);
  372. $objWriter->endElement();
  373. $objWriter->startElement('c:majorTickMark');
  374. $objWriter->writeAttribute('val', "out");
  375. $objWriter->endElement();
  376. $objWriter->startElement('c:minorTickMark');
  377. $objWriter->writeAttribute('val', "none");
  378. $objWriter->endElement();
  379. $objWriter->startElement('c:tickLblPos');
  380. $objWriter->writeAttribute('val', "nextTo");
  381. $objWriter->endElement();
  382. if ($id2 > 0) {
  383. $objWriter->startElement('c:crossAx');
  384. $objWriter->writeAttribute('val', $id2);
  385. $objWriter->endElement();
  386. $objWriter->startElement('c:crosses');
  387. $objWriter->writeAttribute('val', "autoZero");
  388. $objWriter->endElement();
  389. }
  390. $objWriter->startElement('c:auto');
  391. $objWriter->writeAttribute('val', 1);
  392. $objWriter->endElement();
  393. $objWriter->startElement('c:lblAlgn');
  394. $objWriter->writeAttribute('val', "ctr");
  395. $objWriter->endElement();
  396. $objWriter->startElement('c:lblOffset');
  397. $objWriter->writeAttribute('val', 100);
  398. $objWriter->endElement();
  399. if ($isMultiLevelSeries) {
  400. $objWriter->startElement('c:noMultiLvlLbl');
  401. $objWriter->writeAttribute('val', 0);
  402. $objWriter->endElement();
  403. }
  404. $objWriter->endElement();
  405. }
  406. /**
  407. * Write Value Axis
  408. *
  409. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  410. * @param PHPExcel_Chart_PlotArea $plotArea
  411. * @param PHPExcel_Chart_Title $yAxisLabel
  412. * @param string $groupType Chart type
  413. * @param string $id1
  414. * @param string $id2
  415. * @param boolean $isMultiLevelSeries
  416. * @throws Exception
  417. */
  418. private function _writeValAx($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries)
  419. {
  420. $objWriter->startElement('c:valAx');
  421. if ($id2 > 0) {
  422. $objWriter->startElement('c:axId');
  423. $objWriter->writeAttribute('val', $id2);
  424. $objWriter->endElement();
  425. }
  426. $objWriter->startElement('c:scaling');
  427. $objWriter->startElement('c:orientation');
  428. $objWriter->writeAttribute('val', "minMax");
  429. $objWriter->endElement();
  430. $objWriter->endElement();
  431. $objWriter->startElement('c:delete');
  432. $objWriter->writeAttribute('val', 0);
  433. $objWriter->endElement();
  434. $objWriter->startElement('c:axPos');
  435. $objWriter->writeAttribute('val', "l");
  436. $objWriter->endElement();
  437. $objWriter->startElement('c:majorGridlines');
  438. $objWriter->endElement();
  439. if (!is_null($yAxisLabel)) {
  440. $objWriter->startElement('c:title');
  441. $objWriter->startElement('c:tx');
  442. $objWriter->startElement('c:rich');
  443. $objWriter->startElement('a:bodyPr');
  444. $objWriter->endElement();
  445. $objWriter->startElement('a:lstStyle');
  446. $objWriter->endElement();
  447. $objWriter->startElement('a:p');
  448. $objWriter->startElement('a:r');
  449. $caption = $yAxisLabel->getCaption();
  450. if (is_array($caption))
  451. $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();
  456. $objWriter->endElement();
  457. $objWriter->endElement();
  458. $objWriter->endElement();
  459. $objWriter->endElement();
  460. $objWriter->startElement('c:overlay');
  461. $objWriter->writeAttribute('val', 0);
  462. $objWriter->endElement();
  463. if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
  464. $layout = $yAxisLabel->getLayout();
  465. $this->_writeLayout($layout, $objWriter);
  466. }
  467. $objWriter->endElement();
  468. }
  469. $objWriter->startElement('c:numFmt');
  470. $objWriter->writeAttribute('formatCode', "General");
  471. $objWriter->writeAttribute('sourceLinked', 1);
  472. $objWriter->endElement();
  473. $objWriter->startElement('c:majorTickMark');
  474. $objWriter->writeAttribute('val', "out");
  475. $objWriter->endElement();
  476. $objWriter->startElement('c:minorTickMark');
  477. $objWriter->writeAttribute('val', "none");
  478. $objWriter->endElement();
  479. $objWriter->startElement('c:tickLblPos');
  480. $objWriter->writeAttribute('val', "nextTo");
  481. $objWriter->endElement();
  482. if ($id1 > 0) {
  483. $objWriter->startElement('c:crossAx');
  484. $objWriter->writeAttribute('val', $id2);
  485. $objWriter->endElement();
  486. $objWriter->startElement('c:crosses');
  487. $objWriter->writeAttribute('val', "autoZero");
  488. $objWriter->endElement();
  489. $objWriter->startElement('c:crossBetween');
  490. $objWriter->writeAttribute('val', "midCat");
  491. $objWriter->endElement();
  492. }
  493. if ($isMultiLevelSeries) {
  494. if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
  495. $objWriter->startElement('c:noMultiLvlLbl');
  496. $objWriter->writeAttribute('val', 0);
  497. $objWriter->endElement();
  498. }
  499. }
  500. $objWriter->endElement();
  501. }
  502. /**
  503. * Get the data series type(s) for a chart plot series
  504. *
  505. * @param PHPExcel_Chart_PlotArea $plotArea
  506. * @return string|array
  507. * @throws Exception
  508. */
  509. private static function _getChartType($plotArea)
  510. {
  511. $groupCount = $plotArea->getPlotGroupCount();
  512. if ($groupCount == 1) {
  513. $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType());
  514. } else {
  515. $chartTypes = array();
  516. for($i = 0; $i < $groupCount; ++$i) {
  517. $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType();
  518. }
  519. $chartType = array_unique($chartTypes);
  520. if (count($chartTypes) == 0) {
  521. throw new Exception('Chart is not yet implemented');
  522. }
  523. }
  524. return $chartType;
  525. }
  526. /**
  527. * Write Plot Group (series of related plots)
  528. *
  529. * @param PHPExcel_Chart_DataSeries $plotGroup
  530. * @param string $groupType Type of plot for dataseries
  531. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  532. * @param boolean &$catIsMultiLevelSeries Is category a multi-series category
  533. * @param boolean &$valIsMultiLevelSeries Is value set a multi-series set
  534. * @param string &$plotGroupingType Type of grouping for multi-series values
  535. * @throws Exception
  536. */
  537. private function _writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType)
  538. {
  539. if (is_null($plotGroup)) {
  540. return;
  541. }
  542. if (($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART) ||
  543. ($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) {
  544. $objWriter->startElement('c:barDir');
  545. $objWriter->writeAttribute('val', $plotGroup->getPlotDirection());
  546. $objWriter->endElement();
  547. }
  548. if (!is_null($plotGroup->getPlotGrouping())) {
  549. $plotGroupingType = $plotGroup->getPlotGrouping();
  550. $objWriter->startElement('c:grouping');
  551. $objWriter->writeAttribute('val', $plotGroupingType);
  552. $objWriter->endElement();
  553. }
  554. // Get these details before the loop, because we can use the count to check for varyColors
  555. $plotSeriesOrder = $plotGroup->getPlotOrder();
  556. $plotSeriesCount = count($plotSeriesOrder);
  557. if (($groupType !== PHPExcel_Chart_DataSeries::TYPE_RADARCHART) &&
  558. ($groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) {
  559. if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
  560. if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) ||
  561. ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) ||
  562. ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) ||
  563. ($plotSeriesCount > 1)) {
  564. $objWriter->startElement('c:varyColors');
  565. $objWriter->writeAttribute('val', 1);
  566. $objWriter->endElement();
  567. } else {
  568. $objWriter->startElement('c:varyColors');
  569. $objWriter->writeAttribute('val', 0);
  570. $objWriter->endElement();
  571. }
  572. }
  573. }
  574. foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) {
  575. $objWriter->startElement('c:ser');
  576. $objWriter->startElement('c:idx');
  577. $objWriter->writeAttribute('val', $plotSeriesIdx);
  578. $objWriter->endElement();
  579. $objWriter->startElement('c:order');
  580. $objWriter->writeAttribute('val', $plotSeriesRef);
  581. $objWriter->endElement();
  582. if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) ||
  583. ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) ||
  584. ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
  585. $objWriter->startElement('c:dPt');
  586. $objWriter->startElement('c:idx');
  587. $objWriter->writeAttribute('val', 3);
  588. $objWriter->endElement();
  589. $objWriter->startElement('c:bubble3D');
  590. $objWriter->writeAttribute('val', 0);
  591. $objWriter->endElement();
  592. $objWriter->startElement('c:spPr');
  593. $objWriter->startElement('a:solidFill');
  594. $objWriter->startElement('a:srgbClr');
  595. $objWriter->writeAttribute('val', 'FF9900');
  596. $objWriter->endElement();
  597. $objWriter->endElement();
  598. $objWriter->endElement();
  599. $objWriter->endElement();
  600. }
  601. // Labels
  602. $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef);
  603. if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) {
  604. $objWriter->startElement('c:tx');
  605. $objWriter->startElement('c:strRef');
  606. $this->_writePlotSeriesLabel($plotSeriesLabel, $objWriter);
  607. $objWriter->endElement();
  608. $objWriter->endElement();
  609. }
  610. // Formatting for the points
  611. if ($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) {
  612. $objWriter->startElement('c:spPr');
  613. $objWriter->startElement('a:ln');
  614. $objWriter->writeAttribute('w', 12700);
  615. $objWriter->endElement();
  616. $objWriter->endElement();
  617. }
  618. $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef);
  619. if ($plotSeriesValues) {
  620. $plotSeriesMarker = $plotSeriesValues->getPointMarker();
  621. if ($plotSeriesMarker) {
  622. $objWriter->startElement('c:marker');
  623. $objWriter->startElement('c:symbol');
  624. $objWriter->writeAttribute('val', $plotSeriesMarker);
  625. $objWriter->endElement();
  626. if ($plotSeriesMarker !== 'none') {
  627. $objWriter->startElement('c:size');
  628. $objWriter->writeAttribute('val', 3);
  629. $objWriter->endElement();
  630. }
  631. $objWriter->endElement();
  632. }
  633. }
  634. if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) ||
  635. ($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D) ||
  636. ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART)) {
  637. $objWriter->startElement('c:invertIfNegative');
  638. $objWriter->writeAttribute('val', 0);
  639. $objWriter->endElement();
  640. }
  641. // Category Labels
  642. $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef);
  643. if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) {
  644. $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
  645. if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) ||
  646. ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) ||
  647. ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
  648. if (!is_null($plotGroup->getPlotStyle())) {
  649. $plotStyle = $plotGroup->getPlotStyle();
  650. if ($plotStyle) {
  651. $objWriter->startElement('c:explosion');
  652. $objWriter->writeAttribute('val', 25);
  653. $objWriter->endElement();
  654. }
  655. }
  656. }
  657. if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) ||
  658. ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {
  659. $objWriter->startElement('c:xVal');
  660. } else {
  661. $objWriter->startElement('c:cat');
  662. }
  663. $this->_writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str');
  664. $objWriter->endElement();
  665. }
  666. // Values
  667. if ($plotSeriesValues) {
  668. $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries();
  669. if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) ||
  670. ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) {
  671. $objWriter->startElement('c:yVal');
  672. } else {
  673. $objWriter->startElement('c:val');
  674. }
  675. $this->_writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num');
  676. $objWriter->endElement();
  677. }
  678. if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) {
  679. $this->_writeBubbles($plotSeriesValues, $objWriter);
  680. }
  681. $objWriter->endElement();
  682. }
  683. }
  684. /**
  685. * Write Plot Series Label
  686. *
  687. * @param PHPExcel_Chart_DataSeriesValues $plotSeriesLabel
  688. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  689. * @throws Exception
  690. */
  691. private function _writePlotSeriesLabel($plotSeriesLabel, $objWriter)
  692. {
  693. if (is_null($plotSeriesLabel)) {
  694. return;
  695. }
  696. $objWriter->startElement('c:f');
  697. $objWriter->writeRawData($plotSeriesLabel->getDataSource());
  698. $objWriter->endElement();
  699. $objWriter->startElement('c:strCache');
  700. $objWriter->startElement('c:ptCount');
  701. $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount() );
  702. $objWriter->endElement();
  703. foreach($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) {
  704. $objWriter->startElement('c:pt');
  705. $objWriter->writeAttribute('idx', $plotLabelKey );
  706. $objWriter->startElement('c:v');
  707. $objWriter->writeRawData( $plotLabelValue );
  708. $objWriter->endElement();
  709. $objWriter->endElement();
  710. }
  711. $objWriter->endElement();
  712. }
  713. /**
  714. * Write Plot Series Values
  715. *
  716. * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues
  717. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  718. * @param string $groupType Type of plot for dataseries
  719. * @param string $dataType Datatype of series values
  720. * @throws Exception
  721. */
  722. private function _writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, $dataType='str')
  723. {
  724. if (is_null($plotSeriesValues)) {
  725. return;
  726. }
  727. if ($plotSeriesValues->isMultiLevelSeries()) {
  728. $levelCount = $plotSeriesValues->multiLevelCount();
  729. $objWriter->startElement('c:multiLvlStrRef');
  730. $objWriter->startElement('c:f');
  731. $objWriter->writeRawData( $plotSeriesValues->getDataSource() );
  732. $objWriter->endElement();
  733. $objWriter->startElement('c:multiLvlStrCache');
  734. $objWriter->startElement('c:ptCount');
  735. $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() );
  736. $objWriter->endElement();
  737. for ($level = 0; $level < $levelCount; ++$level) {
  738. $objWriter->startElement('c:lvl');
  739. foreach($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
  740. if (isset($plotSeriesValue[$level])) {
  741. $objWriter->startElement('c:pt');
  742. $objWriter->writeAttribute('idx', $plotSeriesKey );
  743. $objWriter->startElement('c:v');
  744. $objWriter->writeRawData( $plotSeriesValue[$level] );
  745. $objWriter->endElement();
  746. $objWriter->endElement();
  747. }
  748. }
  749. $objWriter->endElement();
  750. }
  751. $objWriter->endElement();
  752. $objWriter->endElement();
  753. } else {
  754. $objWriter->startElement('c:'.$dataType.'Ref');
  755. $objWriter->startElement('c:f');
  756. $objWriter->writeRawData( $plotSeriesValues->getDataSource() );
  757. $objWriter->endElement();
  758. $objWriter->startElement('c:'.$dataType.'Cache');
  759. if (($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART) &&
  760. ($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) &&
  761. ($groupType != PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) {
  762. if ($plotSeriesValues->getFormatCode() !== NULL) {
  763. $objWriter->startElement('c:formatCode');
  764. $objWriter->writeRawData( $plotSeriesValues->getFormatCode() );
  765. $objWriter->endElement();
  766. }
  767. }
  768. $objWriter->startElement('c:ptCount');
  769. $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() );
  770. $objWriter->endElement();
  771. foreach($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
  772. $objWriter->startElement('c:pt');
  773. $objWriter->writeAttribute('idx', $plotSeriesKey );
  774. $objWriter->startElement('c:v');
  775. $objWriter->writeRawData( $plotSeriesValue );
  776. $objWriter->endElement();
  777. $objWriter->endElement();
  778. }
  779. $objWriter->endElement();
  780. $objWriter->endElement();
  781. }
  782. }
  783. /**
  784. * Write Bubble Chart Details
  785. *
  786. * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues
  787. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  788. * @throws Exception
  789. */
  790. private function _writeBubbles($plotSeriesValues, $objWriter)
  791. {
  792. if (is_null($plotSeriesValues)) {
  793. return;
  794. }
  795. $objWriter->startElement('c:bubbleSize');
  796. $objWriter->startElement('c:numLit');
  797. $objWriter->startElement('c:formatCode');
  798. $objWriter->writeRawData( 'General' );
  799. $objWriter->endElement();
  800. $objWriter->startElement('c:ptCount');
  801. $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() );
  802. $objWriter->endElement();
  803. foreach($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) {
  804. $objWriter->startElement('c:pt');
  805. $objWriter->writeAttribute('idx', $plotSeriesKey );
  806. $objWriter->startElement('c:v');
  807. $objWriter->writeRawData( 1 );
  808. $objWriter->endElement();
  809. $objWriter->endElement();
  810. }
  811. $objWriter->endElement();
  812. $objWriter->endElement();
  813. $objWriter->startElement('c:bubble3D');
  814. $objWriter->writeAttribute('val', 0 );
  815. $objWriter->endElement();
  816. }
  817. /**
  818. * Write Layout
  819. *
  820. * @param PHPExcel_Chart_Layout $layout
  821. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  822. * @throws Exception
  823. */
  824. private function _writeLayout(PHPExcel_Chart_Layout $layout = NULL, $objWriter)
  825. {
  826. $objWriter->startElement('c:layout');
  827. if (!is_null($layout)) {
  828. $objWriter->startElement('c:manualLayout');
  829. $layoutTarget = $layout->getLayoutTarget();
  830. if (!is_null($layoutTarget)) {
  831. $objWriter->startElement('c:layoutTarget');
  832. $objWriter->writeAttribute('val', $layoutTarget);
  833. $objWriter->endElement();
  834. }
  835. $xMode = $layout->getXMode();
  836. if (!is_null($xMode)) {
  837. $objWriter->startElement('c:xMode');
  838. $objWriter->writeAttribute('val', $xMode);
  839. $objWriter->endElement();
  840. }
  841. $yMode = $layout->getYMode();
  842. if (!is_null($yMode)) {
  843. $objWriter->startElement('c:yMode');
  844. $objWriter->writeAttribute('val', $yMode);
  845. $objWriter->endElement();
  846. }
  847. $x = $layout->getXPosition();
  848. if (!is_null($x)) {
  849. $objWriter->startElement('c:x');
  850. $objWriter->writeAttribute('val', $x);
  851. $objWriter->endElement();
  852. }
  853. $y = $layout->getYPosition();
  854. if (!is_null($y)) {
  855. $objWriter->startElement('c:y');
  856. $objWriter->writeAttribute('val', $y);
  857. $objWriter->endElement();
  858. }
  859. $w = $layout->getWidth();
  860. if (!is_null($w)) {
  861. $objWriter->startElement('c:w');
  862. $objWriter->writeAttribute('val', $w);
  863. $objWriter->endElement();
  864. }
  865. $h = $layout->getHeight();
  866. if (!is_null($h)) {
  867. $objWriter->startElement('c:h');
  868. $objWriter->writeAttribute('val', $h);
  869. $objWriter->endElement();
  870. }
  871. $objWriter->endElement();
  872. }
  873. $objWriter->endElement();
  874. }
  875. /**
  876. * Write Alternate Content block
  877. *
  878. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  879. * @throws Exception
  880. */
  881. private function _writeAlternateContent($objWriter)
  882. {
  883. $objWriter->startElement('mc:AlternateContent');
  884. $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006');
  885. $objWriter->startElement('mc:Choice');
  886. $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart');
  887. $objWriter->writeAttribute('Requires', 'c14');
  888. $objWriter->startElement('c14:style');
  889. $objWriter->writeAttribute('val', '102');
  890. $objWriter->endElement();
  891. $objWriter->endElement();
  892. $objWriter->startElement('mc:Fallback');
  893. $objWriter->startElement('c:style');
  894. $objWriter->writeAttribute('val', '2');
  895. $objWriter->endElement();
  896. $objWriter->endElement();
  897. $objWriter->endElement();
  898. }
  899. /**
  900. * Write Printer Settings
  901. *
  902. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  903. * @throws Exception
  904. */
  905. private function _writePrintSettings($objWriter)
  906. {
  907. $objWriter->startElement('c:printSettings');
  908. $objWriter->startElement('c:headerFooter');
  909. $objWriter->endElement();
  910. $objWriter->startElement('c:pageMargins');
  911. $objWriter->writeAttribute('footer', 0.3);
  912. $objWriter->writeAttribute('header', 0.3);
  913. $objWriter->writeAttribute('r', 0.7);
  914. $objWriter->writeAttribute('l', 0.7);
  915. $objWriter->writeAttribute('t', 0.75);
  916. $objWriter->writeAttribute('b', 0.75);
  917. $objWriter->endElement();
  918. $objWriter->startElement('c:pageSetup');
  919. $objWriter->writeAttribute('orientation', "portrait");
  920. $objWriter->endElement();
  921. $objWriter->endElement();
  922. }
  923. }