mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-22 05:23:54 +00:00
09406a6a3f
* Move Gridlines from Chart to Axis This could, I hope, be my last major change to Chart for a while. When I first noticed this problem, I thought it would be a breaking change. However, although this change establishes some deprecations, I don't think it breaks anything. Major and minor gridlines had only been settable by the Chart constructor. This PR moves them where they belong, to Axis (eexisting Chart constructor code will still work). This allows them to be specified from both X and Y axis. Chart is now entirely covered except for 2 statements, one deprecated and one that I just can't figure out. 99.71% for Charts, 88.96% overall. All references to the Chart directory in Phpstan baseline are eliminated. * Minor Fixes, Unit Tests Line style color type should default to null not prstClr. Chart X-axis and Y-axis should alway be Axis, never null. Add some unit tests. * More Tests, Some Improvements Make it easier to change line styles, adding an alternate method besides a setter function with at least a dozen parameters.
210 lines
6.4 KiB
PHP
210 lines
6.4 KiB
PHP
<?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\GridLines;
|
|
use PhpOffice\PhpSpreadsheet\Chart\Layout;
|
|
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();
|
|
$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),
|
|
];
|
|
$labelLayout = new Layout();
|
|
$labelLayout
|
|
->setShowVal(true)
|
|
->setLabelFontColor(new ChartColor('FFFF00'))
|
|
->setLabelFillColor(new ChartColor('accent2', null, 'schemeClr'));
|
|
$dataSeriesValues1[0]->setLabelLayout($labelLayout);
|
|
|
|
// Build the dataseries
|
|
$series1 = new DataSeries(
|
|
DataSeries::TYPE_BARCHART, // 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 ChartLegend(ChartLegend::POSITION_RIGHT, null, false);
|
|
|
|
$title1 = new Title('Test Bar Chart');
|
|
|
|
// Create the chart
|
|
$chart1 = new Chart(
|
|
'chart1', // name
|
|
$title1, // title
|
|
$legend1, // legend
|
|
$plotArea1, // plotArea
|
|
true, // plotVisibleOnly
|
|
DataSeries::EMPTY_AS_GAP, // displayBlanksAs
|
|
null, // xAxisLabel
|
|
null // yAxisLabel - Pie charts don't have a Y-Axis
|
|
);
|
|
$majorGridlinesY = new GridLines();
|
|
$majorGridlinesY->setLineColorProperties('FF0000');
|
|
$minorGridlinesY = new GridLines();
|
|
$minorGridlinesY->setLineStyleProperty('dash', Properties::LINE_STYLE_DASH_ROUND_DOT);
|
|
$chart1
|
|
->getChartAxisY()
|
|
->setMajorGridlines($majorGridlinesY)
|
|
->setMinorGridlines($minorGridlinesY);
|
|
$majorGridlinesX = new GridLines();
|
|
$majorGridlinesX->setLineColorProperties('FF00FF');
|
|
$minorGridlinesX = new GridLines();
|
|
$minorGridlinesX->activateObject();
|
|
$chart1
|
|
->getChartAxisX()
|
|
->setMajorGridlines($majorGridlinesX)
|
|
->setMinorGridlines($minorGridlinesX);
|
|
|
|
// 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);
|
|
$layout2->setLabelFillColor(new ChartColor('FFFF00'));
|
|
|
|
// 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
|
|
DataSeries::EMPTY_AS_GAP, // 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);
|