3
3
namespace PhpOffice \PhpSpreadsheet \Reader \Xlsx ;
4
4
5
5
use PhpOffice \PhpSpreadsheet \Calculation \Information \ExcelError ;
6
+ use PhpOffice \PhpSpreadsheet \Chart \Axis ;
6
7
use PhpOffice \PhpSpreadsheet \Chart \DataSeries ;
7
8
use PhpOffice \PhpSpreadsheet \Chart \DataSeriesValues ;
8
9
use PhpOffice \PhpSpreadsheet \Chart \Layout ;
9
10
use PhpOffice \PhpSpreadsheet \Chart \Legend ;
10
11
use PhpOffice \PhpSpreadsheet \Chart \PlotArea ;
12
+ use PhpOffice \PhpSpreadsheet \Chart \Properties ;
11
13
use PhpOffice \PhpSpreadsheet \Chart \Title ;
12
14
use PhpOffice \PhpSpreadsheet \RichText \RichText ;
13
15
use PhpOffice \PhpSpreadsheet \Style \Color ;
@@ -67,6 +69,8 @@ public function readChart(SimpleXMLElement $chartElements, $chartName)
67
69
$ dispBlanksAs = $ plotVisOnly = null ;
68
70
$ plotArea = null ;
69
71
$ rotX = $ rotY = $ rAngAx = $ perspective = null ;
72
+ $ xAxis = new Axis ();
73
+ $ yAxis = new Axis ();
70
74
foreach ($ chartElementsC as $ chartElementKey => $ chartElement ) {
71
75
switch ($ chartElementKey ) {
72
76
case 'chart ' :
@@ -93,6 +97,7 @@ public function readChart(SimpleXMLElement $chartElements, $chartName)
93
97
if (isset ($ chartDetail ->title )) {
94
98
$ XaxisLabel = $ this ->chartTitle ($ chartDetail ->title ->children ($ this ->cNamespace ));
95
99
}
100
+ $ this ->readEffects ($ chartDetail , $ xAxis );
96
101
97
102
break ;
98
103
case 'dateAx ' :
@@ -102,6 +107,7 @@ public function readChart(SimpleXMLElement $chartElements, $chartName)
102
107
103
108
break ;
104
109
case 'valAx ' :
110
+ $ whichAxis = null ;
105
111
if (isset ($ chartDetail ->title , $ chartDetail ->axPos )) {
106
112
$ axisLabel = $ this ->chartTitle ($ chartDetail ->title ->children ($ this ->cNamespace ));
107
113
$ axPos = self ::getAttribute ($ chartDetail ->axPos , 'val ' , 'string ' );
@@ -110,15 +116,18 @@ public function readChart(SimpleXMLElement $chartElements, $chartName)
110
116
case 't ' :
111
117
case 'b ' :
112
118
$ XaxisLabel = $ axisLabel ;
119
+ $ whichAxis = $ xAxis ;
113
120
114
121
break ;
115
122
case 'r ' :
116
123
case 'l ' :
117
124
$ YaxisLabel = $ axisLabel ;
125
+ $ whichAxis = $ yAxis ;
118
126
119
127
break ;
120
128
}
121
129
}
130
+ $ this ->readEffects ($ chartDetail , $ whichAxis );
122
131
123
132
break ;
124
133
case 'barChart ' :
@@ -240,7 +249,7 @@ public function readChart(SimpleXMLElement $chartElements, $chartName)
240
249
}
241
250
}
242
251
}
243
- $ chart = new \PhpOffice \PhpSpreadsheet \Chart \Chart ($ chartName , $ title , $ legend , $ plotArea , $ plotVisOnly , (string ) $ dispBlanksAs , $ XaxisLabel , $ YaxisLabel );
252
+ $ chart = new \PhpOffice \PhpSpreadsheet \Chart \Chart ($ chartName , $ title , $ legend , $ plotArea , $ plotVisOnly , (string ) $ dispBlanksAs , $ XaxisLabel , $ YaxisLabel, $ xAxis , $ yAxis );
244
253
if (is_int ($ rotX )) {
245
254
$ chart ->setRotX ($ rotX );
246
255
}
@@ -345,9 +354,8 @@ private function chartDataSeries(SimpleXMLElement $chartDetail, string $plotType
345
354
if (is_countable ($ ln ->noFill ) && count ($ ln ->noFill ) === 1 ) {
346
355
$ noFill = true ;
347
356
}
348
- $ sf = $ children ->solidFill ->schemeClr ;
349
- if ($ sf ) {
350
- $ schemeClr = self ::getAttribute ($ sf , 'val ' , 'string ' );
357
+ if (isset ($ children ->solidFill )) {
358
+ $ this ->readColor ($ children ->solidFill , $ srgbClr , $ schemeClr );
351
359
}
352
360
353
361
break ;
@@ -357,8 +365,8 @@ private function chartDataSeries(SimpleXMLElement $chartDetail, string $plotType
357
365
$ pointSize = is_numeric ($ pointSize ) ? ((int ) $ pointSize ) : null ;
358
366
if (count ($ seriesDetail ->spPr ) === 1 ) {
359
367
$ ln = $ seriesDetail ->spPr ->children ($ this ->aNamespace );
360
- if (count ($ ln ->solidFill ) === 1 ) {
361
- $ srgbClr = self :: getAttribute ($ ln ->solidFill -> srgbClr , ' val ' , ' string ' );
368
+ if (isset ($ ln ->solidFill )) {
369
+ $ this -> readColor ($ ln ->solidFill , $ srgbClr , $ schemeClr );
362
370
}
363
371
}
364
372
@@ -603,7 +611,8 @@ private function parseRichText(SimpleXMLElement $titleDetailPart): RichText
603
611
$ defaultLatin = null ;
604
612
$ defaultEastAsian = null ;
605
613
$ defaultComplexScript = null ;
606
- $ defaultColor = null ;
614
+ $ defaultSrgbColor = '' ;
615
+ $ defaultSchemeColor = '' ;
607
616
if (isset ($ titleDetailPart ->pPr ->defRPr )) {
608
617
/** @var ?int */
609
618
$ defaultFontSize = self ::getAttribute ($ titleDetailPart ->pPr ->defRPr , 'sz ' , 'integer ' );
@@ -632,9 +641,8 @@ private function parseRichText(SimpleXMLElement $titleDetailPart): RichText
632
641
/** @var ?string */
633
642
$ defaultComplexScript = self ::getAttribute ($ titleDetailPart ->pPr ->defRPr ->cs , 'typeface ' , 'string ' );
634
643
}
635
- if (isset ($ titleDetailPart ->pPr ->defRPr ->solidFill ->srgbClr )) {
636
- /** @var ?string */
637
- $ defaultColor = self ::getAttribute ($ titleDetailPart ->pPr ->defRPr ->solidFill ->srgbClr , 'val ' , 'string ' );
644
+ if (isset ($ titleDetailPart ->pPr ->defRPr ->solidFill )) {
645
+ $ this ->readColor ($ titleDetailPart ->pPr ->defRPr ->solidFill , $ defaultSrgbColor , $ defaultSchemeClr );
638
646
}
639
647
}
640
648
foreach ($ titleDetailPart as $ titleDetailElementKey => $ titleDetailElement ) {
@@ -660,7 +668,8 @@ private function parseRichText(SimpleXMLElement $titleDetailPart): RichText
660
668
$ latinName = null ;
661
669
$ eastAsian = null ;
662
670
$ complexScript = null ;
663
- $ fontColor = null ;
671
+ $ fontSrgbClr = '' ;
672
+ $ fontSchemeClr = '' ;
664
673
$ uSchemeClr = null ;
665
674
if (isset ($ titleDetailElement ->rPr )) {
666
675
// not used now, not sure it ever was, grandfathering
@@ -686,10 +695,9 @@ private function parseRichText(SimpleXMLElement $titleDetailPart): RichText
686
695
687
696
// not used now, not sure it ever was, grandfathering
688
697
/** @var ?string */
689
- $ fontColor = self ::getAttribute ($ titleDetailElement ->rPr , 'color ' , 'string ' );
690
- if (isset ($ titleDetailElement ->rPr ->solidFill ->srgbClr )) {
691
- /** @var ?string */
692
- $ fontColor = self ::getAttribute ($ titleDetailElement ->rPr ->solidFill ->srgbClr , 'val ' , 'string ' );
698
+ $ fontSrgbClr = self ::getAttribute ($ titleDetailElement ->rPr , 'color ' , 'string ' );
699
+ if (isset ($ titleDetailElement ->rPr ->solidFill )) {
700
+ $ this ->readColor ($ titleDetailElement ->rPr ->solidFill , $ fontSrgbClr , $ fontSchemeClr );
693
701
}
694
702
695
703
/** @var ?bool */
@@ -742,11 +750,17 @@ private function parseRichText(SimpleXMLElement $titleDetailPart): RichText
742
750
$ fontFound = true ;
743
751
}
744
752
745
- $ fontColor = $ fontColor ?? $ defaultColor ;
746
- if ($ fontColor !== null ) {
747
- $ objText ->getFont ()->setColor (new Color ($ fontColor ));
753
+ $ fontSrgbClr = $ fontSrgbClr ?? $ defaultSrgbColor ;
754
+ if (! empty ( $ fontSrgbClr ) ) {
755
+ $ objText ->getFont ()->setColor (new Color ($ fontSrgbClr ));
748
756
$ fontFound = true ;
749
757
}
758
+ // need to think about what to do here
759
+ //$fontSchemeClr = $fontSchemeClr ?? $defaultSchemeColor;
760
+ //if (!empty($fontSchemeClr)) {
761
+ // $objText->getFont()->setColor(new Color($fontSrgbClr));
762
+ // $fontFound = true;
763
+ //}
750
764
751
765
$ bold = $ bold ?? $ defaultBold ;
752
766
if ($ bold !== null ) {
@@ -877,4 +891,56 @@ private function setChartAttributes(Layout $plotArea, $plotAttributes): void
877
891
}
878
892
}
879
893
}
894
+
895
+ /**
896
+ * @param null|Axis $chartObject may be extended to include other types
897
+ */
898
+ private function readEffects (SimpleXMLElement $ chartDetail , $ chartObject ): void
899
+ {
900
+ if (!isset ($ chartObject , $ chartDetail ->spPr )) {
901
+ return ;
902
+ }
903
+ $ sppr = $ chartDetail ->spPr ->children ($ this ->aNamespace );
904
+
905
+ if (isset ($ sppr ->effectLst ->glow )) {
906
+ $ axisGlowSize = (float ) self ::getAttribute ($ sppr ->effectLst ->glow , 'rad ' , 'integer ' ) / Properties::POINTS_WIDTH_MULTIPLIER ;
907
+ if ($ axisGlowSize != 0.0 ) {
908
+ $ srgbClr = $ schemeClr = '' ;
909
+ $ colorArray = $ this ->readColor ($ sppr ->effectLst ->glow , $ srgbClr , $ schemeClr );
910
+ $ chartObject ->setGlowProperties ($ axisGlowSize , $ colorArray ['value ' ], $ colorArray ['alpha ' ], $ colorArray ['type ' ]);
911
+ }
912
+ }
913
+
914
+ if (isset ($ sppr ->effectLst ->softEdge )) {
915
+ $ chartObject ->setSoftEdges ((float ) self ::getAttribute ($ sppr ->effectLst ->softEdge , 'rad ' , 'string ' ) / Properties::POINTS_WIDTH_MULTIPLIER );
916
+ }
917
+ }
918
+
919
+ private function readColor (SimpleXMLElement $ colorXml , ?string &$ srgbClr , ?string &$ schemeClr ): array
920
+ {
921
+ $ result = [
922
+ 'type ' => null ,
923
+ 'value ' => null ,
924
+ 'alpha ' => null ,
925
+ ];
926
+ if (isset ($ colorXml ->srgbClr )) {
927
+ $ result ['type ' ] = Properties::EXCEL_COLOR_TYPE_ARGB ;
928
+ $ result ['value ' ] = $ srgbClr = self ::getAttribute ($ colorXml ->srgbClr , 'val ' , 'string ' );
929
+ if (isset ($ colorXml ->srgbClr ->alpha )) {
930
+ $ alpha = (int ) self ::getAttribute ($ colorXml ->srgbClr ->alpha , 'val ' , 'string ' );
931
+ $ alpha = 100 - (int ) ($ alpha / 1000 );
932
+ $ result ['alpha ' ] = $ alpha ;
933
+ }
934
+ } elseif (isset ($ colorXml ->schemeClr )) {
935
+ $ result ['type ' ] = Properties::EXCEL_COLOR_TYPE_SCHEME ;
936
+ $ result ['value ' ] = $ schemeClr = self ::getAttribute ($ colorXml ->schemeClr , 'val ' , 'string ' );
937
+ if (isset ($ colorXml ->schemeClr ->alpha )) {
938
+ $ alpha = (int ) self ::getAttribute ($ colorXml ->schemeClr ->alpha , 'val ' , 'string ' );
939
+ $ alpha = 100 - (int ) ($ alpha / 1000 );
940
+ $ result ['alpha ' ] = $ alpha ;
941
+ }
942
+ }
943
+
944
+ return $ result ;
945
+ }
880
946
}
0 commit comments