Total Complexity | 204 |
Total Lines | 1467 |
Duplicated Lines | 0 % |
Coverage | 74.45% |
Changes | 2 | ||
Bugs | 0 | Features | 0 |
Complex classes like Chart often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Chart, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
17 | class Chart extends WriterPart |
||
18 | { |
||
19 | protected $calculateCellValues; |
||
20 | |||
21 | /** |
||
22 | * @var int |
||
23 | */ |
||
24 | private $seriesIndex; |
||
25 | |||
26 | /** |
||
27 | * Write charts to XML format. |
||
28 | * |
||
29 | * @param mixed $calculateCellValues |
||
30 | * |
||
31 | * @return string XML Output |
||
32 | */ |
||
33 | 17 | public function writeChart(\PhpOffice\PhpSpreadsheet\Chart\Chart $chart, $calculateCellValues = true) |
|
102 | } |
||
103 | |||
104 | /** |
||
105 | * Write Chart Title. |
||
106 | */ |
||
107 | 17 | private function writeTitle(XMLWriter $objWriter, ?Title $title = null): void |
|
108 | { |
||
109 | 17 | if ($title === null) { |
|
110 | 3 | return; |
|
111 | } |
||
112 | |||
113 | 15 | $objWriter->startElement('c:title'); |
|
114 | 15 | $objWriter->startElement('c:tx'); |
|
115 | 15 | $objWriter->startElement('c:rich'); |
|
116 | |||
117 | 15 | $objWriter->startElement('a:bodyPr'); |
|
118 | 15 | $objWriter->endElement(); |
|
119 | |||
120 | 15 | $objWriter->startElement('a:lstStyle'); |
|
121 | 15 | $objWriter->endElement(); |
|
122 | |||
123 | 15 | $objWriter->startElement('a:p'); |
|
124 | |||
125 | 15 | $caption = $title->getCaption(); |
|
126 | 15 | if ((is_array($caption)) && (count($caption) > 0)) { |
|
127 | 2 | $caption = $caption[0]; |
|
128 | } |
||
129 | 15 | $this->getParentWriter()->getWriterPartstringtable()->writeRichTextForCharts($objWriter, $caption, 'a'); |
|
130 | |||
131 | 15 | $objWriter->endElement(); |
|
132 | 15 | $objWriter->endElement(); |
|
133 | 15 | $objWriter->endElement(); |
|
134 | |||
135 | 15 | $this->writeLayout($objWriter, $title->getLayout()); |
|
136 | |||
137 | 15 | $objWriter->startElement('c:overlay'); |
|
138 | 15 | $objWriter->writeAttribute('val', 0); |
|
139 | 15 | $objWriter->endElement(); |
|
140 | |||
141 | 15 | $objWriter->endElement(); |
|
142 | 15 | } |
|
143 | |||
144 | /** |
||
145 | * Write Chart Legend. |
||
146 | */ |
||
147 | 17 | private function writeLegend(XMLWriter $objWriter, ?Legend $legend = null): void |
|
148 | { |
||
149 | 17 | if ($legend === null) { |
|
150 | 5 | return; |
|
151 | } |
||
152 | |||
153 | 15 | $objWriter->startElement('c:legend'); |
|
154 | |||
155 | 15 | $objWriter->startElement('c:legendPos'); |
|
156 | 15 | $objWriter->writeAttribute('val', $legend->getPosition()); |
|
157 | 15 | $objWriter->endElement(); |
|
158 | |||
159 | 15 | $this->writeLayout($objWriter, $legend->getLayout()); |
|
160 | |||
161 | 15 | $objWriter->startElement('c:overlay'); |
|
162 | 15 | $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0'); |
|
163 | 15 | $objWriter->endElement(); |
|
164 | |||
165 | 15 | $objWriter->startElement('c:txPr'); |
|
166 | 15 | $objWriter->startElement('a:bodyPr'); |
|
167 | 15 | $objWriter->endElement(); |
|
168 | |||
169 | 15 | $objWriter->startElement('a:lstStyle'); |
|
170 | 15 | $objWriter->endElement(); |
|
171 | |||
172 | 15 | $objWriter->startElement('a:p'); |
|
173 | 15 | $objWriter->startElement('a:pPr'); |
|
174 | 15 | $objWriter->writeAttribute('rtl', 0); |
|
175 | |||
176 | 15 | $objWriter->startElement('a:defRPr'); |
|
177 | 15 | $objWriter->endElement(); |
|
178 | 15 | $objWriter->endElement(); |
|
179 | |||
180 | 15 | $objWriter->startElement('a:endParaRPr'); |
|
181 | 15 | $objWriter->writeAttribute('lang', 'en-US'); |
|
182 | 15 | $objWriter->endElement(); |
|
183 | |||
184 | 15 | $objWriter->endElement(); |
|
185 | 15 | $objWriter->endElement(); |
|
186 | |||
187 | 15 | $objWriter->endElement(); |
|
188 | 15 | } |
|
189 | |||
190 | /** |
||
191 | * Write Chart Plot Area. |
||
192 | */ |
||
193 | 17 | private function writePlotArea(XMLWriter $objWriter, PlotArea $plotArea, ?Title $xAxisLabel = null, ?Title $yAxisLabel = null, ?Axis $xAxis = null, ?Axis $yAxis = null, ?GridLines $majorGridlines = null, ?GridLines $minorGridlines = null): void |
|
316 | 17 | } |
|
317 | |||
318 | /** |
||
319 | * Write Data Labels. |
||
320 | */ |
||
321 | 17 | private function writeDataLabels(XMLWriter $objWriter, ?Layout $chartLayout = null): void |
|
361 | 17 | } |
|
362 | |||
363 | /** |
||
364 | * Write Category Axis. |
||
365 | * |
||
366 | * @param string $id1 |
||
367 | * @param string $id2 |
||
368 | * @param bool $isMultiLevelSeries |
||
369 | */ |
||
370 | 15 | private function writeCategoryAxis(XMLWriter $objWriter, ?Title $xAxisLabel, $id1, $id2, $isMultiLevelSeries, Axis $yAxis): void |
|
371 | { |
||
372 | 15 | $objWriter->startElement('c:catAx'); |
|
373 | |||
374 | 15 | if ($id1 > 0) { |
|
375 | 15 | $objWriter->startElement('c:axId'); |
|
376 | 15 | $objWriter->writeAttribute('val', $id1); |
|
377 | 15 | $objWriter->endElement(); |
|
378 | } |
||
379 | |||
380 | 15 | $objWriter->startElement('c:scaling'); |
|
381 | 15 | $objWriter->startElement('c:orientation'); |
|
382 | 15 | $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation')); |
|
383 | 15 | $objWriter->endElement(); |
|
384 | 15 | $objWriter->endElement(); |
|
385 | |||
386 | 15 | $objWriter->startElement('c:delete'); |
|
387 | 15 | $objWriter->writeAttribute('val', 0); |
|
388 | 15 | $objWriter->endElement(); |
|
389 | |||
390 | 15 | $objWriter->startElement('c:axPos'); |
|
391 | 15 | $objWriter->writeAttribute('val', 'b'); |
|
392 | 15 | $objWriter->endElement(); |
|
393 | |||
394 | 15 | if ($xAxisLabel !== null) { |
|
395 | 3 | $objWriter->startElement('c:title'); |
|
396 | 3 | $objWriter->startElement('c:tx'); |
|
397 | 3 | $objWriter->startElement('c:rich'); |
|
398 | |||
399 | 3 | $objWriter->startElement('a:bodyPr'); |
|
400 | 3 | $objWriter->endElement(); |
|
401 | |||
402 | 3 | $objWriter->startElement('a:lstStyle'); |
|
403 | 3 | $objWriter->endElement(); |
|
404 | |||
405 | 3 | $objWriter->startElement('a:p'); |
|
406 | 3 | $objWriter->startElement('a:r'); |
|
407 | |||
408 | 3 | $caption = $xAxisLabel->getCaption(); |
|
409 | 3 | if (is_array($caption)) { |
|
410 | 1 | $caption = $caption[0]; |
|
411 | } |
||
412 | 3 | $objWriter->startElement('a:t'); |
|
413 | 3 | $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($caption)); |
|
414 | 3 | $objWriter->endElement(); |
|
415 | |||
416 | 3 | $objWriter->endElement(); |
|
417 | 3 | $objWriter->endElement(); |
|
418 | 3 | $objWriter->endElement(); |
|
419 | 3 | $objWriter->endElement(); |
|
420 | |||
421 | 3 | $layout = $xAxisLabel->getLayout(); |
|
422 | 3 | $this->writeLayout($objWriter, $layout); |
|
423 | |||
424 | 3 | $objWriter->startElement('c:overlay'); |
|
425 | 3 | $objWriter->writeAttribute('val', 0); |
|
426 | 3 | $objWriter->endElement(); |
|
427 | |||
428 | 3 | $objWriter->endElement(); |
|
429 | } |
||
430 | |||
431 | 15 | $objWriter->startElement('c:numFmt'); |
|
432 | 15 | $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat()); |
|
433 | 15 | $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked()); |
|
434 | 15 | $objWriter->endElement(); |
|
435 | |||
436 | 15 | $objWriter->startElement('c:majorTickMark'); |
|
437 | 15 | $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark')); |
|
438 | 15 | $objWriter->endElement(); |
|
439 | |||
440 | 15 | $objWriter->startElement('c:minorTickMark'); |
|
441 | 15 | $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark')); |
|
442 | 15 | $objWriter->endElement(); |
|
443 | |||
444 | 15 | $objWriter->startElement('c:tickLblPos'); |
|
445 | 15 | $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels')); |
|
446 | 15 | $objWriter->endElement(); |
|
447 | |||
448 | 15 | if ($id2 > 0) { |
|
449 | 15 | $objWriter->startElement('c:crossAx'); |
|
450 | 15 | $objWriter->writeAttribute('val', $id2); |
|
451 | 15 | $objWriter->endElement(); |
|
452 | |||
453 | 15 | $objWriter->startElement('c:crosses'); |
|
454 | 15 | $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses')); |
|
455 | 15 | $objWriter->endElement(); |
|
456 | } |
||
457 | |||
458 | 15 | $objWriter->startElement('c:auto'); |
|
459 | 15 | $objWriter->writeAttribute('val', 1); |
|
460 | 15 | $objWriter->endElement(); |
|
461 | |||
462 | 15 | $objWriter->startElement('c:lblAlgn'); |
|
463 | 15 | $objWriter->writeAttribute('val', 'ctr'); |
|
464 | 15 | $objWriter->endElement(); |
|
465 | |||
466 | 15 | $objWriter->startElement('c:lblOffset'); |
|
467 | 15 | $objWriter->writeAttribute('val', 100); |
|
468 | 15 | $objWriter->endElement(); |
|
469 | |||
470 | 15 | if ($isMultiLevelSeries) { |
|
471 | 2 | $objWriter->startElement('c:noMultiLvlLbl'); |
|
472 | 2 | $objWriter->writeAttribute('val', 0); |
|
473 | 2 | $objWriter->endElement(); |
|
474 | } |
||
475 | 15 | $objWriter->endElement(); |
|
476 | 15 | } |
|
477 | |||
478 | /** |
||
479 | * Write Value Axis. |
||
480 | * |
||
481 | * @param null|string $groupType Chart type |
||
482 | * @param string $id1 |
||
483 | * @param string $id2 |
||
484 | * @param bool $isMultiLevelSeries |
||
485 | */ |
||
486 | 15 | private function writeValueAxis(XMLWriter $objWriter, ?Title $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, Axis $xAxis, GridLines $majorGridlines, GridLines $minorGridlines): void |
|
487 | { |
||
488 | 15 | $objWriter->startElement('c:valAx'); |
|
489 | |||
490 | 15 | if ($id2 > 0) { |
|
491 | 15 | $objWriter->startElement('c:axId'); |
|
492 | 15 | $objWriter->writeAttribute('val', $id2); |
|
493 | 15 | $objWriter->endElement(); |
|
494 | } |
||
495 | |||
496 | 15 | $objWriter->startElement('c:scaling'); |
|
497 | |||
498 | 15 | if ($xAxis->getAxisOptionsProperty('maximum') !== null) { |
|
499 | $objWriter->startElement('c:max'); |
||
500 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum')); |
||
501 | $objWriter->endElement(); |
||
502 | } |
||
503 | |||
504 | 15 | if ($xAxis->getAxisOptionsProperty('minimum') !== null) { |
|
505 | $objWriter->startElement('c:min'); |
||
506 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum')); |
||
507 | $objWriter->endElement(); |
||
508 | } |
||
509 | |||
510 | 15 | $objWriter->startElement('c:orientation'); |
|
511 | 15 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation')); |
|
512 | |||
513 | 15 | $objWriter->endElement(); |
|
514 | 15 | $objWriter->endElement(); |
|
515 | |||
516 | 15 | $objWriter->startElement('c:delete'); |
|
517 | 15 | $objWriter->writeAttribute('val', 0); |
|
518 | 15 | $objWriter->endElement(); |
|
519 | |||
520 | 15 | $objWriter->startElement('c:axPos'); |
|
521 | 15 | $objWriter->writeAttribute('val', 'l'); |
|
522 | 15 | $objWriter->endElement(); |
|
523 | |||
524 | 15 | $objWriter->startElement('c:majorGridlines'); |
|
525 | 15 | $objWriter->startElement('c:spPr'); |
|
526 | |||
527 | 15 | if ($majorGridlines->getLineColorProperty('value') !== null) { |
|
528 | $objWriter->startElement('a:ln'); |
||
529 | $objWriter->writeAttribute('w', $majorGridlines->getLineStyleProperty('width')); |
||
530 | $objWriter->startElement('a:solidFill'); |
||
531 | $objWriter->startElement("a:{$majorGridlines->getLineColorProperty('type')}"); |
||
532 | $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('value')); |
||
533 | $objWriter->startElement('a:alpha'); |
||
534 | $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('alpha')); |
||
535 | $objWriter->endElement(); //end alpha |
||
536 | $objWriter->endElement(); //end srgbClr |
||
537 | $objWriter->endElement(); //end solidFill |
||
538 | |||
539 | $objWriter->startElement('a:prstDash'); |
||
540 | $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash')); |
||
541 | $objWriter->endElement(); |
||
542 | |||
543 | if ($majorGridlines->getLineStyleProperty('join') == 'miter') { |
||
544 | $objWriter->startElement('a:miter'); |
||
545 | $objWriter->writeAttribute('lim', '800000'); |
||
546 | $objWriter->endElement(); |
||
547 | } else { |
||
548 | $objWriter->startElement('a:bevel'); |
||
549 | $objWriter->endElement(); |
||
550 | } |
||
551 | |||
552 | if ($majorGridlines->getLineStyleProperty(['arrow', 'head', 'type']) !== null) { |
||
553 | $objWriter->startElement('a:headEnd'); |
||
554 | $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(['arrow', 'head', 'type'])); |
||
555 | $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('head', 'w')); |
||
556 | $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('head', 'len')); |
||
557 | $objWriter->endElement(); |
||
558 | } |
||
559 | |||
560 | if ($majorGridlines->getLineStyleProperty(['arrow', 'end', 'type']) !== null) { |
||
561 | $objWriter->startElement('a:tailEnd'); |
||
562 | $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(['arrow', 'end', 'type'])); |
||
563 | $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('end', 'w')); |
||
564 | $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('end', 'len')); |
||
565 | $objWriter->endElement(); |
||
566 | } |
||
567 | $objWriter->endElement(); //end ln |
||
568 | } |
||
569 | 15 | $objWriter->startElement('a:effectLst'); |
|
570 | |||
571 | 15 | if ($majorGridlines->getGlowSize() !== null) { |
|
572 | $objWriter->startElement('a:glow'); |
||
573 | $objWriter->writeAttribute('rad', $majorGridlines->getGlowSize()); |
||
574 | $objWriter->startElement("a:{$majorGridlines->getGlowColor('type')}"); |
||
575 | $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('value')); |
||
576 | $objWriter->startElement('a:alpha'); |
||
577 | $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('alpha')); |
||
578 | $objWriter->endElement(); //end alpha |
||
579 | $objWriter->endElement(); //end schemeClr |
||
580 | $objWriter->endElement(); //end glow |
||
581 | } |
||
582 | |||
583 | 15 | if ($majorGridlines->getShadowProperty('presets') !== null) { |
|
584 | $objWriter->startElement("a:{$majorGridlines->getShadowProperty('effect')}"); |
||
585 | if ($majorGridlines->getShadowProperty('blur') !== null) { |
||
586 | $objWriter->writeAttribute('blurRad', $majorGridlines->getShadowProperty('blur')); |
||
587 | } |
||
588 | if ($majorGridlines->getShadowProperty('distance') !== null) { |
||
589 | $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance')); |
||
590 | } |
||
591 | if ($majorGridlines->getShadowProperty('direction') !== null) { |
||
592 | $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction')); |
||
593 | } |
||
594 | if ($majorGridlines->getShadowProperty('algn') !== null) { |
||
595 | $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn')); |
||
596 | } |
||
597 | if ($majorGridlines->getShadowProperty(['size', 'sx']) !== null) { |
||
598 | $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(['size', 'sx'])); |
||
599 | } |
||
600 | if ($majorGridlines->getShadowProperty(['size', 'sy']) !== null) { |
||
601 | $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(['size', 'sy'])); |
||
602 | } |
||
603 | if ($majorGridlines->getShadowProperty(['size', 'kx']) !== null) { |
||
604 | $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(['size', 'kx'])); |
||
605 | } |
||
606 | if ($majorGridlines->getShadowProperty('rotWithShape') !== null) { |
||
607 | $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape')); |
||
608 | } |
||
609 | $objWriter->startElement("a:{$majorGridlines->getShadowProperty(['color', 'type'])}"); |
||
610 | $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(['color', 'value'])); |
||
611 | |||
612 | $objWriter->startElement('a:alpha'); |
||
613 | $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(['color', 'alpha'])); |
||
614 | $objWriter->endElement(); //end alpha |
||
615 | |||
616 | $objWriter->endElement(); //end color:type |
||
617 | $objWriter->endElement(); //end shadow |
||
618 | } |
||
619 | |||
620 | 15 | if ($majorGridlines->getSoftEdgesSize() !== null) { |
|
621 | $objWriter->startElement('a:softEdge'); |
||
622 | $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize()); |
||
623 | $objWriter->endElement(); //end softEdge |
||
624 | } |
||
625 | |||
626 | 15 | $objWriter->endElement(); //end effectLst |
|
627 | 15 | $objWriter->endElement(); //end spPr |
|
628 | 15 | $objWriter->endElement(); //end majorGridLines |
|
629 | |||
630 | 15 | if ($minorGridlines->getObjectState()) { |
|
631 | $objWriter->startElement('c:minorGridlines'); |
||
632 | $objWriter->startElement('c:spPr'); |
||
633 | |||
634 | if ($minorGridlines->getLineColorProperty('value') !== null) { |
||
635 | $objWriter->startElement('a:ln'); |
||
636 | $objWriter->writeAttribute('w', $minorGridlines->getLineStyleProperty('width')); |
||
637 | $objWriter->startElement('a:solidFill'); |
||
638 | $objWriter->startElement("a:{$minorGridlines->getLineColorProperty('type')}"); |
||
639 | $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('value')); |
||
640 | $objWriter->startElement('a:alpha'); |
||
641 | $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('alpha')); |
||
642 | $objWriter->endElement(); //end alpha |
||
643 | $objWriter->endElement(); //end srgbClr |
||
644 | $objWriter->endElement(); //end solidFill |
||
645 | |||
646 | $objWriter->startElement('a:prstDash'); |
||
647 | $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash')); |
||
648 | $objWriter->endElement(); |
||
649 | |||
650 | if ($minorGridlines->getLineStyleProperty('join') == 'miter') { |
||
651 | $objWriter->startElement('a:miter'); |
||
652 | $objWriter->writeAttribute('lim', '800000'); |
||
653 | $objWriter->endElement(); |
||
654 | } else { |
||
655 | $objWriter->startElement('a:bevel'); |
||
656 | $objWriter->endElement(); |
||
657 | } |
||
658 | |||
659 | if ($minorGridlines->getLineStyleProperty(['arrow', 'head', 'type']) !== null) { |
||
660 | $objWriter->startElement('a:headEnd'); |
||
661 | $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(['arrow', 'head', 'type'])); |
||
662 | $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('head', 'w')); |
||
663 | $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('head', 'len')); |
||
664 | $objWriter->endElement(); |
||
665 | } |
||
666 | |||
667 | if ($minorGridlines->getLineStyleProperty(['arrow', 'end', 'type']) !== null) { |
||
668 | $objWriter->startElement('a:tailEnd'); |
||
669 | $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(['arrow', 'end', 'type'])); |
||
670 | $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('end', 'w')); |
||
671 | $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('end', 'len')); |
||
672 | $objWriter->endElement(); |
||
673 | } |
||
674 | $objWriter->endElement(); //end ln |
||
675 | } |
||
676 | |||
677 | $objWriter->startElement('a:effectLst'); |
||
678 | |||
679 | if ($minorGridlines->getGlowSize() !== null) { |
||
680 | $objWriter->startElement('a:glow'); |
||
681 | $objWriter->writeAttribute('rad', $minorGridlines->getGlowSize()); |
||
682 | $objWriter->startElement("a:{$minorGridlines->getGlowColor('type')}"); |
||
683 | $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('value')); |
||
684 | $objWriter->startElement('a:alpha'); |
||
685 | $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('alpha')); |
||
686 | $objWriter->endElement(); //end alpha |
||
687 | $objWriter->endElement(); //end schemeClr |
||
688 | $objWriter->endElement(); //end glow |
||
689 | } |
||
690 | |||
691 | if ($minorGridlines->getShadowProperty('presets') !== null) { |
||
692 | $objWriter->startElement("a:{$minorGridlines->getShadowProperty('effect')}"); |
||
693 | if ($minorGridlines->getShadowProperty('blur') !== null) { |
||
694 | $objWriter->writeAttribute('blurRad', $minorGridlines->getShadowProperty('blur')); |
||
695 | } |
||
696 | if ($minorGridlines->getShadowProperty('distance') !== null) { |
||
697 | $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance')); |
||
698 | } |
||
699 | if ($minorGridlines->getShadowProperty('direction') !== null) { |
||
700 | $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction')); |
||
701 | } |
||
702 | if ($minorGridlines->getShadowProperty('algn') !== null) { |
||
703 | $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn')); |
||
704 | } |
||
705 | if ($minorGridlines->getShadowProperty(['size', 'sx']) !== null) { |
||
706 | $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(['size', 'sx'])); |
||
707 | } |
||
708 | if ($minorGridlines->getShadowProperty(['size', 'sy']) !== null) { |
||
709 | $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(['size', 'sy'])); |
||
710 | } |
||
711 | if ($minorGridlines->getShadowProperty(['size', 'kx']) !== null) { |
||
712 | $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(['size', 'kx'])); |
||
713 | } |
||
714 | if ($minorGridlines->getShadowProperty('rotWithShape') !== null) { |
||
715 | $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape')); |
||
716 | } |
||
717 | $objWriter->startElement("a:{$minorGridlines->getShadowProperty(['color', 'type'])}"); |
||
718 | $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(['color', 'value'])); |
||
719 | $objWriter->startElement('a:alpha'); |
||
720 | $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(['color', 'alpha'])); |
||
721 | $objWriter->endElement(); //end alpha |
||
722 | $objWriter->endElement(); //end color:type |
||
723 | $objWriter->endElement(); //end shadow |
||
724 | } |
||
725 | |||
726 | if ($minorGridlines->getSoftEdgesSize() !== null) { |
||
727 | $objWriter->startElement('a:softEdge'); |
||
728 | $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize()); |
||
729 | $objWriter->endElement(); //end softEdge |
||
730 | } |
||
731 | |||
732 | $objWriter->endElement(); //end effectLst |
||
733 | $objWriter->endElement(); //end spPr |
||
734 | $objWriter->endElement(); //end minorGridLines |
||
735 | } |
||
736 | |||
737 | 15 | if ($yAxisLabel !== null) { |
|
738 | 11 | $objWriter->startElement('c:title'); |
|
739 | 11 | $objWriter->startElement('c:tx'); |
|
740 | 11 | $objWriter->startElement('c:rich'); |
|
741 | |||
742 | 11 | $objWriter->startElement('a:bodyPr'); |
|
743 | 11 | $objWriter->endElement(); |
|
744 | |||
745 | 11 | $objWriter->startElement('a:lstStyle'); |
|
746 | 11 | $objWriter->endElement(); |
|
747 | |||
748 | 11 | $objWriter->startElement('a:p'); |
|
749 | 11 | $objWriter->startElement('a:r'); |
|
750 | |||
751 | 11 | $caption = $yAxisLabel->getCaption(); |
|
752 | 11 | if (is_array($caption)) { |
|
753 | 2 | $caption = $caption[0]; |
|
754 | } |
||
755 | |||
756 | 11 | $objWriter->startElement('a:t'); |
|
757 | 11 | $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($caption)); |
|
758 | 11 | $objWriter->endElement(); |
|
759 | |||
760 | 11 | $objWriter->endElement(); |
|
761 | 11 | $objWriter->endElement(); |
|
762 | 11 | $objWriter->endElement(); |
|
763 | 11 | $objWriter->endElement(); |
|
764 | |||
765 | 11 | if ($groupType !== DataSeries::TYPE_BUBBLECHART) { |
|
766 | 11 | $layout = $yAxisLabel->getLayout(); |
|
767 | 11 | $this->writeLayout($objWriter, $layout); |
|
768 | } |
||
769 | |||
770 | 11 | $objWriter->startElement('c:overlay'); |
|
771 | 11 | $objWriter->writeAttribute('val', 0); |
|
772 | 11 | $objWriter->endElement(); |
|
773 | |||
774 | 11 | $objWriter->endElement(); |
|
775 | } |
||
776 | |||
777 | 15 | $objWriter->startElement('c:numFmt'); |
|
778 | 15 | $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat()); |
|
779 | 15 | $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked()); |
|
780 | 15 | $objWriter->endElement(); |
|
781 | |||
782 | 15 | $objWriter->startElement('c:majorTickMark'); |
|
783 | 15 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark')); |
|
784 | 15 | $objWriter->endElement(); |
|
785 | |||
786 | 15 | $objWriter->startElement('c:minorTickMark'); |
|
787 | 15 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark')); |
|
788 | 15 | $objWriter->endElement(); |
|
789 | |||
790 | 15 | $objWriter->startElement('c:tickLblPos'); |
|
791 | 15 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels')); |
|
792 | 15 | $objWriter->endElement(); |
|
793 | |||
794 | 15 | $objWriter->startElement('c:spPr'); |
|
795 | |||
796 | 15 | if ($xAxis->getFillProperty('value') !== null) { |
|
797 | $objWriter->startElement('a:solidFill'); |
||
798 | $objWriter->startElement('a:' . $xAxis->getFillProperty('type')); |
||
799 | $objWriter->writeAttribute('val', $xAxis->getFillProperty('value')); |
||
800 | $objWriter->startElement('a:alpha'); |
||
801 | $objWriter->writeAttribute('val', $xAxis->getFillProperty('alpha')); |
||
802 | $objWriter->endElement(); |
||
803 | $objWriter->endElement(); |
||
804 | $objWriter->endElement(); |
||
805 | } |
||
806 | |||
807 | 15 | $objWriter->startElement('a:ln'); |
|
808 | |||
809 | 15 | $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width')); |
|
810 | 15 | $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap')); |
|
811 | 15 | $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound')); |
|
812 | |||
813 | 15 | if ($xAxis->getLineProperty('value') !== null) { |
|
814 | $objWriter->startElement('a:solidFill'); |
||
815 | $objWriter->startElement('a:' . $xAxis->getLineProperty('type')); |
||
816 | $objWriter->writeAttribute('val', $xAxis->getLineProperty('value')); |
||
817 | $objWriter->startElement('a:alpha'); |
||
818 | $objWriter->writeAttribute('val', $xAxis->getLineProperty('alpha')); |
||
819 | $objWriter->endElement(); |
||
820 | $objWriter->endElement(); |
||
821 | $objWriter->endElement(); |
||
822 | } |
||
823 | |||
824 | 15 | $objWriter->startElement('a:prstDash'); |
|
825 | 15 | $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash')); |
|
826 | 15 | $objWriter->endElement(); |
|
827 | |||
828 | 15 | if ($xAxis->getLineStyleProperty('join') == 'miter') { |
|
829 | $objWriter->startElement('a:miter'); |
||
830 | $objWriter->writeAttribute('lim', '800000'); |
||
831 | $objWriter->endElement(); |
||
832 | } else { |
||
833 | 15 | $objWriter->startElement('a:bevel'); |
|
834 | 15 | $objWriter->endElement(); |
|
835 | } |
||
836 | |||
837 | 15 | if ($xAxis->getLineStyleProperty(['arrow', 'head', 'type']) !== null) { |
|
838 | $objWriter->startElement('a:headEnd'); |
||
839 | $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(['arrow', 'head', 'type'])); |
||
840 | $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('head')); |
||
841 | $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('head')); |
||
842 | $objWriter->endElement(); |
||
843 | } |
||
844 | |||
845 | 15 | if ($xAxis->getLineStyleProperty(['arrow', 'end', 'type']) !== null) { |
|
846 | $objWriter->startElement('a:tailEnd'); |
||
847 | $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(['arrow', 'end', 'type'])); |
||
848 | $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('end')); |
||
849 | $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('end')); |
||
850 | $objWriter->endElement(); |
||
851 | } |
||
852 | |||
853 | 15 | $objWriter->endElement(); |
|
854 | |||
855 | 15 | $objWriter->startElement('a:effectLst'); |
|
856 | |||
857 | 15 | if ($xAxis->getGlowProperty('size') !== null) { |
|
858 | $objWriter->startElement('a:glow'); |
||
859 | $objWriter->writeAttribute('rad', $xAxis->getGlowProperty('size')); |
||
860 | $objWriter->startElement("a:{$xAxis->getGlowProperty(['color', 'type'])}"); |
||
861 | $objWriter->writeAttribute('val', $xAxis->getGlowProperty(['color', 'value'])); |
||
862 | $objWriter->startElement('a:alpha'); |
||
863 | $objWriter->writeAttribute('val', $xAxis->getGlowProperty(['color', 'alpha'])); |
||
864 | $objWriter->endElement(); |
||
865 | $objWriter->endElement(); |
||
866 | $objWriter->endElement(); |
||
867 | } |
||
868 | |||
869 | 15 | if ($xAxis->getShadowProperty('presets') !== null) { |
|
870 | $objWriter->startElement("a:{$xAxis->getShadowProperty('effect')}"); |
||
871 | |||
872 | if ($xAxis->getShadowProperty('blur') !== null) { |
||
873 | $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur')); |
||
1 ignored issue
–
show
|
|||
874 | } |
||
875 | if ($xAxis->getShadowProperty('distance') !== null) { |
||
876 | $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance')); |
||
877 | } |
||
878 | if ($xAxis->getShadowProperty('direction') !== null) { |
||
879 | $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction')); |
||
880 | } |
||
881 | if ($xAxis->getShadowProperty('algn') !== null) { |
||
882 | $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn')); |
||
883 | } |
||
884 | if ($xAxis->getShadowProperty(['size', 'sx']) !== null) { |
||
885 | $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(['size', 'sx'])); |
||
886 | } |
||
887 | if ($xAxis->getShadowProperty(['size', 'sy']) !== null) { |
||
888 | $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(['size', 'sy'])); |
||
889 | } |
||
890 | if ($xAxis->getShadowProperty(['size', 'kx']) !== null) { |
||
891 | $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(['size', 'kx'])); |
||
892 | } |
||
893 | if ($xAxis->getShadowProperty('rotWithShape') !== null) { |
||
894 | $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape')); |
||
895 | } |
||
896 | |||
897 | $objWriter->startElement("a:{$xAxis->getShadowProperty(['color', 'type'])}"); |
||
898 | $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'value'])); |
||
899 | $objWriter->startElement('a:alpha'); |
||
900 | $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'alpha'])); |
||
901 | $objWriter->endElement(); |
||
902 | $objWriter->endElement(); |
||
903 | |||
904 | $objWriter->endElement(); |
||
905 | } |
||
906 | |||
907 | 15 | if ($xAxis->getSoftEdgesSize() !== null) { |
|
908 | $objWriter->startElement('a:softEdge'); |
||
909 | $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize()); |
||
910 | $objWriter->endElement(); |
||
911 | } |
||
912 | |||
913 | 15 | $objWriter->endElement(); //effectList |
|
914 | 15 | $objWriter->endElement(); //end spPr |
|
915 | |||
916 | 15 | if ($id1 > 0) { |
|
917 | 15 | $objWriter->startElement('c:crossAx'); |
|
918 | 15 | $objWriter->writeAttribute('val', $id2); |
|
919 | 15 | $objWriter->endElement(); |
|
920 | |||
921 | 15 | if ($xAxis->getAxisOptionsProperty('horizontal_crosses_value') !== null) { |
|
922 | $objWriter->startElement('c:crossesAt'); |
||
923 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value')); |
||
924 | $objWriter->endElement(); |
||
925 | } else { |
||
926 | 15 | $objWriter->startElement('c:crosses'); |
|
927 | 15 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses')); |
|
928 | 15 | $objWriter->endElement(); |
|
929 | } |
||
930 | |||
931 | 15 | $objWriter->startElement('c:crossBetween'); |
|
932 | 15 | $objWriter->writeAttribute('val', 'midCat'); |
|
933 | 15 | $objWriter->endElement(); |
|
934 | |||
935 | 15 | if ($xAxis->getAxisOptionsProperty('major_unit') !== null) { |
|
936 | $objWriter->startElement('c:majorUnit'); |
||
937 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit')); |
||
938 | $objWriter->endElement(); |
||
939 | } |
||
940 | |||
941 | 15 | if ($xAxis->getAxisOptionsProperty('minor_unit') !== null) { |
|
942 | $objWriter->startElement('c:minorUnit'); |
||
943 | $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit')); |
||
944 | $objWriter->endElement(); |
||
945 | } |
||
946 | } |
||
947 | |||
948 | 15 | if ($isMultiLevelSeries) { |
|
949 | 1 | if ($groupType !== DataSeries::TYPE_BUBBLECHART) { |
|
950 | $objWriter->startElement('c:noMultiLvlLbl'); |
||
951 | $objWriter->writeAttribute('val', 0); |
||
952 | $objWriter->endElement(); |
||
953 | } |
||
954 | } |
||
955 | |||
956 | 15 | $objWriter->endElement(); |
|
957 | 15 | } |
|
958 | |||
959 | /** |
||
960 | * Get the data series type(s) for a chart plot series. |
||
961 | * |
||
962 | * @return string[] |
||
963 | */ |
||
964 | 17 | private static function getChartType(PlotArea $plotArea): array |
|
965 | { |
||
966 | 17 | $groupCount = $plotArea->getPlotGroupCount(); |
|
967 | |||
968 | 17 | if ($groupCount == 1) { |
|
969 | 16 | $chartType = [$plotArea->getPlotGroupByIndex(0)->getPlotType()]; |
|
970 | } else { |
||
971 | 2 | $chartTypes = []; |
|
972 | 2 | for ($i = 0; $i < $groupCount; ++$i) { |
|
973 | 2 | $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType(); |
|
974 | } |
||
975 | 2 | $chartType = array_unique($chartTypes); |
|
976 | 2 | if (count($chartTypes) == 0) { |
|
977 | throw new WriterException('Chart is not yet implemented'); |
||
978 | } |
||
979 | } |
||
980 | |||
981 | 17 | return $chartType; |
|
982 | } |
||
983 | |||
984 | /** |
||
985 | * Method writing plot series values. |
||
986 | * |
||
987 | * @param int $val value for idx (default: 3) |
||
988 | * @param string $fillColor hex color (default: FF9900) |
||
989 | */ |
||
990 | 3 | private function writePlotSeriesValuesElement(XMLWriter $objWriter, $val = 3, $fillColor = 'FF9900'): void |
|
1009 | 3 | } |
|
1010 | |||
1011 | /** |
||
1012 | * Write Plot Group (series of related plots). |
||
1013 | * |
||
1014 | * @param string $groupType Type of plot for dataseries |
||
1015 | * @param bool $catIsMultiLevelSeries Is category a multi-series category |
||
1016 | * @param bool $valIsMultiLevelSeries Is value set a multi-series set |
||
1017 | * @param string $plotGroupingType Type of grouping for multi-series values |
||
1018 | */ |
||
1019 | 17 | private function writePlotGroup(?DataSeries $plotGroup, $groupType, XMLWriter $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType): void |
|
1020 | { |
||
1021 | 17 | if ($plotGroup === null) { |
|
1022 | return; |
||
1023 | } |
||
1024 | |||
1025 | 17 | if (($groupType == DataSeries::TYPE_BARCHART) || ($groupType == DataSeries::TYPE_BARCHART_3D)) { |
|
1026 | 8 | $objWriter->startElement('c:barDir'); |
|
1027 | 8 | $objWriter->writeAttribute('val', $plotGroup->getPlotDirection()); |
|
1028 | 8 | $objWriter->endElement(); |
|
1029 | } |
||
1030 | |||
1031 | 17 | if ($plotGroup->getPlotGrouping() !== null) { |
|
1032 | 12 | $plotGroupingType = $plotGroup->getPlotGrouping(); |
|
1033 | 12 | $objWriter->startElement('c:grouping'); |
|
1034 | 12 | $objWriter->writeAttribute('val', $plotGroupingType); |
|
1035 | 12 | $objWriter->endElement(); |
|
1036 | } |
||
1037 | |||
1038 | // Get these details before the loop, because we can use the count to check for varyColors |
||
1039 | 17 | $plotSeriesOrder = $plotGroup->getPlotOrder(); |
|
1040 | 17 | $plotSeriesCount = count($plotSeriesOrder); |
|
1041 | |||
1042 | 17 | if (($groupType !== DataSeries::TYPE_RADARCHART) && ($groupType !== DataSeries::TYPE_STOCKCHART)) { |
|
1043 | 15 | if ($groupType !== DataSeries::TYPE_LINECHART) { |
|
1044 | 12 | if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) { |
|
1045 | 11 | $objWriter->startElement('c:varyColors'); |
|
1046 | 11 | $objWriter->writeAttribute('val', 1); |
|
1047 | 11 | $objWriter->endElement(); |
|
1048 | } else { |
||
1049 | 2 | $objWriter->startElement('c:varyColors'); |
|
1050 | 2 | $objWriter->writeAttribute('val', 0); |
|
1051 | 2 | $objWriter->endElement(); |
|
1052 | } |
||
1053 | } |
||
1054 | } |
||
1055 | |||
1056 | 17 | $plotSeriesIdx = 0; |
|
1057 | 17 | foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) { |
|
1058 | 17 | $objWriter->startElement('c:ser'); |
|
1059 | |||
1060 | 17 | $plotLabel = $plotGroup->getPlotLabelByIndex($plotSeriesIdx); |
|
1061 | 17 | if ($plotLabel && $groupType !== DataSeries::TYPE_LINECHART) { |
|
1062 | 14 | $fillColor = $plotLabel->getFillColor(); |
|
1063 | 14 | if ($fillColor !== null && !is_array($fillColor)) { |
|
1064 | $objWriter->startElement('c:spPr'); |
||
1065 | $objWriter->startElement('a:solidFill'); |
||
1066 | $objWriter->startElement('a:srgbClr'); |
||
1067 | $objWriter->writeAttribute('val', $fillColor); |
||
1068 | $objWriter->endElement(); |
||
1069 | $objWriter->endElement(); |
||
1070 | $objWriter->endElement(); |
||
1071 | } |
||
1072 | } |
||
1073 | |||
1074 | 17 | $objWriter->startElement('c:idx'); |
|
1075 | 17 | $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesIdx); |
|
1076 | 17 | $objWriter->endElement(); |
|
1077 | |||
1078 | 17 | $objWriter->startElement('c:order'); |
|
1079 | 17 | $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesRef); |
|
1080 | 17 | $objWriter->endElement(); |
|
1081 | |||
1082 | // Values |
||
1083 | 17 | $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); |
|
1084 | |||
1085 | 17 | if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) { |
|
1086 | 3 | $fillColorValues = $plotSeriesValues->getFillColor(); |
|
1087 | 3 | if ($fillColorValues !== null && is_array($fillColorValues)) { |
|
1088 | 1 | foreach ($plotSeriesValues->getDataValues() as $dataKey => $dataValue) { |
|
1089 | 1 | $this->writePlotSeriesValuesElement($objWriter, $dataKey, ($fillColorValues[$dataKey] ?? 'FF9900')); |
|
1090 | } |
||
1091 | } else { |
||
1092 | 2 | $this->writePlotSeriesValuesElement($objWriter); |
|
1093 | } |
||
1094 | } |
||
1095 | |||
1096 | // Labels |
||
1097 | 17 | $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef); |
|
1098 | 17 | if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) { |
|
1099 | 17 | $objWriter->startElement('c:tx'); |
|
1100 | 17 | $objWriter->startElement('c:strRef'); |
|
1101 | 17 | $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter); |
|
1102 | 17 | $objWriter->endElement(); |
|
1103 | 17 | $objWriter->endElement(); |
|
1104 | } |
||
1105 | |||
1106 | // Formatting for the points |
||
1107 | 17 | if (($groupType == DataSeries::TYPE_LINECHART) || ($groupType == DataSeries::TYPE_STOCKCHART)) { |
|
1108 | 6 | $plotLineWidth = 12700; |
|
1109 | 6 | if ($plotSeriesValues) { |
|
1110 | 6 | $plotLineWidth = $plotSeriesValues->getLineWidth(); |
|
1111 | } |
||
1112 | |||
1113 | 6 | $objWriter->startElement('c:spPr'); |
|
1114 | 6 | $objWriter->startElement('a:ln'); |
|
1115 | 6 | $objWriter->writeAttribute('w', $plotLineWidth); |
|
1116 | 6 | if ($groupType == DataSeries::TYPE_STOCKCHART) { |
|
1117 | 2 | $objWriter->startElement('a:noFill'); |
|
1118 | 2 | $objWriter->endElement(); |
|
1119 | 5 | } elseif ($plotLabel) { |
|
1120 | 5 | $fillColor = $plotLabel->getFillColor(); |
|
1121 | 5 | if (is_string($fillColor)) { |
|
1122 | 1 | $objWriter->startElement('a:solidFill'); |
|
1123 | 1 | $objWriter->startElement('a:srgbClr'); |
|
1124 | 1 | $objWriter->writeAttribute('val', $fillColor); |
|
1125 | 1 | $objWriter->endElement(); |
|
1126 | 1 | $objWriter->endElement(); |
|
1127 | } |
||
1128 | } |
||
1129 | 6 | $objWriter->endElement(); |
|
1130 | 6 | $objWriter->endElement(); |
|
1131 | } |
||
1132 | |||
1133 | 17 | if ($plotSeriesValues) { |
|
1134 | 17 | $plotSeriesMarker = $plotSeriesValues->getPointMarker(); |
|
1135 | 17 | if ($plotSeriesMarker) { |
|
1136 | 1 | $objWriter->startElement('c:marker'); |
|
1137 | 1 | $objWriter->startElement('c:symbol'); |
|
1138 | 1 | $objWriter->writeAttribute('val', $plotSeriesMarker); |
|
1139 | 1 | $objWriter->endElement(); |
|
1140 | |||
1141 | 1 | if ($plotSeriesMarker !== 'none') { |
|
1142 | 1 | $objWriter->startElement('c:size'); |
|
1143 | 1 | $objWriter->writeAttribute('val', 3); |
|
1144 | 1 | $objWriter->endElement(); |
|
1145 | } |
||
1146 | |||
1147 | 1 | $objWriter->endElement(); |
|
1148 | } |
||
1149 | } |
||
1150 | |||
1151 | 17 | if (($groupType === DataSeries::TYPE_BARCHART) || ($groupType === DataSeries::TYPE_BARCHART_3D) || ($groupType === DataSeries::TYPE_BUBBLECHART)) { |
|
1152 | 8 | $objWriter->startElement('c:invertIfNegative'); |
|
1153 | 8 | $objWriter->writeAttribute('val', 0); |
|
1154 | 8 | $objWriter->endElement(); |
|
1155 | } |
||
1156 | |||
1157 | // Category Labels |
||
1158 | 17 | $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef); |
|
1159 | 17 | if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) { |
|
1160 | 15 | $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries(); |
|
1161 | |||
1162 | 15 | if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) { |
|
1163 | 3 | if ($plotGroup->getPlotStyle() !== null) { |
|
1164 | 1 | $plotStyle = $plotGroup->getPlotStyle(); |
|
1165 | 1 | if ($plotStyle) { |
|
1166 | 1 | $objWriter->startElement('c:explosion'); |
|
1167 | 1 | $objWriter->writeAttribute('val', 25); |
|
1168 | 1 | $objWriter->endElement(); |
|
1169 | } |
||
1170 | } |
||
1171 | } |
||
1172 | |||
1173 | 15 | if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) { |
|
1174 | 2 | $objWriter->startElement('c:xVal'); |
|
1175 | } else { |
||
1176 | 14 | $objWriter->startElement('c:cat'); |
|
1177 | } |
||
1178 | |||
1179 | 15 | $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str'); |
|
1180 | 15 | $objWriter->endElement(); |
|
1181 | } |
||
1182 | |||
1183 | // Values |
||
1184 | 17 | if ($plotSeriesValues) { |
|
1185 | 17 | $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries(); |
|
1186 | |||
1187 | 17 | if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) { |
|
1188 | 2 | $objWriter->startElement('c:yVal'); |
|
1189 | } else { |
||
1190 | 16 | $objWriter->startElement('c:val'); |
|
1191 | } |
||
1192 | |||
1193 | 17 | $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num'); |
|
1194 | 17 | $objWriter->endElement(); |
|
1195 | } |
||
1196 | |||
1197 | 17 | if ($groupType === DataSeries::TYPE_BUBBLECHART) { |
|
1198 | 1 | $this->writeBubbles($plotSeriesValues, $objWriter); |
|
1 ignored issue
–
show
|
|||
1199 | } |
||
1200 | |||
1201 | 17 | $objWriter->endElement(); |
|
1202 | } |
||
1203 | |||
1204 | 17 | $this->seriesIndex += $plotSeriesIdx + 1; |
|
1205 | 17 | } |
|
1206 | |||
1207 | /** |
||
1208 | * Write Plot Series Label. |
||
1209 | */ |
||
1210 | 17 | private function writePlotSeriesLabel(?DataSeriesValues $plotSeriesLabel, XMLWriter $objWriter): void |
|
1211 | { |
||
1212 | 17 | if ($plotSeriesLabel === null) { |
|
1213 | return; |
||
1214 | } |
||
1215 | |||
1216 | 17 | $objWriter->startElement('c:f'); |
|
1217 | 17 | $objWriter->writeRawData($plotSeriesLabel->getDataSource()); |
|
1218 | 17 | $objWriter->endElement(); |
|
1219 | |||
1220 | 17 | $objWriter->startElement('c:strCache'); |
|
1221 | 17 | $objWriter->startElement('c:ptCount'); |
|
1222 | 17 | $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount()); |
|
1223 | 17 | $objWriter->endElement(); |
|
1224 | |||
1225 | 17 | foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) { |
|
1226 | 17 | $objWriter->startElement('c:pt'); |
|
1227 | 17 | $objWriter->writeAttribute('idx', $plotLabelKey); |
|
1228 | |||
1229 | 17 | $objWriter->startElement('c:v'); |
|
1230 | 17 | $objWriter->writeRawData($plotLabelValue); |
|
1231 | 17 | $objWriter->endElement(); |
|
1232 | 17 | $objWriter->endElement(); |
|
1233 | } |
||
1234 | 17 | $objWriter->endElement(); |
|
1235 | 17 | } |
|
1236 | |||
1237 | /** |
||
1238 | * Write Plot Series Values. |
||
1239 | * |
||
1240 | * @param string $groupType Type of plot for dataseries |
||
1241 | * @param string $dataType Datatype of series values |
||
1242 | */ |
||
1243 | 17 | private function writePlotSeriesValues(?DataSeriesValues $plotSeriesValues, XMLWriter $objWriter, $groupType, $dataType = 'str'): void |
|
1244 | { |
||
1245 | 17 | if ($plotSeriesValues === null) { |
|
1246 | return; |
||
1247 | } |
||
1248 | |||
1249 | 17 | if ($plotSeriesValues->isMultiLevelSeries()) { |
|
1250 | 2 | $levelCount = $plotSeriesValues->multiLevelCount(); |
|
1251 | |||
1252 | 2 | $objWriter->startElement('c:multiLvlStrRef'); |
|
1253 | |||
1254 | 2 | $objWriter->startElement('c:f'); |
|
1255 | 2 | $objWriter->writeRawData($plotSeriesValues->getDataSource()); |
|
1256 | 2 | $objWriter->endElement(); |
|
1257 | |||
1258 | 2 | $objWriter->startElement('c:multiLvlStrCache'); |
|
1259 | |||
1260 | 2 | $objWriter->startElement('c:ptCount'); |
|
1261 | 2 | $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); |
|
1262 | 2 | $objWriter->endElement(); |
|
1263 | |||
1264 | 2 | for ($level = 0; $level < $levelCount; ++$level) { |
|
1265 | 2 | $objWriter->startElement('c:lvl'); |
|
1266 | |||
1267 | 2 | foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) { |
|
1268 | 2 | if (isset($plotSeriesValue[$level])) { |
|
1269 | 2 | $objWriter->startElement('c:pt'); |
|
1270 | 2 | $objWriter->writeAttribute('idx', $plotSeriesKey); |
|
1271 | |||
1272 | 2 | $objWriter->startElement('c:v'); |
|
1273 | 2 | $objWriter->writeRawData($plotSeriesValue[$level]); |
|
1274 | 2 | $objWriter->endElement(); |
|
1275 | 2 | $objWriter->endElement(); |
|
1276 | } |
||
1277 | } |
||
1278 | |||
1279 | 2 | $objWriter->endElement(); |
|
1280 | } |
||
1281 | |||
1282 | 2 | $objWriter->endElement(); |
|
1283 | |||
1284 | 2 | $objWriter->endElement(); |
|
1285 | } else { |
||
1286 | 17 | $objWriter->startElement('c:' . $dataType . 'Ref'); |
|
1287 | |||
1288 | 17 | $objWriter->startElement('c:f'); |
|
1289 | 17 | $objWriter->writeRawData($plotSeriesValues->getDataSource()); |
|
1290 | 17 | $objWriter->endElement(); |
|
1291 | |||
1292 | 17 | $objWriter->startElement('c:' . $dataType . 'Cache'); |
|
1293 | |||
1294 | 17 | if (($groupType != DataSeries::TYPE_PIECHART) && ($groupType != DataSeries::TYPE_PIECHART_3D) && ($groupType != DataSeries::TYPE_DONUTCHART)) { |
|
1295 | 15 | if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) { |
|
1296 | 1 | $objWriter->startElement('c:formatCode'); |
|
1297 | 1 | $objWriter->writeRawData($plotSeriesValues->getFormatCode()); |
|
1298 | 1 | $objWriter->endElement(); |
|
1299 | } |
||
1300 | } |
||
1301 | |||
1302 | 17 | $objWriter->startElement('c:ptCount'); |
|
1303 | 17 | $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); |
|
1304 | 17 | $objWriter->endElement(); |
|
1305 | |||
1306 | 17 | $dataValues = $plotSeriesValues->getDataValues(); |
|
1307 | 17 | if (!empty($dataValues)) { |
|
1308 | 17 | if (is_array($dataValues)) { |
|
1309 | 17 | foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) { |
|
1310 | 17 | $objWriter->startElement('c:pt'); |
|
1311 | 17 | $objWriter->writeAttribute('idx', $plotSeriesKey); |
|
1312 | |||
1313 | 17 | $objWriter->startElement('c:v'); |
|
1314 | 17 | $objWriter->writeRawData($plotSeriesValue); |
|
1315 | 17 | $objWriter->endElement(); |
|
1316 | 17 | $objWriter->endElement(); |
|
1317 | } |
||
1318 | } |
||
1319 | } |
||
1320 | |||
1321 | 17 | $objWriter->endElement(); |
|
1322 | |||
1323 | 17 | $objWriter->endElement(); |
|
1324 | } |
||
1325 | 17 | } |
|
1326 | |||
1327 | /** |
||
1328 | * Write Bubble Chart Details. |
||
1329 | */ |
||
1330 | 1 | private function writeBubbles(?DataSeriesValues $plotSeriesValues, XMLWriter $objWriter): void |
|
1367 | 1 | } |
|
1368 | |||
1369 | /** |
||
1370 | * Write Layout. |
||
1371 | */ |
||
1372 | 17 | private function writeLayout(XMLWriter $objWriter, ?Layout $layout = null): void |
|
1373 | { |
||
1374 | 17 | $objWriter->startElement('c:layout'); |
|
1375 | |||
1376 | 17 | if ($layout !== null) { |
|
1377 | 5 | $objWriter->startElement('c:manualLayout'); |
|
1378 | |||
1379 | 5 | $layoutTarget = $layout->getLayoutTarget(); |
|
1380 | 5 | if ($layoutTarget !== null) { |
|
1381 | 1 | $objWriter->startElement('c:layoutTarget'); |
|
1382 | 1 | $objWriter->writeAttribute('val', $layoutTarget); |
|
1383 | 1 | $objWriter->endElement(); |
|
1384 | } |
||
1385 | |||
1386 | 5 | $xMode = $layout->getXMode(); |
|
1387 | 5 | if ($xMode !== null) { |
|
1388 | 1 | $objWriter->startElement('c:xMode'); |
|
1389 | 1 | $objWriter->writeAttribute('val', $xMode); |
|
1390 | 1 | $objWriter->endElement(); |
|
1391 | } |
||
1392 | |||
1393 | 5 | $yMode = $layout->getYMode(); |
|
1394 | 5 | if ($yMode !== null) { |
|
1395 | 1 | $objWriter->startElement('c:yMode'); |
|
1396 | 1 | $objWriter->writeAttribute('val', $yMode); |
|
1397 | 1 | $objWriter->endElement(); |
|
1398 | } |
||
1399 | |||
1400 | 5 | $x = $layout->getXPosition(); |
|
1401 | 5 | if ($x !== null) { |
|
1402 | 1 | $objWriter->startElement('c:x'); |
|
1403 | 1 | $objWriter->writeAttribute('val', $x); |
|
1404 | 1 | $objWriter->endElement(); |
|
1405 | } |
||
1406 | |||
1407 | 5 | $y = $layout->getYPosition(); |
|
1408 | 5 | if ($y !== null) { |
|
1409 | 1 | $objWriter->startElement('c:y'); |
|
1410 | 1 | $objWriter->writeAttribute('val', $y); |
|
1411 | 1 | $objWriter->endElement(); |
|
1412 | } |
||
1413 | |||
1414 | 5 | $w = $layout->getWidth(); |
|
1415 | 5 | if ($w !== null) { |
|
1416 | 1 | $objWriter->startElement('c:w'); |
|
1417 | 1 | $objWriter->writeAttribute('val', $w); |
|
1418 | 1 | $objWriter->endElement(); |
|
1419 | } |
||
1420 | |||
1421 | 5 | $h = $layout->getHeight(); |
|
1422 | 5 | if ($h !== null) { |
|
1423 | 1 | $objWriter->startElement('c:h'); |
|
1424 | 1 | $objWriter->writeAttribute('val', $h); |
|
1425 | 1 | $objWriter->endElement(); |
|
1426 | } |
||
1427 | |||
1428 | 5 | $objWriter->endElement(); |
|
1429 | } |
||
1430 | |||
1431 | 17 | $objWriter->endElement(); |
|
1432 | 17 | } |
|
1433 | |||
1434 | /** |
||
1435 | * Write Alternate Content block. |
||
1436 | */ |
||
1437 | 17 | private function writeAlternateContent(XMLWriter $objWriter): void |
|
1438 | { |
||
1439 | 17 | $objWriter->startElement('mc:AlternateContent'); |
|
1440 | 17 | $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); |
|
1441 | |||
1442 | 17 | $objWriter->startElement('mc:Choice'); |
|
1443 | 17 | $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'); |
|
1444 | 17 | $objWriter->writeAttribute('Requires', 'c14'); |
|
1445 | |||
1446 | 17 | $objWriter->startElement('c14:style'); |
|
1447 | 17 | $objWriter->writeAttribute('val', '102'); |
|
1448 | 17 | $objWriter->endElement(); |
|
1449 | 17 | $objWriter->endElement(); |
|
1450 | |||
1451 | 17 | $objWriter->startElement('mc:Fallback'); |
|
1452 | 17 | $objWriter->startElement('c:style'); |
|
1453 | 17 | $objWriter->writeAttribute('val', '2'); |
|
1454 | 17 | $objWriter->endElement(); |
|
1455 | 17 | $objWriter->endElement(); |
|
1456 | |||
1457 | 17 | $objWriter->endElement(); |
|
1458 | 17 | } |
|
1459 | |||
1460 | /** |
||
1461 | * Write Printer Settings. |
||
1462 | */ |
||
1463 | 17 | private function writePrintSettings(XMLWriter $objWriter): void |
|
1484 | 17 | } |
|
1485 | } |
||
1486 |