1 | <?php |
---|
2 | /** |
---|
3 | * PHPExcel |
---|
4 | * |
---|
5 | * Copyright (c) 2006 - 2014 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 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) |
---|
24 | * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL |
---|
25 | * @version 1.8.0, 2014-03-02 |
---|
26 | */ |
---|
27 | |
---|
28 | |
---|
29 | /** |
---|
30 | * PHPExcel_Writer_Excel2007_Chart |
---|
31 | * |
---|
32 | * @category PHPExcel |
---|
33 | * @package PHPExcel_Writer_Excel2007 |
---|
34 | * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) |
---|
35 | */ |
---|
36 | class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart |
---|
37 | { |
---|
38 | /** |
---|
39 | * Write charts to XML format |
---|
40 | * |
---|
41 | * @param PHPExcel_Chart $pChart |
---|
42 | * @return string XML Output |
---|
43 | * @throws PHPExcel_Writer_Exception |
---|
44 | */ |
---|
45 | public function writeChart(PHPExcel_Chart $pChart = null) |
---|
46 | { |
---|
47 | // Create XML writer |
---|
48 | $objWriter = null; |
---|
49 | if ($this->getParentWriter()->getUseDiskCaching()) { |
---|
50 | $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); |
---|
51 | } else { |
---|
52 | $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); |
---|
53 | } |
---|
54 | // Ensure that data series values are up-to-date before we save |
---|
55 | $pChart->refresh(); |
---|
56 | |
---|
57 | // XML header |
---|
58 | $objWriter->startDocument('1.0','UTF-8','yes'); |
---|
59 | |
---|
60 | // c:chartSpace |
---|
61 | $objWriter->startElement('c:chartSpace'); |
---|
62 | $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); |
---|
63 | $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); |
---|
64 | $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); |
---|
65 | |
---|
66 | $objWriter->startElement('c:date1904'); |
---|
67 | $objWriter->writeAttribute('val', 0); |
---|
68 | $objWriter->endElement(); |
---|
69 | $objWriter->startElement('c:lang'); |
---|
70 | $objWriter->writeAttribute('val', "en-GB"); |
---|
71 | $objWriter->endElement(); |
---|
72 | $objWriter->startElement('c:roundedCorners'); |
---|
73 | $objWriter->writeAttribute('val', 0); |
---|
74 | $objWriter->endElement(); |
---|
75 | |
---|
76 | $this->_writeAlternateContent($objWriter); |
---|
77 | |
---|
78 | $objWriter->startElement('c:chart'); |
---|
79 | |
---|
80 | $this->_writeTitle($pChart->getTitle(), $objWriter); |
---|
81 | |
---|
82 | $objWriter->startElement('c:autoTitleDeleted'); |
---|
83 | $objWriter->writeAttribute('val', 0); |
---|
84 | $objWriter->endElement(); |
---|
85 | |
---|
86 | $this->_writePlotArea($pChart->getPlotArea(), |
---|
87 | $pChart->getXAxisLabel(), |
---|
88 | $pChart->getYAxisLabel(), |
---|
89 | $objWriter, |
---|
90 | $pChart->getWorksheet() |
---|
91 | ); |
---|
92 | |
---|
93 | $this->_writeLegend($pChart->getLegend(), $objWriter); |
---|
94 | |
---|
95 | |
---|
96 | $objWriter->startElement('c:plotVisOnly'); |
---|
97 | $objWriter->writeAttribute('val', 1); |
---|
98 | $objWriter->endElement(); |
---|
99 | |
---|
100 | $objWriter->startElement('c:dispBlanksAs'); |
---|
101 | $objWriter->writeAttribute('val', "gap"); |
---|
102 | $objWriter->endElement(); |
---|
103 | |
---|
104 | $objWriter->startElement('c:showDLblsOverMax'); |
---|
105 | $objWriter->writeAttribute('val', 0); |
---|
106 | $objWriter->endElement(); |
---|
107 | |
---|
108 | $objWriter->endElement(); |
---|
109 | |
---|
110 | $this->_writePrintSettings($objWriter); |
---|
111 | |
---|
112 | $objWriter->endElement(); |
---|
113 | |
---|
114 | // Return |
---|
115 | return $objWriter->getData(); |
---|
116 | } |
---|
117 | |
---|
118 | /** |
---|
119 | * Write Chart Title |
---|
120 | * |
---|
121 | * @param PHPExcel_Chart_Title $title |
---|
122 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
123 | * @throws PHPExcel_Writer_Exception |
---|
124 | */ |
---|
125 | private function _writeTitle(PHPExcel_Chart_Title $title = null, $objWriter) |
---|
126 | { |
---|
127 | if (is_null($title)) { |
---|
128 | return; |
---|
129 | } |
---|
130 | |
---|
131 | $objWriter->startElement('c:title'); |
---|
132 | $objWriter->startElement('c:tx'); |
---|
133 | $objWriter->startElement('c:rich'); |
---|
134 | |
---|
135 | $objWriter->startElement('a:bodyPr'); |
---|
136 | $objWriter->endElement(); |
---|
137 | |
---|
138 | $objWriter->startElement('a:lstStyle'); |
---|
139 | $objWriter->endElement(); |
---|
140 | |
---|
141 | $objWriter->startElement('a:p'); |
---|
142 | |
---|
143 | $caption = $title->getCaption(); |
---|
144 | if ((is_array($caption)) && (count($caption) > 0)) |
---|
145 | $caption = $caption[0]; |
---|
146 | $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a'); |
---|
147 | |
---|
148 | $objWriter->endElement(); |
---|
149 | $objWriter->endElement(); |
---|
150 | $objWriter->endElement(); |
---|
151 | |
---|
152 | $layout = $title->getLayout(); |
---|
153 | $this->_writeLayout($layout, $objWriter); |
---|
154 | |
---|
155 | $objWriter->startElement('c:overlay'); |
---|
156 | $objWriter->writeAttribute('val', 0); |
---|
157 | $objWriter->endElement(); |
---|
158 | |
---|
159 | $objWriter->endElement(); |
---|
160 | } |
---|
161 | |
---|
162 | /** |
---|
163 | * Write Chart Legend |
---|
164 | * |
---|
165 | * @param PHPExcel_Chart_Legend $legend |
---|
166 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
167 | * @throws PHPExcel_Writer_Exception |
---|
168 | */ |
---|
169 | private function _writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter) |
---|
170 | { |
---|
171 | if (is_null($legend)) { |
---|
172 | return; |
---|
173 | } |
---|
174 | |
---|
175 | $objWriter->startElement('c:legend'); |
---|
176 | |
---|
177 | $objWriter->startElement('c:legendPos'); |
---|
178 | $objWriter->writeAttribute('val', $legend->getPosition()); |
---|
179 | $objWriter->endElement(); |
---|
180 | |
---|
181 | $layout = $legend->getLayout(); |
---|
182 | $this->_writeLayout($layout, $objWriter); |
---|
183 | |
---|
184 | $objWriter->startElement('c:overlay'); |
---|
185 | $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0'); |
---|
186 | $objWriter->endElement(); |
---|
187 | |
---|
188 | $objWriter->startElement('c:txPr'); |
---|
189 | $objWriter->startElement('a:bodyPr'); |
---|
190 | $objWriter->endElement(); |
---|
191 | |
---|
192 | $objWriter->startElement('a:lstStyle'); |
---|
193 | $objWriter->endElement(); |
---|
194 | |
---|
195 | $objWriter->startElement('a:p'); |
---|
196 | $objWriter->startElement('a:pPr'); |
---|
197 | $objWriter->writeAttribute('rtl', 0); |
---|
198 | |
---|
199 | $objWriter->startElement('a:defRPr'); |
---|
200 | $objWriter->endElement(); |
---|
201 | $objWriter->endElement(); |
---|
202 | |
---|
203 | $objWriter->startElement('a:endParaRPr'); |
---|
204 | $objWriter->writeAttribute('lang', "en-US"); |
---|
205 | $objWriter->endElement(); |
---|
206 | |
---|
207 | $objWriter->endElement(); |
---|
208 | $objWriter->endElement(); |
---|
209 | |
---|
210 | $objWriter->endElement(); |
---|
211 | } |
---|
212 | |
---|
213 | /** |
---|
214 | * Write Chart Plot Area |
---|
215 | * |
---|
216 | * @param PHPExcel_Chart_PlotArea $plotArea |
---|
217 | * @param PHPExcel_Chart_Title $xAxisLabel |
---|
218 | * @param PHPExcel_Chart_Title $yAxisLabel |
---|
219 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
220 | * @throws PHPExcel_Writer_Exception |
---|
221 | */ |
---|
222 | private function _writePlotArea(PHPExcel_Chart_PlotArea $plotArea, |
---|
223 | PHPExcel_Chart_Title $xAxisLabel = NULL, |
---|
224 | PHPExcel_Chart_Title $yAxisLabel = NULL, |
---|
225 | $objWriter, |
---|
226 | PHPExcel_Worksheet $pSheet) |
---|
227 | { |
---|
228 | if (is_null($plotArea)) { |
---|
229 | return; |
---|
230 | } |
---|
231 | |
---|
232 | $id1 = $id2 = 0; |
---|
233 | $this->_seriesIndex = 0; |
---|
234 | $objWriter->startElement('c:plotArea'); |
---|
235 | |
---|
236 | $layout = $plotArea->getLayout(); |
---|
237 | |
---|
238 | $this->_writeLayout($layout, $objWriter); |
---|
239 | |
---|
240 | $chartTypes = self::_getChartType($plotArea); |
---|
241 | $catIsMultiLevelSeries = $valIsMultiLevelSeries = FALSE; |
---|
242 | $plotGroupingType = ''; |
---|
243 | foreach($chartTypes as $chartType) { |
---|
244 | $objWriter->startElement('c:'.$chartType); |
---|
245 | |
---|
246 | $groupCount = $plotArea->getPlotGroupCount(); |
---|
247 | for($i = 0; $i < $groupCount; ++$i) { |
---|
248 | $plotGroup = $plotArea->getPlotGroupByIndex($i); |
---|
249 | $groupType = $plotGroup->getPlotType(); |
---|
250 | if ($groupType == $chartType) { |
---|
251 | |
---|
252 | $plotStyle = $plotGroup->getPlotStyle(); |
---|
253 | if ($groupType === PHPExcel_Chart_DataSeries::TYPE_RADARCHART) { |
---|
254 | $objWriter->startElement('c:radarStyle'); |
---|
255 | $objWriter->writeAttribute('val', $plotStyle ); |
---|
256 | $objWriter->endElement(); |
---|
257 | } elseif ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART) { |
---|
258 | $objWriter->startElement('c:scatterStyle'); |
---|
259 | $objWriter->writeAttribute('val', $plotStyle ); |
---|
260 | $objWriter->endElement(); |
---|
261 | } |
---|
262 | |
---|
263 | $this->_writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType, $pSheet); |
---|
264 | } |
---|
265 | } |
---|
266 | |
---|
267 | $this->_writeDataLbls($objWriter, $layout); |
---|
268 | |
---|
269 | if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) { |
---|
270 | // Line only, Line3D can't be smoothed |
---|
271 | |
---|
272 | $objWriter->startElement('c:smooth'); |
---|
273 | $objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine() ); |
---|
274 | $objWriter->endElement(); |
---|
275 | } elseif (($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || |
---|
276 | ($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) { |
---|
277 | |
---|
278 | $objWriter->startElement('c:gapWidth'); |
---|
279 | $objWriter->writeAttribute('val', 150 ); |
---|
280 | $objWriter->endElement(); |
---|
281 | |
---|
282 | if ($plotGroupingType == 'percentStacked' || |
---|
283 | $plotGroupingType == 'stacked') { |
---|
284 | |
---|
285 | $objWriter->startElement('c:overlap'); |
---|
286 | $objWriter->writeAttribute('val', 100 ); |
---|
287 | $objWriter->endElement(); |
---|
288 | } |
---|
289 | } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { |
---|
290 | |
---|
291 | $objWriter->startElement('c:bubbleScale'); |
---|
292 | $objWriter->writeAttribute('val', 25 ); |
---|
293 | $objWriter->endElement(); |
---|
294 | |
---|
295 | $objWriter->startElement('c:showNegBubbles'); |
---|
296 | $objWriter->writeAttribute('val', 0 ); |
---|
297 | $objWriter->endElement(); |
---|
298 | } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) { |
---|
299 | |
---|
300 | $objWriter->startElement('c:hiLowLines'); |
---|
301 | $objWriter->endElement(); |
---|
302 | |
---|
303 | $objWriter->startElement( 'c:upDownBars' ); |
---|
304 | |
---|
305 | $objWriter->startElement( 'c:gapWidth' ); |
---|
306 | $objWriter->writeAttribute('val', 300); |
---|
307 | $objWriter->endElement(); |
---|
308 | |
---|
309 | $objWriter->startElement( 'c:upBars' ); |
---|
310 | $objWriter->endElement(); |
---|
311 | |
---|
312 | $objWriter->startElement( 'c:downBars' ); |
---|
313 | $objWriter->endElement(); |
---|
314 | |
---|
315 | $objWriter->endElement(); |
---|
316 | } |
---|
317 | |
---|
318 | // Generate 2 unique numbers to use for axId values |
---|
319 | // $id1 = $id2 = rand(10000000,99999999); |
---|
320 | // do { |
---|
321 | // $id2 = rand(10000000,99999999); |
---|
322 | // } while ($id1 == $id2); |
---|
323 | $id1 = '75091328'; |
---|
324 | $id2 = '75089408'; |
---|
325 | |
---|
326 | if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && |
---|
327 | ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && |
---|
328 | ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { |
---|
329 | |
---|
330 | $objWriter->startElement('c:axId'); |
---|
331 | $objWriter->writeAttribute('val', $id1 ); |
---|
332 | $objWriter->endElement(); |
---|
333 | $objWriter->startElement('c:axId'); |
---|
334 | $objWriter->writeAttribute('val', $id2 ); |
---|
335 | $objWriter->endElement(); |
---|
336 | } else { |
---|
337 | $objWriter->startElement('c:firstSliceAng'); |
---|
338 | $objWriter->writeAttribute('val', 0); |
---|
339 | $objWriter->endElement(); |
---|
340 | |
---|
341 | if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) { |
---|
342 | |
---|
343 | $objWriter->startElement('c:holeSize'); |
---|
344 | $objWriter->writeAttribute('val', 50); |
---|
345 | $objWriter->endElement(); |
---|
346 | } |
---|
347 | } |
---|
348 | |
---|
349 | $objWriter->endElement(); |
---|
350 | } |
---|
351 | |
---|
352 | if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && |
---|
353 | ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && |
---|
354 | ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { |
---|
355 | |
---|
356 | if ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { |
---|
357 | $this->_writeValAx($objWriter,$plotArea,$xAxisLabel,$chartType,$id1,$id2,$catIsMultiLevelSeries); |
---|
358 | } else { |
---|
359 | $this->_writeCatAx($objWriter,$plotArea,$xAxisLabel,$chartType,$id1,$id2,$catIsMultiLevelSeries); |
---|
360 | } |
---|
361 | |
---|
362 | $this->_writeValAx($objWriter,$plotArea,$yAxisLabel,$chartType,$id1,$id2,$valIsMultiLevelSeries); |
---|
363 | } |
---|
364 | |
---|
365 | $objWriter->endElement(); |
---|
366 | } |
---|
367 | |
---|
368 | /** |
---|
369 | * Write Data Labels |
---|
370 | * |
---|
371 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
372 | * @param PHPExcel_Chart_Layout $chartLayout Chart layout |
---|
373 | * @throws PHPExcel_Writer_Exception |
---|
374 | */ |
---|
375 | private function _writeDataLbls($objWriter, $chartLayout) |
---|
376 | { |
---|
377 | $objWriter->startElement('c:dLbls'); |
---|
378 | |
---|
379 | $objWriter->startElement('c:showLegendKey'); |
---|
380 | $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey(); |
---|
381 | $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1) ); |
---|
382 | $objWriter->endElement(); |
---|
383 | |
---|
384 | |
---|
385 | $objWriter->startElement('c:showVal'); |
---|
386 | $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal(); |
---|
387 | $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1) ); |
---|
388 | $objWriter->endElement(); |
---|
389 | |
---|
390 | $objWriter->startElement('c:showCatName'); |
---|
391 | $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName(); |
---|
392 | $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1) ); |
---|
393 | $objWriter->endElement(); |
---|
394 | |
---|
395 | $objWriter->startElement('c:showSerName'); |
---|
396 | $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName(); |
---|
397 | $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1) ); |
---|
398 | $objWriter->endElement(); |
---|
399 | |
---|
400 | $objWriter->startElement('c:showPercent'); |
---|
401 | $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent(); |
---|
402 | $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1) ); |
---|
403 | $objWriter->endElement(); |
---|
404 | |
---|
405 | $objWriter->startElement('c:showBubbleSize'); |
---|
406 | $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize(); |
---|
407 | $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1) ); |
---|
408 | $objWriter->endElement(); |
---|
409 | |
---|
410 | $objWriter->startElement('c:showLeaderLines'); |
---|
411 | $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines(); |
---|
412 | $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1) ); |
---|
413 | $objWriter->endElement(); |
---|
414 | |
---|
415 | $objWriter->endElement(); |
---|
416 | } |
---|
417 | |
---|
418 | /** |
---|
419 | * Write Category Axis |
---|
420 | * |
---|
421 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
422 | * @param PHPExcel_Chart_PlotArea $plotArea |
---|
423 | * @param PHPExcel_Chart_Title $xAxisLabel |
---|
424 | * @param string $groupType Chart type |
---|
425 | * @param string $id1 |
---|
426 | * @param string $id2 |
---|
427 | * @param boolean $isMultiLevelSeries |
---|
428 | * @throws PHPExcel_Writer_Exception |
---|
429 | */ |
---|
430 | private function _writeCatAx($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries) |
---|
431 | { |
---|
432 | $objWriter->startElement('c:catAx'); |
---|
433 | |
---|
434 | if ($id1 > 0) { |
---|
435 | $objWriter->startElement('c:axId'); |
---|
436 | $objWriter->writeAttribute('val', $id1); |
---|
437 | $objWriter->endElement(); |
---|
438 | } |
---|
439 | |
---|
440 | $objWriter->startElement('c:scaling'); |
---|
441 | $objWriter->startElement('c:orientation'); |
---|
442 | $objWriter->writeAttribute('val', "minMax"); |
---|
443 | $objWriter->endElement(); |
---|
444 | $objWriter->endElement(); |
---|
445 | |
---|
446 | $objWriter->startElement('c:delete'); |
---|
447 | $objWriter->writeAttribute('val', 0); |
---|
448 | $objWriter->endElement(); |
---|
449 | |
---|
450 | $objWriter->startElement('c:axPos'); |
---|
451 | $objWriter->writeAttribute('val', "b"); |
---|
452 | $objWriter->endElement(); |
---|
453 | |
---|
454 | if (!is_null($xAxisLabel)) { |
---|
455 | $objWriter->startElement('c:title'); |
---|
456 | $objWriter->startElement('c:tx'); |
---|
457 | $objWriter->startElement('c:rich'); |
---|
458 | |
---|
459 | $objWriter->startElement('a:bodyPr'); |
---|
460 | $objWriter->endElement(); |
---|
461 | |
---|
462 | $objWriter->startElement('a:lstStyle'); |
---|
463 | $objWriter->endElement(); |
---|
464 | |
---|
465 | $objWriter->startElement('a:p'); |
---|
466 | $objWriter->startElement('a:r'); |
---|
467 | |
---|
468 | $caption = $xAxisLabel->getCaption(); |
---|
469 | if (is_array($caption)) |
---|
470 | $caption = $caption[0]; |
---|
471 | $objWriter->startElement('a:t'); |
---|
472 | // $objWriter->writeAttribute('xml:space', 'preserve'); |
---|
473 | $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $caption )); |
---|
474 | $objWriter->endElement(); |
---|
475 | |
---|
476 | $objWriter->endElement(); |
---|
477 | $objWriter->endElement(); |
---|
478 | $objWriter->endElement(); |
---|
479 | $objWriter->endElement(); |
---|
480 | |
---|
481 | $layout = $xAxisLabel->getLayout(); |
---|
482 | $this->_writeLayout($layout, $objWriter); |
---|
483 | |
---|
484 | $objWriter->startElement('c:overlay'); |
---|
485 | $objWriter->writeAttribute('val', 0); |
---|
486 | $objWriter->endElement(); |
---|
487 | |
---|
488 | $objWriter->endElement(); |
---|
489 | |
---|
490 | } |
---|
491 | |
---|
492 | $objWriter->startElement('c:numFmt'); |
---|
493 | $objWriter->writeAttribute('formatCode', "General"); |
---|
494 | $objWriter->writeAttribute('sourceLinked', 1); |
---|
495 | $objWriter->endElement(); |
---|
496 | |
---|
497 | $objWriter->startElement('c:majorTickMark'); |
---|
498 | $objWriter->writeAttribute('val', "out"); |
---|
499 | $objWriter->endElement(); |
---|
500 | |
---|
501 | $objWriter->startElement('c:minorTickMark'); |
---|
502 | $objWriter->writeAttribute('val', "none"); |
---|
503 | $objWriter->endElement(); |
---|
504 | |
---|
505 | $objWriter->startElement('c:tickLblPos'); |
---|
506 | $objWriter->writeAttribute('val', "nextTo"); |
---|
507 | $objWriter->endElement(); |
---|
508 | |
---|
509 | if ($id2 > 0) { |
---|
510 | $objWriter->startElement('c:crossAx'); |
---|
511 | $objWriter->writeAttribute('val', $id2); |
---|
512 | $objWriter->endElement(); |
---|
513 | |
---|
514 | $objWriter->startElement('c:crosses'); |
---|
515 | $objWriter->writeAttribute('val', "autoZero"); |
---|
516 | $objWriter->endElement(); |
---|
517 | } |
---|
518 | |
---|
519 | $objWriter->startElement('c:auto'); |
---|
520 | $objWriter->writeAttribute('val', 1); |
---|
521 | $objWriter->endElement(); |
---|
522 | |
---|
523 | $objWriter->startElement('c:lblAlgn'); |
---|
524 | $objWriter->writeAttribute('val', "ctr"); |
---|
525 | $objWriter->endElement(); |
---|
526 | |
---|
527 | $objWriter->startElement('c:lblOffset'); |
---|
528 | $objWriter->writeAttribute('val', 100); |
---|
529 | $objWriter->endElement(); |
---|
530 | |
---|
531 | if ($isMultiLevelSeries) { |
---|
532 | $objWriter->startElement('c:noMultiLvlLbl'); |
---|
533 | $objWriter->writeAttribute('val', 0); |
---|
534 | $objWriter->endElement(); |
---|
535 | } |
---|
536 | $objWriter->endElement(); |
---|
537 | |
---|
538 | } |
---|
539 | |
---|
540 | |
---|
541 | /** |
---|
542 | * Write Value Axis |
---|
543 | * |
---|
544 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
545 | * @param PHPExcel_Chart_PlotArea $plotArea |
---|
546 | * @param PHPExcel_Chart_Title $yAxisLabel |
---|
547 | * @param string $groupType Chart type |
---|
548 | * @param string $id1 |
---|
549 | * @param string $id2 |
---|
550 | * @param boolean $isMultiLevelSeries |
---|
551 | * @throws PHPExcel_Writer_Exception |
---|
552 | */ |
---|
553 | private function _writeValAx($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries) |
---|
554 | { |
---|
555 | $objWriter->startElement('c:valAx'); |
---|
556 | |
---|
557 | if ($id2 > 0) { |
---|
558 | $objWriter->startElement('c:axId'); |
---|
559 | $objWriter->writeAttribute('val', $id2); |
---|
560 | $objWriter->endElement(); |
---|
561 | } |
---|
562 | |
---|
563 | $objWriter->startElement('c:scaling'); |
---|
564 | $objWriter->startElement('c:orientation'); |
---|
565 | $objWriter->writeAttribute('val', "minMax"); |
---|
566 | $objWriter->endElement(); |
---|
567 | $objWriter->endElement(); |
---|
568 | |
---|
569 | $objWriter->startElement('c:delete'); |
---|
570 | $objWriter->writeAttribute('val', 0); |
---|
571 | $objWriter->endElement(); |
---|
572 | |
---|
573 | $objWriter->startElement('c:axPos'); |
---|
574 | $objWriter->writeAttribute('val', "l"); |
---|
575 | $objWriter->endElement(); |
---|
576 | |
---|
577 | $objWriter->startElement('c:majorGridlines'); |
---|
578 | $objWriter->endElement(); |
---|
579 | |
---|
580 | if (!is_null($yAxisLabel)) { |
---|
581 | $objWriter->startElement('c:title'); |
---|
582 | $objWriter->startElement('c:tx'); |
---|
583 | $objWriter->startElement('c:rich'); |
---|
584 | |
---|
585 | $objWriter->startElement('a:bodyPr'); |
---|
586 | $objWriter->endElement(); |
---|
587 | |
---|
588 | $objWriter->startElement('a:lstStyle'); |
---|
589 | $objWriter->endElement(); |
---|
590 | |
---|
591 | $objWriter->startElement('a:p'); |
---|
592 | $objWriter->startElement('a:r'); |
---|
593 | |
---|
594 | $caption = $yAxisLabel->getCaption(); |
---|
595 | if (is_array($caption)) |
---|
596 | $caption = $caption[0]; |
---|
597 | $objWriter->startElement('a:t'); |
---|
598 | // $objWriter->writeAttribute('xml:space', 'preserve'); |
---|
599 | $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML( $caption )); |
---|
600 | $objWriter->endElement(); |
---|
601 | |
---|
602 | $objWriter->endElement(); |
---|
603 | $objWriter->endElement(); |
---|
604 | $objWriter->endElement(); |
---|
605 | $objWriter->endElement(); |
---|
606 | |
---|
607 | if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { |
---|
608 | $layout = $yAxisLabel->getLayout(); |
---|
609 | $this->_writeLayout($layout, $objWriter); |
---|
610 | } |
---|
611 | |
---|
612 | $objWriter->startElement('c:overlay'); |
---|
613 | $objWriter->writeAttribute('val', 0); |
---|
614 | $objWriter->endElement(); |
---|
615 | |
---|
616 | $objWriter->endElement(); |
---|
617 | } |
---|
618 | |
---|
619 | $objWriter->startElement('c:numFmt'); |
---|
620 | $objWriter->writeAttribute('formatCode', "General"); |
---|
621 | $objWriter->writeAttribute('sourceLinked', 1); |
---|
622 | $objWriter->endElement(); |
---|
623 | |
---|
624 | $objWriter->startElement('c:majorTickMark'); |
---|
625 | $objWriter->writeAttribute('val', "out"); |
---|
626 | $objWriter->endElement(); |
---|
627 | |
---|
628 | $objWriter->startElement('c:minorTickMark'); |
---|
629 | $objWriter->writeAttribute('val', "none"); |
---|
630 | $objWriter->endElement(); |
---|
631 | |
---|
632 | $objWriter->startElement('c:tickLblPos'); |
---|
633 | $objWriter->writeAttribute('val', "nextTo"); |
---|
634 | $objWriter->endElement(); |
---|
635 | |
---|
636 | if ($id1 > 0) { |
---|
637 | $objWriter->startElement('c:crossAx'); |
---|
638 | $objWriter->writeAttribute('val', $id2); |
---|
639 | $objWriter->endElement(); |
---|
640 | |
---|
641 | $objWriter->startElement('c:crosses'); |
---|
642 | $objWriter->writeAttribute('val', "autoZero"); |
---|
643 | $objWriter->endElement(); |
---|
644 | |
---|
645 | $objWriter->startElement('c:crossBetween'); |
---|
646 | $objWriter->writeAttribute('val', "midCat"); |
---|
647 | $objWriter->endElement(); |
---|
648 | } |
---|
649 | |
---|
650 | if ($isMultiLevelSeries) { |
---|
651 | if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { |
---|
652 | $objWriter->startElement('c:noMultiLvlLbl'); |
---|
653 | $objWriter->writeAttribute('val', 0); |
---|
654 | $objWriter->endElement(); |
---|
655 | } |
---|
656 | } |
---|
657 | $objWriter->endElement(); |
---|
658 | |
---|
659 | } |
---|
660 | |
---|
661 | |
---|
662 | /** |
---|
663 | * Get the data series type(s) for a chart plot series |
---|
664 | * |
---|
665 | * @param PHPExcel_Chart_PlotArea $plotArea |
---|
666 | * @return string|array |
---|
667 | * @throws PHPExcel_Writer_Exception |
---|
668 | */ |
---|
669 | private static function _getChartType($plotArea) |
---|
670 | { |
---|
671 | $groupCount = $plotArea->getPlotGroupCount(); |
---|
672 | |
---|
673 | if ($groupCount == 1) { |
---|
674 | $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType()); |
---|
675 | } else { |
---|
676 | $chartTypes = array(); |
---|
677 | for($i = 0; $i < $groupCount; ++$i) { |
---|
678 | $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType(); |
---|
679 | } |
---|
680 | $chartType = array_unique($chartTypes); |
---|
681 | if (count($chartTypes) == 0) { |
---|
682 | throw new PHPExcel_Writer_Exception('Chart is not yet implemented'); |
---|
683 | } |
---|
684 | } |
---|
685 | |
---|
686 | return $chartType; |
---|
687 | } |
---|
688 | |
---|
689 | /** |
---|
690 | * Write Plot Group (series of related plots) |
---|
691 | * |
---|
692 | * @param PHPExcel_Chart_DataSeries $plotGroup |
---|
693 | * @param string $groupType Type of plot for dataseries |
---|
694 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
695 | * @param boolean &$catIsMultiLevelSeries Is category a multi-series category |
---|
696 | * @param boolean &$valIsMultiLevelSeries Is value set a multi-series set |
---|
697 | * @param string &$plotGroupingType Type of grouping for multi-series values |
---|
698 | * @param PHPExcel_Worksheet $pSheet |
---|
699 | * @throws PHPExcel_Writer_Exception |
---|
700 | */ |
---|
701 | private function _writePlotGroup( $plotGroup, |
---|
702 | $groupType, |
---|
703 | $objWriter, |
---|
704 | &$catIsMultiLevelSeries, |
---|
705 | &$valIsMultiLevelSeries, |
---|
706 | &$plotGroupingType, |
---|
707 | PHPExcel_Worksheet $pSheet |
---|
708 | ) |
---|
709 | { |
---|
710 | if (is_null($plotGroup)) { |
---|
711 | return; |
---|
712 | } |
---|
713 | |
---|
714 | if (($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART) || |
---|
715 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) { |
---|
716 | $objWriter->startElement('c:barDir'); |
---|
717 | $objWriter->writeAttribute('val', $plotGroup->getPlotDirection()); |
---|
718 | $objWriter->endElement(); |
---|
719 | } |
---|
720 | |
---|
721 | if (!is_null($plotGroup->getPlotGrouping())) { |
---|
722 | $plotGroupingType = $plotGroup->getPlotGrouping(); |
---|
723 | $objWriter->startElement('c:grouping'); |
---|
724 | $objWriter->writeAttribute('val', $plotGroupingType); |
---|
725 | $objWriter->endElement(); |
---|
726 | } |
---|
727 | |
---|
728 | // Get these details before the loop, because we can use the count to check for varyColors |
---|
729 | $plotSeriesOrder = $plotGroup->getPlotOrder(); |
---|
730 | $plotSeriesCount = count($plotSeriesOrder); |
---|
731 | |
---|
732 | if (($groupType !== PHPExcel_Chart_DataSeries::TYPE_RADARCHART) && |
---|
733 | ($groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) { |
---|
734 | |
---|
735 | if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART) { |
---|
736 | if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || |
---|
737 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || |
---|
738 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) || |
---|
739 | ($plotSeriesCount > 1)) { |
---|
740 | $objWriter->startElement('c:varyColors'); |
---|
741 | $objWriter->writeAttribute('val', 1); |
---|
742 | $objWriter->endElement(); |
---|
743 | } else { |
---|
744 | $objWriter->startElement('c:varyColors'); |
---|
745 | $objWriter->writeAttribute('val', 0); |
---|
746 | $objWriter->endElement(); |
---|
747 | } |
---|
748 | } |
---|
749 | } |
---|
750 | |
---|
751 | foreach($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) { |
---|
752 | $objWriter->startElement('c:ser'); |
---|
753 | |
---|
754 | $objWriter->startElement('c:idx'); |
---|
755 | $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesIdx); |
---|
756 | $objWriter->endElement(); |
---|
757 | |
---|
758 | $objWriter->startElement('c:order'); |
---|
759 | $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesRef); |
---|
760 | $objWriter->endElement(); |
---|
761 | |
---|
762 | if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || |
---|
763 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || |
---|
764 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { |
---|
765 | |
---|
766 | $objWriter->startElement('c:dPt'); |
---|
767 | $objWriter->startElement('c:idx'); |
---|
768 | $objWriter->writeAttribute('val', 3); |
---|
769 | $objWriter->endElement(); |
---|
770 | |
---|
771 | $objWriter->startElement('c:bubble3D'); |
---|
772 | $objWriter->writeAttribute('val', 0); |
---|
773 | $objWriter->endElement(); |
---|
774 | |
---|
775 | $objWriter->startElement('c:spPr'); |
---|
776 | $objWriter->startElement('a:solidFill'); |
---|
777 | $objWriter->startElement('a:srgbClr'); |
---|
778 | $objWriter->writeAttribute('val', 'FF9900'); |
---|
779 | $objWriter->endElement(); |
---|
780 | $objWriter->endElement(); |
---|
781 | $objWriter->endElement(); |
---|
782 | $objWriter->endElement(); |
---|
783 | } |
---|
784 | |
---|
785 | // Labels |
---|
786 | $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef); |
---|
787 | if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) { |
---|
788 | $objWriter->startElement('c:tx'); |
---|
789 | $objWriter->startElement('c:strRef'); |
---|
790 | $this->_writePlotSeriesLabel($plotSeriesLabel, $objWriter); |
---|
791 | $objWriter->endElement(); |
---|
792 | $objWriter->endElement(); |
---|
793 | } |
---|
794 | |
---|
795 | // Formatting for the points |
---|
796 | if (($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) || |
---|
797 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) { |
---|
798 | $objWriter->startElement('c:spPr'); |
---|
799 | $objWriter->startElement('a:ln'); |
---|
800 | $objWriter->writeAttribute('w', 12700); |
---|
801 | if ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) { |
---|
802 | $objWriter->startElement('a:noFill'); |
---|
803 | $objWriter->endElement(); |
---|
804 | } |
---|
805 | $objWriter->endElement(); |
---|
806 | $objWriter->endElement(); |
---|
807 | } |
---|
808 | |
---|
809 | $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); |
---|
810 | if ($plotSeriesValues) { |
---|
811 | $plotSeriesMarker = $plotSeriesValues->getPointMarker(); |
---|
812 | if ($plotSeriesMarker) { |
---|
813 | $objWriter->startElement('c:marker'); |
---|
814 | $objWriter->startElement('c:symbol'); |
---|
815 | $objWriter->writeAttribute('val', $plotSeriesMarker); |
---|
816 | $objWriter->endElement(); |
---|
817 | |
---|
818 | if ($plotSeriesMarker !== 'none') { |
---|
819 | $objWriter->startElement('c:size'); |
---|
820 | $objWriter->writeAttribute('val', 3); |
---|
821 | $objWriter->endElement(); |
---|
822 | } |
---|
823 | $objWriter->endElement(); |
---|
824 | } |
---|
825 | } |
---|
826 | |
---|
827 | if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || |
---|
828 | ($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D) || |
---|
829 | ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART)) { |
---|
830 | |
---|
831 | $objWriter->startElement('c:invertIfNegative'); |
---|
832 | $objWriter->writeAttribute('val', 0); |
---|
833 | $objWriter->endElement(); |
---|
834 | } |
---|
835 | |
---|
836 | // Category Labels |
---|
837 | $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef); |
---|
838 | if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) { |
---|
839 | $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries(); |
---|
840 | |
---|
841 | if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || |
---|
842 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || |
---|
843 | ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { |
---|
844 | |
---|
845 | if (!is_null($plotGroup->getPlotStyle())) { |
---|
846 | $plotStyle = $plotGroup->getPlotStyle(); |
---|
847 | if ($plotStyle) { |
---|
848 | $objWriter->startElement('c:explosion'); |
---|
849 | $objWriter->writeAttribute('val', 25); |
---|
850 | $objWriter->endElement(); |
---|
851 | } |
---|
852 | } |
---|
853 | } |
---|
854 | |
---|
855 | if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || |
---|
856 | ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) { |
---|
857 | $objWriter->startElement('c:xVal'); |
---|
858 | } else { |
---|
859 | $objWriter->startElement('c:cat'); |
---|
860 | } |
---|
861 | |
---|
862 | $this->_writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str', $pSheet); |
---|
863 | $objWriter->endElement(); |
---|
864 | } |
---|
865 | |
---|
866 | // Values |
---|
867 | if ($plotSeriesValues) { |
---|
868 | $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries(); |
---|
869 | |
---|
870 | if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || |
---|
871 | ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) { |
---|
872 | $objWriter->startElement('c:yVal'); |
---|
873 | } else { |
---|
874 | $objWriter->startElement('c:val'); |
---|
875 | } |
---|
876 | |
---|
877 | $this->_writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num', $pSheet); |
---|
878 | $objWriter->endElement(); |
---|
879 | } |
---|
880 | |
---|
881 | if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { |
---|
882 | $this->_writeBubbles($plotSeriesValues, $objWriter, $pSheet); |
---|
883 | } |
---|
884 | |
---|
885 | $objWriter->endElement(); |
---|
886 | |
---|
887 | } |
---|
888 | |
---|
889 | $this->_seriesIndex += $plotSeriesIdx + 1; |
---|
890 | } |
---|
891 | |
---|
892 | /** |
---|
893 | * Write Plot Series Label |
---|
894 | * |
---|
895 | * @param PHPExcel_Chart_DataSeriesValues $plotSeriesLabel |
---|
896 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
897 | * @throws PHPExcel_Writer_Exception |
---|
898 | */ |
---|
899 | private function _writePlotSeriesLabel($plotSeriesLabel, $objWriter) |
---|
900 | { |
---|
901 | if (is_null($plotSeriesLabel)) { |
---|
902 | return; |
---|
903 | } |
---|
904 | |
---|
905 | $objWriter->startElement('c:f'); |
---|
906 | $objWriter->writeRawData($plotSeriesLabel->getDataSource()); |
---|
907 | $objWriter->endElement(); |
---|
908 | |
---|
909 | $objWriter->startElement('c:strCache'); |
---|
910 | $objWriter->startElement('c:ptCount'); |
---|
911 | $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount() ); |
---|
912 | $objWriter->endElement(); |
---|
913 | |
---|
914 | foreach($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) { |
---|
915 | $objWriter->startElement('c:pt'); |
---|
916 | $objWriter->writeAttribute('idx', $plotLabelKey ); |
---|
917 | |
---|
918 | $objWriter->startElement('c:v'); |
---|
919 | $objWriter->writeRawData( $plotLabelValue ); |
---|
920 | $objWriter->endElement(); |
---|
921 | $objWriter->endElement(); |
---|
922 | } |
---|
923 | $objWriter->endElement(); |
---|
924 | |
---|
925 | } |
---|
926 | |
---|
927 | /** |
---|
928 | * Write Plot Series Values |
---|
929 | * |
---|
930 | * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues |
---|
931 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
932 | * @param string $groupType Type of plot for dataseries |
---|
933 | * @param string $dataType Datatype of series values |
---|
934 | * @param PHPExcel_Worksheet $pSheet |
---|
935 | * @throws PHPExcel_Writer_Exception |
---|
936 | */ |
---|
937 | private function _writePlotSeriesValues( $plotSeriesValues, |
---|
938 | $objWriter, |
---|
939 | $groupType, |
---|
940 | $dataType='str', |
---|
941 | PHPExcel_Worksheet $pSheet |
---|
942 | ) |
---|
943 | { |
---|
944 | if (is_null($plotSeriesValues)) { |
---|
945 | return; |
---|
946 | } |
---|
947 | |
---|
948 | if ($plotSeriesValues->isMultiLevelSeries()) { |
---|
949 | $levelCount = $plotSeriesValues->multiLevelCount(); |
---|
950 | |
---|
951 | $objWriter->startElement('c:multiLvlStrRef'); |
---|
952 | |
---|
953 | $objWriter->startElement('c:f'); |
---|
954 | $objWriter->writeRawData( $plotSeriesValues->getDataSource() ); |
---|
955 | $objWriter->endElement(); |
---|
956 | |
---|
957 | $objWriter->startElement('c:multiLvlStrCache'); |
---|
958 | |
---|
959 | $objWriter->startElement('c:ptCount'); |
---|
960 | $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() ); |
---|
961 | $objWriter->endElement(); |
---|
962 | |
---|
963 | for ($level = 0; $level < $levelCount; ++$level) { |
---|
964 | $objWriter->startElement('c:lvl'); |
---|
965 | |
---|
966 | foreach($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) { |
---|
967 | if (isset($plotSeriesValue[$level])) { |
---|
968 | $objWriter->startElement('c:pt'); |
---|
969 | $objWriter->writeAttribute('idx', $plotSeriesKey ); |
---|
970 | |
---|
971 | $objWriter->startElement('c:v'); |
---|
972 | $objWriter->writeRawData( $plotSeriesValue[$level] ); |
---|
973 | $objWriter->endElement(); |
---|
974 | $objWriter->endElement(); |
---|
975 | } |
---|
976 | } |
---|
977 | |
---|
978 | $objWriter->endElement(); |
---|
979 | } |
---|
980 | |
---|
981 | $objWriter->endElement(); |
---|
982 | |
---|
983 | $objWriter->endElement(); |
---|
984 | } else { |
---|
985 | $objWriter->startElement('c:'.$dataType.'Ref'); |
---|
986 | |
---|
987 | $objWriter->startElement('c:f'); |
---|
988 | $objWriter->writeRawData( $plotSeriesValues->getDataSource() ); |
---|
989 | $objWriter->endElement(); |
---|
990 | |
---|
991 | $objWriter->startElement('c:'.$dataType.'Cache'); |
---|
992 | |
---|
993 | if (($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART) && |
---|
994 | ($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && |
---|
995 | ($groupType != PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { |
---|
996 | |
---|
997 | if (($plotSeriesValues->getFormatCode() !== NULL) && |
---|
998 | ($plotSeriesValues->getFormatCode() !== '')) { |
---|
999 | $objWriter->startElement('c:formatCode'); |
---|
1000 | $objWriter->writeRawData( $plotSeriesValues->getFormatCode() ); |
---|
1001 | $objWriter->endElement(); |
---|
1002 | } |
---|
1003 | } |
---|
1004 | |
---|
1005 | $objWriter->startElement('c:ptCount'); |
---|
1006 | $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() ); |
---|
1007 | $objWriter->endElement(); |
---|
1008 | |
---|
1009 | $dataValues = $plotSeriesValues->getDataValues(); |
---|
1010 | if (!empty($dataValues)) { |
---|
1011 | if (is_array($dataValues)) { |
---|
1012 | foreach($dataValues as $plotSeriesKey => $plotSeriesValue) { |
---|
1013 | $objWriter->startElement('c:pt'); |
---|
1014 | $objWriter->writeAttribute('idx', $plotSeriesKey ); |
---|
1015 | |
---|
1016 | $objWriter->startElement('c:v'); |
---|
1017 | $objWriter->writeRawData( $plotSeriesValue ); |
---|
1018 | $objWriter->endElement(); |
---|
1019 | $objWriter->endElement(); |
---|
1020 | } |
---|
1021 | } |
---|
1022 | } |
---|
1023 | |
---|
1024 | $objWriter->endElement(); |
---|
1025 | |
---|
1026 | $objWriter->endElement(); |
---|
1027 | } |
---|
1028 | } |
---|
1029 | |
---|
1030 | /** |
---|
1031 | * Write Bubble Chart Details |
---|
1032 | * |
---|
1033 | * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues |
---|
1034 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
1035 | * @throws PHPExcel_Writer_Exception |
---|
1036 | */ |
---|
1037 | private function _writeBubbles($plotSeriesValues, $objWriter, PHPExcel_Worksheet $pSheet) |
---|
1038 | { |
---|
1039 | if (is_null($plotSeriesValues)) { |
---|
1040 | return; |
---|
1041 | } |
---|
1042 | |
---|
1043 | $objWriter->startElement('c:bubbleSize'); |
---|
1044 | $objWriter->startElement('c:numLit'); |
---|
1045 | |
---|
1046 | $objWriter->startElement('c:formatCode'); |
---|
1047 | $objWriter->writeRawData( 'General' ); |
---|
1048 | $objWriter->endElement(); |
---|
1049 | |
---|
1050 | $objWriter->startElement('c:ptCount'); |
---|
1051 | $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount() ); |
---|
1052 | $objWriter->endElement(); |
---|
1053 | |
---|
1054 | $dataValues = $plotSeriesValues->getDataValues(); |
---|
1055 | if (!empty($dataValues)) { |
---|
1056 | if (is_array($dataValues)) { |
---|
1057 | foreach($dataValues as $plotSeriesKey => $plotSeriesValue) { |
---|
1058 | $objWriter->startElement('c:pt'); |
---|
1059 | $objWriter->writeAttribute('idx', $plotSeriesKey ); |
---|
1060 | $objWriter->startElement('c:v'); |
---|
1061 | $objWriter->writeRawData( 1 ); |
---|
1062 | $objWriter->endElement(); |
---|
1063 | $objWriter->endElement(); |
---|
1064 | } |
---|
1065 | } |
---|
1066 | } |
---|
1067 | |
---|
1068 | $objWriter->endElement(); |
---|
1069 | $objWriter->endElement(); |
---|
1070 | |
---|
1071 | $objWriter->startElement('c:bubble3D'); |
---|
1072 | $objWriter->writeAttribute('val', 0 ); |
---|
1073 | $objWriter->endElement(); |
---|
1074 | } |
---|
1075 | |
---|
1076 | /** |
---|
1077 | * Write Layout |
---|
1078 | * |
---|
1079 | * @param PHPExcel_Chart_Layout $layout |
---|
1080 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
1081 | * @throws PHPExcel_Writer_Exception |
---|
1082 | */ |
---|
1083 | private function _writeLayout(PHPExcel_Chart_Layout $layout = NULL, $objWriter) |
---|
1084 | { |
---|
1085 | $objWriter->startElement('c:layout'); |
---|
1086 | |
---|
1087 | if (!is_null($layout)) { |
---|
1088 | $objWriter->startElement('c:manualLayout'); |
---|
1089 | |
---|
1090 | $layoutTarget = $layout->getLayoutTarget(); |
---|
1091 | if (!is_null($layoutTarget)) { |
---|
1092 | $objWriter->startElement('c:layoutTarget'); |
---|
1093 | $objWriter->writeAttribute('val', $layoutTarget); |
---|
1094 | $objWriter->endElement(); |
---|
1095 | } |
---|
1096 | |
---|
1097 | $xMode = $layout->getXMode(); |
---|
1098 | if (!is_null($xMode)) { |
---|
1099 | $objWriter->startElement('c:xMode'); |
---|
1100 | $objWriter->writeAttribute('val', $xMode); |
---|
1101 | $objWriter->endElement(); |
---|
1102 | } |
---|
1103 | |
---|
1104 | $yMode = $layout->getYMode(); |
---|
1105 | if (!is_null($yMode)) { |
---|
1106 | $objWriter->startElement('c:yMode'); |
---|
1107 | $objWriter->writeAttribute('val', $yMode); |
---|
1108 | $objWriter->endElement(); |
---|
1109 | } |
---|
1110 | |
---|
1111 | $x = $layout->getXPosition(); |
---|
1112 | if (!is_null($x)) { |
---|
1113 | $objWriter->startElement('c:x'); |
---|
1114 | $objWriter->writeAttribute('val', $x); |
---|
1115 | $objWriter->endElement(); |
---|
1116 | } |
---|
1117 | |
---|
1118 | $y = $layout->getYPosition(); |
---|
1119 | if (!is_null($y)) { |
---|
1120 | $objWriter->startElement('c:y'); |
---|
1121 | $objWriter->writeAttribute('val', $y); |
---|
1122 | $objWriter->endElement(); |
---|
1123 | } |
---|
1124 | |
---|
1125 | $w = $layout->getWidth(); |
---|
1126 | if (!is_null($w)) { |
---|
1127 | $objWriter->startElement('c:w'); |
---|
1128 | $objWriter->writeAttribute('val', $w); |
---|
1129 | $objWriter->endElement(); |
---|
1130 | } |
---|
1131 | |
---|
1132 | $h = $layout->getHeight(); |
---|
1133 | if (!is_null($h)) { |
---|
1134 | $objWriter->startElement('c:h'); |
---|
1135 | $objWriter->writeAttribute('val', $h); |
---|
1136 | $objWriter->endElement(); |
---|
1137 | } |
---|
1138 | |
---|
1139 | $objWriter->endElement(); |
---|
1140 | } |
---|
1141 | |
---|
1142 | $objWriter->endElement(); |
---|
1143 | } |
---|
1144 | |
---|
1145 | /** |
---|
1146 | * Write Alternate Content block |
---|
1147 | * |
---|
1148 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
1149 | * @throws PHPExcel_Writer_Exception |
---|
1150 | */ |
---|
1151 | private function _writeAlternateContent($objWriter) |
---|
1152 | { |
---|
1153 | $objWriter->startElement('mc:AlternateContent'); |
---|
1154 | $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); |
---|
1155 | |
---|
1156 | $objWriter->startElement('mc:Choice'); |
---|
1157 | $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'); |
---|
1158 | $objWriter->writeAttribute('Requires', 'c14'); |
---|
1159 | |
---|
1160 | $objWriter->startElement('c14:style'); |
---|
1161 | $objWriter->writeAttribute('val', '102'); |
---|
1162 | $objWriter->endElement(); |
---|
1163 | $objWriter->endElement(); |
---|
1164 | |
---|
1165 | $objWriter->startElement('mc:Fallback'); |
---|
1166 | $objWriter->startElement('c:style'); |
---|
1167 | $objWriter->writeAttribute('val', '2'); |
---|
1168 | $objWriter->endElement(); |
---|
1169 | $objWriter->endElement(); |
---|
1170 | |
---|
1171 | $objWriter->endElement(); |
---|
1172 | } |
---|
1173 | |
---|
1174 | /** |
---|
1175 | * Write Printer Settings |
---|
1176 | * |
---|
1177 | * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer |
---|
1178 | * @throws PHPExcel_Writer_Exception |
---|
1179 | */ |
---|
1180 | private function _writePrintSettings($objWriter) |
---|
1181 | { |
---|
1182 | $objWriter->startElement('c:printSettings'); |
---|
1183 | |
---|
1184 | $objWriter->startElement('c:headerFooter'); |
---|
1185 | $objWriter->endElement(); |
---|
1186 | |
---|
1187 | $objWriter->startElement('c:pageMargins'); |
---|
1188 | $objWriter->writeAttribute('footer', 0.3); |
---|
1189 | $objWriter->writeAttribute('header', 0.3); |
---|
1190 | $objWriter->writeAttribute('r', 0.7); |
---|
1191 | $objWriter->writeAttribute('l', 0.7); |
---|
1192 | $objWriter->writeAttribute('t', 0.75); |
---|
1193 | $objWriter->writeAttribute('b', 0.75); |
---|
1194 | $objWriter->endElement(); |
---|
1195 | |
---|
1196 | $objWriter->startElement('c:pageSetup'); |
---|
1197 | $objWriter->writeAttribute('orientation', "portrait"); |
---|
1198 | $objWriter->endElement(); |
---|
1199 | |
---|
1200 | $objWriter->endElement(); |
---|
1201 | } |
---|
1202 | |
---|
1203 | } |
---|