-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Graph custom colors #768
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Graph custom colors #768
Changes from 3 commits
fc8db23
f2e6adc
f36fcd1
25536c7
4afc5f7
fc3ad88
2c2e7f8
16a62f6
32ae51b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,183 @@ | ||
| <?php | ||
|
|
||
| use PhpOffice\PhpSpreadsheet\Chart\Chart; | ||
| use PhpOffice\PhpSpreadsheet\Chart\DataSeries; | ||
| use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; | ||
| use PhpOffice\PhpSpreadsheet\Chart\Layout; | ||
| use PhpOffice\PhpSpreadsheet\Chart\Legend; | ||
| use PhpOffice\PhpSpreadsheet\Chart\PlotArea; | ||
| use PhpOffice\PhpSpreadsheet\Chart\Title; | ||
| use PhpOffice\PhpSpreadsheet\IOFactory; | ||
| use PhpOffice\PhpSpreadsheet\Spreadsheet; | ||
|
|
||
| require __DIR__ . '/../Header.php'; | ||
|
|
||
| $spreadsheet = new Spreadsheet(); | ||
| $worksheet = $spreadsheet->getActiveSheet(); | ||
| $worksheet->fromArray( | ||
| [ | ||
| ['', 2010, 2011, 2012], | ||
| ['Q1', 12, 15, 21], | ||
| ['Q2', 56, 73, 86], | ||
| ['Q3', 52, 61, 69], | ||
| ['Q4', 30, 32, 0], | ||
| ] | ||
| ); | ||
|
|
||
| // Custom colors for dataSeries (gray, blue, red, orange) | ||
| $colors = [ | ||
| 'cccccc', '00abb8', 'b8292f', 'eb8500', | ||
| ]; | ||
|
|
||
| // Set the Labels for each data series we want to plot | ||
| // Datatype | ||
| // Cell reference for data | ||
| // Format Code | ||
| // Number of datapoints in series | ||
| // Data values | ||
| // Data Marker | ||
| $dataSeriesLabels1 = [ | ||
| new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // 2011 | ||
| ]; | ||
| // Set the X-Axis Labels | ||
| // Datatype | ||
| // Cell reference for data | ||
| // Format Code | ||
| // Number of datapoints in series | ||
| // Data values | ||
| // Data Marker | ||
| $xAxisTickValues1 = [ | ||
| new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$5', null, 4), // Q1 to Q4 | ||
| ]; | ||
| // Set the Data values for each data series we want to plot | ||
| // Datatype | ||
| // Cell reference for data | ||
| // Format Code | ||
| // Number of datapoints in series | ||
| // Data values | ||
| // Data Marker | ||
| // Custom colors | ||
| $dataSeriesValues1 = [ | ||
| new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', null, 4, [], null, $colors), | ||
| ]; | ||
|
|
||
| // Build the dataseries | ||
| $series1 = new DataSeries( | ||
| DataSeries::TYPE_PIECHART, // plotType | ||
| null, // plotGrouping (Pie charts don't have any grouping) | ||
| range(0, count($dataSeriesValues1) - 1), // plotOrder | ||
| $dataSeriesLabels1, // plotLabel | ||
| $xAxisTickValues1, // plotCategory | ||
| $dataSeriesValues1 // plotValues | ||
| ); | ||
|
|
||
| // Set up a layout object for the Pie chart | ||
| $layout1 = new Layout(); | ||
| $layout1->setShowVal(true); | ||
| $layout1->setShowPercent(true); | ||
|
|
||
| // Set the series in the plot area | ||
| $plotArea1 = new PlotArea($layout1, [$series1]); | ||
| // Set the chart legend | ||
| $legend1 = new Legend(Legend::POSITION_RIGHT, null, false); | ||
|
|
||
| $title1 = new Title('Test Pie Chart'); | ||
|
|
||
| // Create the chart | ||
| $chart1 = new Chart( | ||
| 'chart1', // name | ||
| $title1, // title | ||
| $legend1, // legend | ||
| $plotArea1, // plotArea | ||
| true, // plotVisibleOnly | ||
| 0, // displayBlanksAs | ||
| null, // xAxisLabel | ||
| null // yAxisLabel - Pie charts don't have a Y-Axis | ||
| ); | ||
|
|
||
| // Set the position where the chart should appear in the worksheet | ||
| $chart1->setTopLeftPosition('A7'); | ||
| $chart1->setBottomRightPosition('H20'); | ||
|
|
||
| // Add the chart to the worksheet | ||
| $worksheet->addChart($chart1); | ||
|
|
||
| // Set the Labels for each data series we want to plot | ||
| // Datatype | ||
| // Cell reference for data | ||
| // Format Code | ||
| // Number of datapoints in series | ||
| // Data values | ||
| // Data Marker | ||
| $dataSeriesLabels2 = [ | ||
| new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // 2011 | ||
| ]; | ||
| // Set the X-Axis Labels | ||
| // Datatype | ||
| // Cell reference for data | ||
| // Format Code | ||
| // Number of datapoints in series | ||
| // Data values | ||
| // Data Marker | ||
| $xAxisTickValues2 = [ | ||
| new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$5', null, 4), // Q1 to Q4 | ||
| ]; | ||
| // Set the Data values for each data series we want to plot | ||
| // Datatype | ||
| // Cell reference for data | ||
| // Format Code | ||
| // Number of datapoints in series | ||
| // Data values | ||
| // Data Marker | ||
| // Custom colors | ||
| $dataSeriesValues2 = [ | ||
| $dataSeriesValues2Element = new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', null, 4), | ||
| ]; | ||
| $dataSeriesValues2Element->setFillColor($colors); | ||
|
|
||
| // Build the dataseries | ||
| $series2 = new DataSeries( | ||
| DataSeries::TYPE_DONUTCHART, // plotType | ||
| null, // plotGrouping (Donut charts don't have any grouping) | ||
| range(0, count($dataSeriesValues2) - 1), // plotOrder | ||
| $dataSeriesLabels2, // plotLabel | ||
| $xAxisTickValues2, // plotCategory | ||
| $dataSeriesValues2 // plotValues | ||
| ); | ||
|
|
||
| // Set up a layout object for the Pie chart | ||
| $layout2 = new Layout(); | ||
| $layout2->setShowVal(true); | ||
| $layout2->setShowCatName(true); | ||
|
|
||
| // Set the series in the plot area | ||
| $plotArea2 = new PlotArea($layout2, [$series2]); | ||
|
|
||
| $title2 = new Title('Test Donut Chart'); | ||
|
|
||
| // Create the chart | ||
| $chart2 = new Chart( | ||
| 'chart2', // name | ||
| $title2, // title | ||
| null, // legend | ||
| $plotArea2, // plotArea | ||
| true, // plotVisibleOnly | ||
| 0, // displayBlanksAs | ||
| null, // xAxisLabel | ||
| null // yAxisLabel - Like Pie charts, Donut charts don't have a Y-Axis | ||
| ); | ||
|
|
||
| // Set the position where the chart should appear in the worksheet | ||
| $chart2->setTopLeftPosition('I7'); | ||
| $chart2->setBottomRightPosition('P20'); | ||
|
|
||
| // Add the chart to the worksheet | ||
| $worksheet->addChart($chart2); | ||
|
|
||
| // Save Excel 2007 file | ||
| $filename = $helper->getFilename(__FILE__); | ||
| $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); | ||
| $writer->setIncludeCharts(true); | ||
| $callStartTime = microtime(true); | ||
| $writer->save($filename); | ||
| $helper->logWrite($writer, $filename, $callStartTime); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -60,9 +60,9 @@ class DataSeriesValues | |
| private $dataValues = []; | ||
|
|
||
| /** | ||
| * Fill color. | ||
| * Fill color (can be array with colors if dataseries have custom colors). | ||
| * | ||
| * @var string | ||
| * @var array|string | ||
| */ | ||
| private $fillColor; | ||
|
|
||
|
|
@@ -82,7 +82,7 @@ class DataSeriesValues | |
| * @param int $pointCount | ||
| * @param mixed $dataValues | ||
| * @param null|mixed $marker | ||
| * @param null|string $fillColor | ||
| * @param null|array|string $fillColor | ||
| */ | ||
| public function __construct($dataType = self::DATASERIES_TYPE_NUMBER, $dataSource = null, $formatCode = null, $pointCount = 0, $dataValues = [], $marker = null, $fillColor = null) | ||
| { | ||
|
|
@@ -214,7 +214,7 @@ public function getPointCount() | |
| /** | ||
| * Get fill color. | ||
| * | ||
| * @return string HEX color | ||
| * @return array|string HEX color or array with HEX colors | ||
| */ | ||
| public function getFillColor() | ||
| { | ||
|
|
@@ -224,14 +224,22 @@ public function getFillColor() | |
| /** | ||
| * Set fill color for series. | ||
| * | ||
| * @param string $color HEX color | ||
| * @param array|string $color HEX color or array with HEX colors | ||
| * | ||
| * @return DataSeriesValues | ||
| */ | ||
| public function setFillColor($color) | ||
| { | ||
| if (!preg_match('/^[a-f0-9]{6}$/i', $color)) { | ||
| throw new Exception('Invalid hex color for chart series'); | ||
| if (is_array($color)) { | ||
| foreach ($color as $colorValue) { | ||
| if (!preg_match('/^[a-f0-9]{6}$/i', $colorValue)) { | ||
| throw new Exception(sprintf('Invalid hex color for chart series (color: "%s")', $colorValue)); | ||
| } | ||
| } | ||
| } else { | ||
| if (!preg_match('/^[a-f0-9]{6}$/i', $color)) { | ||
|
||
| throw new Exception('Invalid hex color for chart series'); | ||
| } | ||
| } | ||
| $this->fillColor = $color; | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1078,7 +1078,7 @@ private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMulti | |
| $plotLabel = $plotGroup->getPlotLabelByIndex($plotSeriesIdx); | ||
| if ($plotLabel) { | ||
| $fillColor = $plotLabel->getFillColor(); | ||
| if ($fillColor !== null) { | ||
| if ($fillColor !== null && !is_array($fillColor)) { | ||
| $objWriter->startElement('c:spPr'); | ||
| $objWriter->startElement('a:solidFill'); | ||
| $objWriter->startElement('a:srgbClr'); | ||
|
|
@@ -1097,24 +1097,48 @@ private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMulti | |
| $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesRef); | ||
| $objWriter->endElement(); | ||
|
|
||
| // Values | ||
| $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); | ||
|
|
||
| if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) { | ||
| $objWriter->startElement('c:dPt'); | ||
| $objWriter->startElement('c:idx'); | ||
| $objWriter->writeAttribute('val', 3); | ||
| $objWriter->endElement(); | ||
| $fillColorValues = $plotSeriesValues->getFillColor(); | ||
| if ($fillColorValues !== null && is_array($fillColorValues)) { | ||
| foreach ($plotSeriesValues->getDataValues() as $dataKey => $dataValue) { | ||
| $objWriter->startElement('c:dPt'); | ||
|
||
| $objWriter->startElement('c:idx'); | ||
| $objWriter->writeAttribute('val', $dataKey); | ||
| $objWriter->endElement(); | ||
| $objWriter->startElement('c:bubble3D'); | ||
| $objWriter->writeAttribute('val', 0); | ||
| $objWriter->endElement(); | ||
| $objWriter->startElement('c:spPr'); | ||
| $objWriter->startElement('a:solidFill'); | ||
| $objWriter->startElement('a:srgbClr'); | ||
| $objWriter->writeAttribute('val', (isset($fillColorValues[$dataKey]) ? $fillColorValues[$dataKey] : 'FF9900')); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| } | ||
| } else { | ||
| $objWriter->startElement('c:dPt'); | ||
| $objWriter->startElement('c:idx'); | ||
| $objWriter->writeAttribute('val', 3); | ||
| $objWriter->endElement(); | ||
|
|
||
| $objWriter->startElement('c:bubble3D'); | ||
| $objWriter->writeAttribute('val', 0); | ||
| $objWriter->endElement(); | ||
| $objWriter->startElement('c:bubble3D'); | ||
| $objWriter->writeAttribute('val', 0); | ||
| $objWriter->endElement(); | ||
|
|
||
| $objWriter->startElement('c:spPr'); | ||
| $objWriter->startElement('a:solidFill'); | ||
| $objWriter->startElement('a:srgbClr'); | ||
| $objWriter->writeAttribute('val', 'FF9900'); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->startElement('c:spPr'); | ||
| $objWriter->startElement('a:solidFill'); | ||
| $objWriter->startElement('a:srgbClr'); | ||
| $objWriter->writeAttribute('val', 'FF9900'); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| $objWriter->endElement(); | ||
| } | ||
| } | ||
|
|
||
| // Labels | ||
|
|
@@ -1127,9 +1151,6 @@ private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMulti | |
| $objWriter->endElement(); | ||
| } | ||
|
|
||
| // Values | ||
| $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why was this removed ?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It was moved to line 1100 ($plotSeriesValues is needed earlier). |
||
|
|
||
| // Formatting for the points | ||
| if (($groupType == DataSeries::TYPE_LINECHART) || ($groupType == DataSeries::TYPE_STOCKCHART)) { | ||
| $plotLineWidth = 12700; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -59,4 +59,24 @@ public function testGetLineWidth() | |
| $testInstance->setLineWidth(1); | ||
| self::assertEquals(12700, $testInstance->getLineWidth(), 'should enforce minimum width'); | ||
| } | ||
|
|
||
| public function testFillColor() | ||
| { | ||
| $testInstance = new DataSeriesValues(); | ||
|
|
||
| try { | ||
| $testInstance->setFillColor('WRONG COLOR'); | ||
| } catch (Exception $e) { | ||
| self::assertEquals($e->getMessage(), 'Invalid hex color for chart series'); | ||
|
||
| } | ||
|
|
||
| try { | ||
| $testInstance->setFillColor(['b8292f', 'WRONG COLOR']); | ||
| } catch (Exception $e) { | ||
| self::assertEquals($e->getMessage(), 'Invalid hex color for chart series (color: "WRONG COLOR")'); | ||
|
||
| } | ||
|
|
||
| self::assertEquals($testInstance, $testInstance->setFillColor('00abb8')); | ||
| self::assertEquals($testInstance, $testInstance->setFillColor(['00abb8', 'b8292f'])); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be and all similar type hinting too:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have changed it, however phpcs suggest
string|string[]instead ofstring[]|string