Skip to content

Commit f0059bb

Browse files
authored
Xlsx Chart Reader and Writer Mishandle Explosion Value (#2928)
Fix #2506. Reader only tests if Explosion is set without capturing its value. Writer hard-codes value when it is set.
1 parent 99ce5c2 commit f0059bb

File tree

4 files changed

+79
-12
lines changed

4 files changed

+79
-12
lines changed

src/PhpSpreadsheet/Reader/Xlsx/Chart.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public function readChart(SimpleXMLElement $chartElements, $chartName)
228228
case 'doughnutChart':
229229
case 'pieChart':
230230
case 'pie3DChart':
231-
$explosion = isset($chartDetail->ser->explosion);
231+
$explosion = self::getAttribute($chartDetail->ser->explosion, 'val', 'string');
232232
$plotSer = $this->chartDataSeries($chartDetail, $chartDetailKey);
233233
$plotSer->setPlotStyle("$explosion");
234234
$plotSeries[] = $plotSer;

src/PhpSpreadsheet/Writer/Xlsx/Chart.php

+5-11
Original file line numberDiff line numberDiff line change
@@ -875,10 +875,6 @@ private function writePlotSeriesValuesElement(XMLWriter $objWriter, int $val, ?C
875875
$objWriter->writeAttribute('val', "$val");
876876
$objWriter->endElement(); // c:idx
877877

878-
$objWriter->startElement('c:bubble3D');
879-
$objWriter->writeAttribute('val', '0');
880-
$objWriter->endElement(); // c:bubble3D
881-
882878
$objWriter->startElement('c:spPr');
883879
$this->writeColor($objWriter, $fillColor);
884880
$objWriter->endElement(); // c:spPr
@@ -1052,13 +1048,11 @@ private function writePlotGroup(?DataSeries $plotGroup, string $groupType, XMLWr
10521048
$catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries();
10531049

10541050
if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) {
1055-
if ($plotGroup->getPlotStyle() !== null) {
1056-
$plotStyle = $plotGroup->getPlotStyle();
1057-
if ($plotStyle) {
1058-
$objWriter->startElement('c:explosion');
1059-
$objWriter->writeAttribute('val', '25');
1060-
$objWriter->endElement();
1061-
}
1051+
$plotStyle = $plotGroup->getPlotStyle();
1052+
if (is_numeric($plotStyle)) {
1053+
$objWriter->startElement('c:explosion');
1054+
$objWriter->writeAttribute('val', $plotStyle);
1055+
$objWriter->endElement();
10621056
}
10631057
}
10641058

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
namespace PhpOffice\PhpSpreadsheetTests\Chart;
4+
5+
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
6+
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
7+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
8+
9+
class Issue2506Test extends AbstractFunctional
10+
{
11+
private const DIRECTORY = 'tests' . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'Reader' . DIRECTORY_SEPARATOR . 'XLSX' . DIRECTORY_SEPARATOR;
12+
13+
public function readCharts(XlsxReader $reader): void
14+
{
15+
$reader->setIncludeCharts(true);
16+
}
17+
18+
public function writeCharts(XlsxWriter $writer): void
19+
{
20+
$writer->setIncludeCharts(true);
21+
}
22+
23+
public function testDataSeriesValues(): void
24+
{
25+
$reader = new XlsxReader();
26+
self::readCharts($reader);
27+
$spreadsheet = $reader->load(self::DIRECTORY . 'issue.2506.xlsx');
28+
$worksheet = $spreadsheet->getActiveSheet();
29+
$charts = $worksheet->getChartCollection();
30+
self::assertCount(4, $charts);
31+
$originalChart1 = $charts[0];
32+
self::assertNotNull($originalChart1);
33+
$originalPlotArea1 = $originalChart1->getPlotArea();
34+
self::assertNotNull($originalPlotArea1);
35+
$originalPlotSeries1 = $originalPlotArea1->getPlotGroup();
36+
self::assertCount(1, $originalPlotSeries1);
37+
self::assertSame('0', $originalPlotSeries1[0]->getPlotStyle());
38+
$originalChart2 = $charts[1];
39+
self::assertNotNull($originalChart2);
40+
$originalPlotArea2 = $originalChart2->getPlotArea();
41+
self::assertNotNull($originalPlotArea2);
42+
$originalPlotSeries2 = $originalPlotArea2->getPlotGroup();
43+
self::assertCount(1, $originalPlotSeries2);
44+
self::assertSame('5', $originalPlotSeries2[0]->getPlotStyle());
45+
46+
/** @var callable */
47+
$callableReader = [$this, 'readCharts'];
48+
/** @var callable */
49+
$callableWriter = [$this, 'writeCharts'];
50+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', $callableReader, $callableWriter);
51+
$spreadsheet->disconnectWorksheets();
52+
53+
$sheet = $reloadedSpreadsheet->getActiveSheet();
54+
$charts2 = $sheet->getChartCollection();
55+
self::assertCount(4, $charts2);
56+
$chart1 = $charts[0];
57+
self::assertNotNull($chart1);
58+
$plotArea1 = $chart1->getPlotArea();
59+
self::assertNotNull($plotArea1);
60+
$plotSeries1 = $plotArea1->getPlotGroup();
61+
self::assertCount(1, $plotSeries1);
62+
self::assertSame('0', $plotSeries1[0]->getPlotStyle());
63+
$chart2 = $charts[1];
64+
self::assertNotNull($chart2);
65+
$plotArea2 = $chart2->getPlotArea();
66+
self::assertNotNull($plotArea2);
67+
$plotSeries2 = $plotArea2->getPlotGroup();
68+
self::assertCount(1, $plotSeries2);
69+
self::assertSame('5', $plotSeries2[0]->getPlotStyle());
70+
71+
$reloadedSpreadsheet->disconnectWorksheets();
72+
}
73+
}
22 KB
Binary file not shown.

0 commit comments

Comments
 (0)