From acd0e386e8e65109605f338285fb3185b22e4126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Wed, 26 Jun 2024 10:35:25 +0400 Subject: [PATCH 1/8] Update JpGraphRendererBase.php - check existing of PlotLabel I've got Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\FatalError: "Error: Uncaught Error: Call to a member function getDataValue() on bool in .../vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php:337 I found that it's necessary to check existing of PlotLabel before using its method getDataValue(). --- src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index 7c21a131a8..b3e3d63363 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -334,7 +334,8 @@ private function renderPlotLine(int $groupID, bool $filled = false, bool $combin // Set the appropriate plot marker $this->formatPointMarker($seriesPlot, $marker); } - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)->getDataValue(); + if ($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)) + $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)->getDataValue(); $seriesPlot->SetLegend($dataLabel); $seriesPlots[] = $seriesPlot; From 36f316856b358ebf8f29775747ff257584b322cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Wed, 26 Jun 2024 10:59:17 +0400 Subject: [PATCH 2/8] Check existing of PlotLabel before using its method getDataValue() I'v got that: Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\FatalError: "Error: Uncaught Error: Call to a member function getDataValue() on bool in .../vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php:337 I've found that it's necessary to check existing of PlotLabel before using its method getDataValue(). --- src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index b3e3d63363..e0b02bb70f 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -334,8 +334,9 @@ private function renderPlotLine(int $groupID, bool $filled = false, bool $combin // Set the appropriate plot marker $this->formatPointMarker($seriesPlot, $marker); } - if ($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)) + if ($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)) { $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)->getDataValue(); + } $seriesPlot->SetLegend($dataLabel); $seriesPlots[] = $seriesPlot; From 17fc6234e6423a2453cfb008888e40dec1f7ebf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Wed, 26 Jun 2024 12:39:26 +0400 Subject: [PATCH 3/8] Update JpGraphRendererBase.php --- src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index e0b02bb70f..977773605e 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -336,8 +336,8 @@ private function renderPlotLine(int $groupID, bool $filled = false, bool $combin } if ($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)) { $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)->getDataValue(); + $seriesPlot->SetLegend($dataLabel); } - $seriesPlot->SetLegend($dataLabel); $seriesPlots[] = $seriesPlot; } From ccee8690d1df69920b9addb56cadb267abe0fa6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Fri, 28 Jun 2024 10:43:05 +0400 Subject: [PATCH 4/8] getDataLabel defends against empty labels --- .../Chart/Renderer/JpGraphRendererBase.php | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index 977773605e..0aa0fa26bb 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -281,6 +281,16 @@ private function renderRadarPlotArea(): void $this->renderTitle(); } + private function getDataLabel(int $groupId, int $index): mixed + { + $plotLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupId)->getPlotLabelByIndex($index); + if (!$plotLabel) { + return ''; + } else { + return $plotLabel->getDataValue(); + } + } + private function renderPlotLine(int $groupID, bool $filled = false, bool $combination = false): void { $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); @@ -334,10 +344,8 @@ private function renderPlotLine(int $groupID, bool $filled = false, bool $combin // Set the appropriate plot marker $this->formatPointMarker($seriesPlot, $marker); } - if ($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)) { - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($index)->getDataValue(); - $seriesPlot->SetLegend($dataLabel); - } + + $seriesPlot->SetLegend($this->getDataLabel($groupID, $index)); $seriesPlots[] = $seriesPlot; } @@ -410,12 +418,8 @@ private function renderPlotBar(int $groupID, ?string $dimensions = '2d'): void if ($dimensions == '3d') { $seriesPlot->SetShadow(); } - if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) { - $dataLabel = ''; - } else { - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue(); - } - $seriesPlot->SetLegend($dataLabel); + + $seriesPlot->SetLegend($this->getDataLabel($groupID, $j)); $seriesPlots[] = $seriesPlot; } @@ -494,8 +498,7 @@ private function renderPlotScatter(int $groupID, bool $bubble): void $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); $this->formatPointMarker($seriesPlot, $marker); } - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); - $seriesPlot->SetLegend($dataLabel); + $seriesPlot->SetLegend($this->getDataLabel($groupID, $i)); $this->graph->Add($seriesPlot); } @@ -526,13 +529,12 @@ private function renderPlotRadar(int $groupID): void $seriesPlot = new RadarPlot(array_reverse($dataValuesX)); - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); if ($radarStyle == 'filled') { $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]); } $this->formatPointMarker($seriesPlot, $marker); - $seriesPlot->SetLegend($dataLabel); + $seriesPlot->SetLegend($this->getDataLabel($groupID, $i)); $this->graph->Add($seriesPlot); } From f3693406ed1277ac90f9db65e9c06ba0d679ed1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Fri, 28 Jun 2024 10:49:56 +0400 Subject: [PATCH 5/8] getDataLabel defends against empty labels --- src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index 0aa0fa26bb..bdbffe8e52 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -286,9 +286,8 @@ private function getDataLabel(int $groupId, int $index): mixed $plotLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupId)->getPlotLabelByIndex($index); if (!$plotLabel) { return ''; - } else { - return $plotLabel->getDataValue(); } + return $plotLabel->getDataValue(); } private function renderPlotLine(int $groupID, bool $filled = false, bool $combination = false): void From 766a73cf8413fad17e79803b6becc2fedf8585ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Fri, 28 Jun 2024 10:54:30 +0400 Subject: [PATCH 6/8] getDataLabel() defends against empty labels --- src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index bdbffe8e52..95e369cf5b 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -287,6 +287,7 @@ private function getDataLabel(int $groupId, int $index): mixed if (!$plotLabel) { return ''; } + return $plotLabel->getDataValue(); } From 3b37d3e300e0d30b831198b3516184cf6966995c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Fri, 28 Jun 2024 10:58:03 +0400 Subject: [PATCH 7/8] getDataLabel() defends against empty labels --- .../Chart/Renderer/JpGraphRendererBase.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index 95e369cf5b..a37f7434d7 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -287,7 +287,7 @@ private function getDataLabel(int $groupId, int $index): mixed if (!$plotLabel) { return ''; } - + return $plotLabel->getDataValue(); } @@ -757,7 +757,7 @@ private function renderCombinationChart($groupCount, $outputDestination): bool break; case 'bar3DChart': $dimensions = '3d'; - // no break + // no break case 'barChart': $this->renderPlotBar($i, $dimensions); @@ -818,35 +818,35 @@ public function render(?string $outputDestination): bool switch ($chartType) { case 'area3DChart': $dimensions = '3d'; - // no break + // no break case 'areaChart': $this->renderAreaChart($groupCount); break; case 'bar3DChart': $dimensions = '3d'; - // no break + // no break case 'barChart': $this->renderBarChart($groupCount, $dimensions); break; case 'line3DChart': $dimensions = '3d'; - // no break + // no break case 'lineChart': $this->renderLineChart($groupCount); break; case 'pie3DChart': $dimensions = '3d'; - // no break + // no break case 'pieChart': $this->renderPieChart($groupCount, $dimensions, false, false); break; case 'doughnut3DChart': $dimensions = '3d'; - // no break + // no break case 'doughnutChart': $this->renderPieChart($groupCount, $dimensions, true, true); From 675efc1f7921f0142feb96874ef0e8c1b994c740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A4=D0=B8=D0=BD=D0=BA=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C?= Date: Fri, 28 Jun 2024 11:01:58 +0400 Subject: [PATCH 8/8] getDataLabel() defends against empty labels --- .../Chart/Renderer/JpGraphRendererBase.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php index a37f7434d7..151d5b58c7 100644 --- a/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php +++ b/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php @@ -757,7 +757,7 @@ private function renderCombinationChart($groupCount, $outputDestination): bool break; case 'bar3DChart': $dimensions = '3d'; - // no break + // no break case 'barChart': $this->renderPlotBar($i, $dimensions); @@ -818,35 +818,35 @@ public function render(?string $outputDestination): bool switch ($chartType) { case 'area3DChart': $dimensions = '3d'; - // no break + // no break case 'areaChart': $this->renderAreaChart($groupCount); break; case 'bar3DChart': $dimensions = '3d'; - // no break + // no break case 'barChart': $this->renderBarChart($groupCount, $dimensions); break; case 'line3DChart': $dimensions = '3d'; - // no break + // no break case 'lineChart': $this->renderLineChart($groupCount); break; case 'pie3DChart': $dimensions = '3d'; - // no break + // no break case 'pieChart': $this->renderPieChart($groupCount, $dimensions, false, false); break; case 'doughnut3DChart': $dimensions = '3d'; - // no break + // no break case 'doughnutChart': $this->renderPieChart($groupCount, $dimensions, true, true);