forked from PHPOffice/PhpSpreadsheet
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Charts - Gradients, Transparency, Hidden Axes
Fix PHPOffice#2257. Fix PHPOffice#2929. Fix PHPOffice#2935 (probably in a way that will not satisfy the requester). 2257 and 2929 requested changes that ultimately affect the same section of code, so it's appropriate to deal with them together. 2257 requests the ability to make the chart background transparent (so that the Excel gridlines are visible beneath the chart), and the ability to hide an Axis. 2929 requests the ability to set a gradient background on the chart.
- Loading branch information
Showing
13 changed files
with
619 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
<?php | ||
|
||
use PhpOffice\PhpSpreadsheet\Chart\Axis; | ||
use PhpOffice\PhpSpreadsheet\Chart\Chart; | ||
use PhpOffice\PhpSpreadsheet\Chart\ChartColor; | ||
use PhpOffice\PhpSpreadsheet\Chart\DataSeries; | ||
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; | ||
use PhpOffice\PhpSpreadsheet\Chart\Legend as ChartLegend; | ||
use PhpOffice\PhpSpreadsheet\Chart\PlotArea; | ||
use PhpOffice\PhpSpreadsheet\Chart\Properties; | ||
use PhpOffice\PhpSpreadsheet\Chart\Title; | ||
use PhpOffice\PhpSpreadsheet\IOFactory; | ||
use PhpOffice\PhpSpreadsheet\Spreadsheet; | ||
|
||
require __DIR__ . '/../Header.php'; | ||
|
||
$spreadsheet = new Spreadsheet(); | ||
$worksheet = $spreadsheet->getActiveSheet(); | ||
// changed data to simulate a trend chart - Xaxis are dates; Yaxis are 3 meausurements from each date | ||
$worksheet->fromArray( | ||
[ | ||
['', 'metric1', 'metric2', 'metric3'], | ||
['=DATEVALUE("2021-01-01")', 12.1, 15.1, 21.1], | ||
['=DATEVALUE("2021-01-04")', 56.2, 73.2, 86.2], | ||
['=DATEVALUE("2021-01-07")', 52.2, 61.2, 69.2], | ||
['=DATEVALUE("2021-01-10")', 30.2, 32.2, 0.2], | ||
] | ||
); | ||
$worksheet->getStyle('A2:A5')->getNumberFormat()->setFormatCode(Properties::FORMAT_CODE_DATE_ISO8601); | ||
$worksheet->getColumnDimension('A')->setAutoSize(true); | ||
$worksheet->setSelectedCells('A1'); | ||
|
||
// 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 | ||
$dataSeriesLabels = [ | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // was 2010 | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // was 2011 | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1', null, 1), // was 2012 | ||
]; | ||
// Set the X-Axis Labels | ||
// changed from STRING to NUMBER | ||
// added 2 additional x-axis values associated with each of the 3 metrics | ||
// added FORMATE_CODE_NUMBER | ||
$xAxisTickValues = [ | ||
//new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$A$2:$A$5', null, 4), // Q1 to Q4 | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$A$2:$A$5', Properties::FORMAT_CODE_DATE, 4), | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$A$2:$A$5', Properties::FORMAT_CODE_DATE, 4), | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$A$2:$A$5', Properties::FORMAT_CODE_DATE, 4), | ||
]; | ||
// 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 | ||
// added FORMAT_CODE_NUMBER | ||
$dataSeriesValues = [ | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$5', Properties::FORMAT_CODE_NUMBER, 4), | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', Properties::FORMAT_CODE_NUMBER, 4), | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$5', Properties::FORMAT_CODE_NUMBER, 4), | ||
]; | ||
|
||
// series 1 | ||
// marker details | ||
$dataSeriesValues[0] | ||
->setPointMarker('diamond') | ||
->setPointSize(5) | ||
->getMarkerFillColor() | ||
->setColorProperties('0070C0', null, ChartColor::EXCEL_COLOR_TYPE_RGB); | ||
$dataSeriesValues[0] | ||
->getMarkerBorderColor() | ||
->setColorProperties('002060', null, ChartColor::EXCEL_COLOR_TYPE_RGB); | ||
|
||
// line details - smooth line, connected | ||
$dataSeriesValues[0] | ||
->setScatterLines(true) | ||
->setSmoothLine(true) | ||
->setLineColorProperties('accent1', 40, ChartColor::EXCEL_COLOR_TYPE_SCHEME); // value, alpha, type | ||
$dataSeriesValues[0]->setLineStyleProperties( | ||
2.5, // width in points | ||
Properties::LINE_STYLE_COMPOUND_TRIPLE, // compound | ||
Properties::LINE_STYLE_DASH_SQUARE_DOT, // dash | ||
Properties::LINE_STYLE_CAP_SQUARE, // cap | ||
Properties::LINE_STYLE_JOIN_MITER, // join | ||
Properties::LINE_STYLE_ARROW_TYPE_OPEN, // head type | ||
Properties::LINE_STYLE_ARROW_SIZE_4, // head size preset index | ||
Properties::LINE_STYLE_ARROW_TYPE_ARROW, // end type | ||
Properties::LINE_STYLE_ARROW_SIZE_6 // end size preset index | ||
); | ||
|
||
// series 2 - straight line - no special effects, connected, straight line | ||
$dataSeriesValues[1] // square fill | ||
->setPointMarker('square') | ||
->setPointSize(6) | ||
->getMarkerBorderColor() | ||
->setColorProperties('accent6', 3, ChartColor::EXCEL_COLOR_TYPE_SCHEME); | ||
$dataSeriesValues[1] // square border | ||
->getMarkerFillColor() | ||
->setColorProperties('0FFF00', null, ChartColor::EXCEL_COLOR_TYPE_RGB); | ||
$dataSeriesValues[1] | ||
->setScatterLines(true) | ||
->setSmoothLine(false) | ||
->setLineColorProperties('FF0000', 80, ChartColor::EXCEL_COLOR_TYPE_RGB); | ||
$dataSeriesValues[1]->setLineWidth(2.0); | ||
|
||
// series 3 - markers, no line | ||
$dataSeriesValues[2] // triangle fill | ||
//->setPointMarker('triangle') // let Excel choose shape | ||
->setPointSize(7) | ||
->getMarkerFillColor() | ||
->setColorProperties('FFFF00', null, ChartColor::EXCEL_COLOR_TYPE_RGB); | ||
$dataSeriesValues[2] // triangle border | ||
->getMarkerBorderColor() | ||
->setColorProperties('accent4', null, ChartColor::EXCEL_COLOR_TYPE_SCHEME); | ||
$dataSeriesValues[2]->setScatterLines(false); // points not connected | ||
|
||
// Added so that Xaxis shows dates instead of Excel-equivalent-year1900-numbers | ||
$xAxis = new Axis(); | ||
//$xAxis->setAxisNumberProperties(Properties::FORMAT_CODE_DATE ); | ||
$xAxis->setAxisNumberProperties(Properties::FORMAT_CODE_DATE_ISO8601, true); | ||
$xAxis->setAxisOption('textRotation', '45'); | ||
$xAxis->setAxisOption('hidden', '1'); | ||
|
||
$yAxis = new Axis(); | ||
$yAxis->setLineStyleProperties( | ||
2.5, // width in points | ||
Properties::LINE_STYLE_COMPOUND_SIMPLE, | ||
Properties::LINE_STYLE_DASH_DASH_DOT, | ||
Properties::LINE_STYLE_CAP_FLAT, | ||
Properties::LINE_STYLE_JOIN_BEVEL | ||
); | ||
$yAxis->setLineColorProperties('ffc000', null, ChartColor::EXCEL_COLOR_TYPE_RGB); | ||
$yAxis->setAxisOption('hidden', '1'); | ||
|
||
// Build the dataseries | ||
$series = new DataSeries( | ||
DataSeries::TYPE_SCATTERCHART, // plotType | ||
null, // plotGrouping (Scatter charts don't have any grouping) | ||
range(0, count($dataSeriesValues) - 1), // plotOrder | ||
$dataSeriesLabels, // plotLabel | ||
$xAxisTickValues, // plotCategory | ||
$dataSeriesValues, // plotValues | ||
null, // plotDirection | ||
false, // smooth line | ||
DataSeries::STYLE_SMOOTHMARKER // plotStyle | ||
); | ||
|
||
// Set the series in the plot area | ||
$plotArea = new PlotArea(null, [$series]); | ||
$plotArea->setNoFill(true); | ||
// Set the chart legend | ||
$legend = new ChartLegend(ChartLegend::POSITION_TOPRIGHT, null, false); | ||
|
||
$title = new Title('Test Scatter Trend Chart'); | ||
//$yAxisLabel = new Title('Value ($k)'); | ||
|
||
// Create the chart | ||
$chart = new Chart( | ||
'chart1', // name | ||
$title, // title | ||
$legend, // legend | ||
$plotArea, // plotArea | ||
true, // plotVisibleOnly | ||
DataSeries::EMPTY_AS_GAP, // displayBlanksAs | ||
null, // xAxisLabel | ||
null, //$yAxisLabel, // yAxisLabel | ||
// added xAxis for correct date display | ||
$xAxis, // xAxis | ||
$yAxis, // yAxis | ||
); | ||
$chart->setNoFill(true); | ||
|
||
// Set the position where the chart should appear in the worksheet | ||
$chart->setTopLeftPosition('A7'); | ||
$chart->setBottomRightPosition('P20'); | ||
// Add the chart to the worksheet | ||
$worksheet->addChart($chart); | ||
|
||
// Save Excel 2007 file | ||
$filename = $helper->getFilename(__FILE__); | ||
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); | ||
$writer->setIncludeCharts(true); | ||
$callStartTime = microtime(true); | ||
$writer->save($filename); | ||
$spreadsheet->disconnectWorksheets(); | ||
$helper->logWrite($writer, $filename, $callStartTime); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
<?php | ||
|
||
use PhpOffice\PhpSpreadsheet\Chart\Chart; | ||
use PhpOffice\PhpSpreadsheet\Chart\ChartColor; | ||
use PhpOffice\PhpSpreadsheet\Chart\DataSeries; | ||
use PhpOffice\PhpSpreadsheet\Chart\DataSeriesValues; | ||
use PhpOffice\PhpSpreadsheet\Chart\Legend as ChartLegend; | ||
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], | ||
] | ||
); | ||
|
||
// 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 | ||
$dataSeriesLabels = [ | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$B$1', null, 1), // 2010 | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$C$1', null, 1), // 2011 | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, 'Worksheet!$D$1', null, 1), // 2012 | ||
]; | ||
// Set the X-Axis Labels | ||
$xAxisTickValues = [ | ||
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 | ||
$dataSeriesValues = [ | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$B$2:$B$5', null, 4), | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$C$2:$C$5', null, 4), | ||
new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, 'Worksheet!$D$2:$D$5', null, 4), | ||
]; | ||
|
||
// Build the dataseries | ||
$series = new DataSeries( | ||
DataSeries::TYPE_SCATTERCHART, // plotType | ||
null, // plotGrouping (Scatter charts don't have any grouping) | ||
range(0, count($dataSeriesValues) - 1), // plotOrder | ||
$dataSeriesLabels, // plotLabel | ||
$xAxisTickValues, // plotCategory | ||
$dataSeriesValues, // plotValues | ||
null, // plotDirection | ||
null, // smooth line | ||
DataSeries::STYLE_LINEMARKER // plotStyle | ||
); | ||
|
||
// Set the series in the plot area | ||
$plotArea = new PlotArea(null, [$series]); | ||
|
||
$pos1 = 0; // pos = 0% (extreme low side or lower left corner) | ||
$brightness1 = 0; // 0% | ||
$gsColor1 = new ChartColor(); | ||
$gsColor1->setColorProperties('FF0000', 75, 'srgbClr', $brightness1); // red | ||
$gradientStop1 = [$pos1, $gsColor1]; | ||
|
||
$pos2 = 0.5; // pos = 50% (middle) | ||
$brightness2 = 0.5; // 50% | ||
$gsColor2 = new ChartColor(); | ||
$gsColor2->setColorProperties('FFFF00', 50, 'srgbClr', $brightness2); // yellow | ||
$gradientStop2 = [$pos2, $gsColor2]; | ||
|
||
$pos3 = 1.0; // pos = 100% (extreme high side or upper right corner) | ||
$brightness3 = 0.5; // 50% | ||
$gsColor3 = new ChartColor(); | ||
$gsColor3->setColorProperties('00B050', 50, 'srgbClr', $brightness3); // green | ||
$gradientStop3 = [$pos3, $gsColor3]; | ||
|
||
$gradientFillStops = [ | ||
$gradientStop1, | ||
$gradientStop2, | ||
$gradientStop3, | ||
]; | ||
$gradientFillAngle = 315.0; // 45deg above horiz | ||
|
||
$plotArea->setGradientFillProperties($gradientFillStops, $gradientFillAngle); | ||
|
||
// Set the chart legend | ||
$legend = new ChartLegend(ChartLegend::POSITION_TOPRIGHT, null, false); | ||
|
||
$title = new Title('Test Scatter Chart'); | ||
$yAxisLabel = new Title('Value ($k)'); | ||
|
||
// Create the chart | ||
$chart = new Chart( | ||
'chart1', // name | ||
$title, // title | ||
$legend, // legend | ||
$plotArea, // plotArea | ||
true, // plotVisibleOnly | ||
DataSeries::EMPTY_AS_GAP, // displayBlanksAs | ||
null, // xAxisLabel | ||
$yAxisLabel // yAxisLabel | ||
); | ||
|
||
// Set the position where the chart should appear in the worksheet | ||
$chart->setTopLeftPosition('A7'); | ||
$chart->setBottomRightPosition('H20'); | ||
|
||
// Add the chart to the worksheet | ||
$worksheet->addChart($chart); | ||
|
||
// 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); |
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.