diff --git a/CHANGELOG.md b/CHANGELOG.md index d429f0adbc..dc1a809dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,8 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Fixed +- Fix for Xlsx Chart axis titles mapping to correct X or Y axis label when only one is present. +- Resolve Google Sheets Xlsx charts issue. Google Sheets uses oneCellAnchor positioning and does not include *Cache values in the exported Xlsx. - Fix For Null Exception on ODS Read of Page Settings. [#1772](https://github.com/PHPOffice/PhpSpreadsheet/issues/1772) - Fix Xlsx reader overriding manually set number format with builtin number format. [PR #1805](https://github.com/PHPOffice/PhpSpreadsheet/pull/1805) - Fix Xlsx reader cell alignment. [PR #1710](https://github.com/PHPOffice/PhpSpreadsheet/pull/1710) @@ -58,7 +60,6 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Fixed -- Resolve Google Sheets Xlsx charts issue. Google Sheets uses oneCellAnchor positioning and does not include *Cache values in the exported Xlsx. - Fix for Xls Reader when SST has a bad length [#1592](https://github.com/PHPOffice/PhpSpreadsheet/issues/1592) - Resolve Xlsx loader issue whe hyperlinks don't have a destination - Resolve issues when printer settings resources IDs clash with drawing IDs diff --git a/src/PhpSpreadsheet/Reader/Xlsx/Chart.php b/src/PhpSpreadsheet/Reader/Xlsx/Chart.php index 84b2e62b80..5a3439f2fc 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/Chart.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/Chart.php @@ -91,7 +91,21 @@ public static function readChart(SimpleXMLElement $chartElements, $chartName) break; case 'valAx': if (isset($chartDetail->title)) { - $YaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta); + $axisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta); + $axPos = self::getAttribute($chartDetail->axPos, 'val', 'string'); + + switch ($axPos) { + case 't': + case 'b': + $XaxisLabel = $axisLabel; + + break; + case 'r': + case 'l': + $YaxisLabel = $axisLabel; + + break; + } } break; diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/ChartsTitleTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/ChartsTitleTest.php new file mode 100644 index 0000000000..5e1711390d --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/ChartsTitleTest.php @@ -0,0 +1,64 @@ +getCaption()) { + return null; + } + + return implode("\n", array_map(function ($rt) { + return $rt->getPlainText(); + }, $title->getCaption())); +} + +class ChartsTitleTest extends TestCase +{ + public function testChartTitles(): void + { + $filename = 'tests/data/Reader/XLSX/excelChartsTest.xlsx'; + $reader = IOFactory::createReader('Xlsx')->setIncludeCharts(true); + $spreadsheet = $reader->load($filename); + $worksheet = $spreadsheet->getActiveSheet(); + + $charts = $worksheet->getChartCollection(); + self::assertEquals(5, $worksheet->getChartCount()); + self::assertCount(5, $charts); + + // No title or axis labels + $chart1 = $charts[0]; + $title = getTitleText($chart1->getTitle()); + self::assertEmpty($title); + self::assertEmpty(getTitleText($chart1->getXAxisLabel())); + self::assertEmpty(getTitleText($chart1->getYAxisLabel())); + + // Title, no axis labels + $chart2 = $charts[1]; + + self::assertEquals('Chart with Title and no Axis Labels', getTitleText($chart2->getTitle())); + self::assertEmpty(getTitleText($chart2->getXAxisLabel())); + self::assertEmpty(getTitleText($chart2->getYAxisLabel())); + + // No title, only horizontal axis label + $chart3 = $charts[2]; + self::assertEmpty(getTitleText($chart3->getTitle())); + self::assertEquals('Horizontal Axis Title Only', getTitleText($chart3->getXAxisLabel())); + self::assertEmpty(getTitleText($chart3->getYAxisLabel())); + + // No title, only vertical axis label + $chart4 = $charts[3]; + self::assertEmpty(getTitleText($chart4->getTitle())); + self::assertEquals('Vertical Axis Title Only', getTitleText($chart4->getYAxisLabel())); + self::assertEmpty(getTitleText($chart4->getXAxisLabel())); + + // Title and both axis labels + $chart5 = $charts[4]; + self::assertEquals('Complete Annotations', getTitleText($chart5->getTitle())); + self::assertEquals('Horizontal Axis Title', getTitleText($chart5->getXAxisLabel())); + self::assertEquals('Vertical Axis Title', getTitleText($chart5->getYAxisLabel())); + } +} diff --git a/tests/data/Reader/XLSX/excelChartsTest.xlsx b/tests/data/Reader/XLSX/excelChartsTest.xlsx new file mode 100644 index 0000000000..78cbc8f902 Binary files /dev/null and b/tests/data/Reader/XLSX/excelChartsTest.xlsx differ