<?php
|
|
namespace PhpOffice\PhpSpreadsheet\Chart;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
|
class DataSeries
|
{
|
const TYPE_BARCHART = 'barChart';
|
const TYPE_BARCHART_3D = 'bar3DChart';
|
const TYPE_LINECHART = 'lineChart';
|
const TYPE_LINECHART_3D = 'line3DChart';
|
const TYPE_AREACHART = 'areaChart';
|
const TYPE_AREACHART_3D = 'area3DChart';
|
const TYPE_PIECHART = 'pieChart';
|
const TYPE_PIECHART_3D = 'pie3DChart';
|
const TYPE_DOUGHNUTCHART = 'doughnutChart';
|
const TYPE_DONUTCHART = self::TYPE_DOUGHNUTCHART; // Synonym
|
const TYPE_SCATTERCHART = 'scatterChart';
|
const TYPE_SURFACECHART = 'surfaceChart';
|
const TYPE_SURFACECHART_3D = 'surface3DChart';
|
const TYPE_RADARCHART = 'radarChart';
|
const TYPE_BUBBLECHART = 'bubbleChart';
|
const TYPE_STOCKCHART = 'stockChart';
|
const TYPE_CANDLECHART = self::TYPE_STOCKCHART; // Synonym
|
|
const GROUPING_CLUSTERED = 'clustered';
|
const GROUPING_STACKED = 'stacked';
|
const GROUPING_PERCENT_STACKED = 'percentStacked';
|
const GROUPING_STANDARD = 'standard';
|
|
const DIRECTION_BAR = 'bar';
|
const DIRECTION_HORIZONTAL = self::DIRECTION_BAR;
|
const DIRECTION_COL = 'col';
|
const DIRECTION_COLUMN = self::DIRECTION_COL;
|
const DIRECTION_VERTICAL = self::DIRECTION_COL;
|
|
const STYLE_LINEMARKER = 'lineMarker';
|
const STYLE_SMOOTHMARKER = 'smoothMarker';
|
const STYLE_MARKER = 'marker';
|
const STYLE_FILLED = 'filled';
|
|
const EMPTY_AS_GAP = 'gap';
|
const EMPTY_AS_ZERO = 'zero';
|
const EMPTY_AS_SPAN = 'span';
|
|
/**
|
* Series Plot Type.
|
*/
|
private ?string $plotType;
|
|
/**
|
* Plot Grouping Type.
|
*/
|
private ?string $plotGrouping;
|
|
/**
|
* Plot Direction.
|
*/
|
private string $plotDirection;
|
|
/**
|
* Plot Style.
|
*/
|
private ?string $plotStyle;
|
|
/**
|
* Order of plots in Series.
|
*
|
* @var int[]
|
*/
|
private array $plotOrder;
|
|
/**
|
* Plot Label.
|
*
|
* @var DataSeriesValues[]
|
*/
|
private array $plotLabel;
|
|
/**
|
* Plot Category.
|
*
|
* @var DataSeriesValues[]
|
*/
|
private array $plotCategory;
|
|
/**
|
* Smooth Line. Must be specified for both DataSeries and DataSeriesValues.
|
*/
|
private bool $smoothLine;
|
|
/**
|
* Plot Values.
|
*
|
* @var DataSeriesValues[]
|
*/
|
private array $plotValues;
|
|
/**
|
* Plot Bubble Sizes.
|
*
|
* @var DataSeriesValues[]
|
*/
|
private array $plotBubbleSizes = [];
|
|
/**
|
* Create a new DataSeries.
|
*
|
* @param int[] $plotOrder
|
* @param DataSeriesValues[] $plotLabel
|
* @param DataSeriesValues[] $plotCategory
|
* @param DataSeriesValues[] $plotValues
|
*/
|
public function __construct(
|
null|string $plotType = null,
|
null|string $plotGrouping = null,
|
array $plotOrder = [],
|
array $plotLabel = [],
|
array $plotCategory = [],
|
array $plotValues = [],
|
?string $plotDirection = null,
|
bool $smoothLine = false,
|
?string $plotStyle = null
|
) {
|
$this->plotType = $plotType;
|
$this->plotGrouping = $plotGrouping;
|
$this->plotOrder = $plotOrder;
|
$keys = array_keys($plotValues);
|
$this->plotValues = $plotValues;
|
if (!isset($plotLabel[$keys[0]])) {
|
$plotLabel[$keys[0]] = new DataSeriesValues();
|
}
|
$this->plotLabel = $plotLabel;
|
|
if (!isset($plotCategory[$keys[0]])) {
|
$plotCategory[$keys[0]] = new DataSeriesValues();
|
}
|
$this->plotCategory = $plotCategory;
|
|
$this->smoothLine = (bool) $smoothLine;
|
$this->plotStyle = $plotStyle;
|
|
if ($plotDirection === null) {
|
$plotDirection = self::DIRECTION_COL;
|
}
|
$this->plotDirection = $plotDirection;
|
}
|
|
/**
|
* Get Plot Type.
|
*/
|
public function getPlotType(): ?string
|
{
|
return $this->plotType;
|
}
|
|
/**
|
* Set Plot Type.
|
*
|
* @return $this
|
*/
|
public function setPlotType(string $plotType): static
|
{
|
$this->plotType = $plotType;
|
|
return $this;
|
}
|
|
/**
|
* Get Plot Grouping Type.
|
*/
|
public function getPlotGrouping(): ?string
|
{
|
return $this->plotGrouping;
|
}
|
|
/**
|
* Set Plot Grouping Type.
|
*
|
* @return $this
|
*/
|
public function setPlotGrouping(string $groupingType): static
|
{
|
$this->plotGrouping = $groupingType;
|
|
return $this;
|
}
|
|
/**
|
* Get Plot Direction.
|
*/
|
public function getPlotDirection(): string
|
{
|
return $this->plotDirection;
|
}
|
|
/**
|
* Set Plot Direction.
|
*
|
* @return $this
|
*/
|
public function setPlotDirection(string $plotDirection): static
|
{
|
$this->plotDirection = $plotDirection;
|
|
return $this;
|
}
|
|
/**
|
* Get Plot Order.
|
*
|
* @return int[]
|
*/
|
public function getPlotOrder(): array
|
{
|
return $this->plotOrder;
|
}
|
|
/**
|
* Get Plot Labels.
|
*
|
* @return DataSeriesValues[]
|
*/
|
public function getPlotLabels(): array
|
{
|
return $this->plotLabel;
|
}
|
|
/**
|
* Get Plot Label by Index.
|
*
|
* @return DataSeriesValues|false
|
*/
|
public function getPlotLabelByIndex(int $index): bool|DataSeriesValues
|
{
|
$keys = array_keys($this->plotLabel);
|
if (in_array($index, $keys)) {
|
return $this->plotLabel[$index];
|
}
|
|
return false;
|
}
|
|
/**
|
* Get Plot Categories.
|
*
|
* @return DataSeriesValues[]
|
*/
|
public function getPlotCategories(): array
|
{
|
return $this->plotCategory;
|
}
|
|
/**
|
* Get Plot Category by Index.
|
*
|
* @return DataSeriesValues|false
|
*/
|
public function getPlotCategoryByIndex(int $index): bool|DataSeriesValues
|
{
|
$keys = array_keys($this->plotCategory);
|
if (in_array($index, $keys)) {
|
return $this->plotCategory[$index];
|
} elseif (isset($keys[$index])) {
|
return $this->plotCategory[$keys[$index]];
|
}
|
|
return false;
|
}
|
|
/**
|
* Get Plot Style.
|
*/
|
public function getPlotStyle(): ?string
|
{
|
return $this->plotStyle;
|
}
|
|
/**
|
* Set Plot Style.
|
*
|
* @return $this
|
*/
|
public function setPlotStyle(?string $plotStyle): static
|
{
|
$this->plotStyle = $plotStyle;
|
|
return $this;
|
}
|
|
/**
|
* Get Plot Values.
|
*
|
* @return DataSeriesValues[]
|
*/
|
public function getPlotValues(): array
|
{
|
return $this->plotValues;
|
}
|
|
/**
|
* Get Plot Values by Index.
|
*
|
* @return DataSeriesValues|false
|
*/
|
public function getPlotValuesByIndex(int $index): bool|DataSeriesValues
|
{
|
$keys = array_keys($this->plotValues);
|
if (in_array($index, $keys)) {
|
return $this->plotValues[$index];
|
}
|
|
return false;
|
}
|
|
/**
|
* Get Plot Bubble Sizes.
|
*
|
* @return DataSeriesValues[]
|
*/
|
public function getPlotBubbleSizes(): array
|
{
|
return $this->plotBubbleSizes;
|
}
|
|
/**
|
* Set Plot Bubble Sizes.
|
*
|
* @param DataSeriesValues[] $plotBubbleSizes
|
*/
|
public function setPlotBubbleSizes(array $plotBubbleSizes): self
|
{
|
$this->plotBubbleSizes = $plotBubbleSizes;
|
|
return $this;
|
}
|
|
/**
|
* Get Number of Plot Series.
|
*/
|
public function getPlotSeriesCount(): int
|
{
|
return count($this->plotValues);
|
}
|
|
/**
|
* Get Smooth Line.
|
*/
|
public function getSmoothLine(): bool
|
{
|
return $this->smoothLine;
|
}
|
|
/**
|
* Set Smooth Line.
|
*
|
* @return $this
|
*/
|
public function setSmoothLine(bool $smoothLine): static
|
{
|
$this->smoothLine = $smoothLine;
|
|
return $this;
|
}
|
|
public function refresh(Worksheet $worksheet): void
|
{
|
foreach ($this->plotValues as $plotValues) {
|
if ($plotValues !== null) {
|
$plotValues->refresh($worksheet, true);
|
}
|
}
|
foreach ($this->plotLabel as $plotValues) {
|
if ($plotValues !== null) {
|
$plotValues->refresh($worksheet, true);
|
}
|
}
|
foreach ($this->plotCategory as $plotValues) {
|
if ($plotValues !== null) {
|
$plotValues->refresh($worksheet, false);
|
}
|
}
|
}
|
|
/**
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
*/
|
public function __clone()
|
{
|
$plotLabels = $this->plotLabel;
|
$this->plotLabel = [];
|
foreach ($plotLabels as $plotLabel) {
|
$this->plotLabel[] = $plotLabel;
|
}
|
$plotCategories = $this->plotCategory;
|
$this->plotCategory = [];
|
foreach ($plotCategories as $plotCategory) {
|
$this->plotCategory[] = clone $plotCategory;
|
}
|
$plotValues = $this->plotValues;
|
$this->plotValues = [];
|
foreach ($plotValues as $plotValue) {
|
$this->plotValues[] = clone $plotValue;
|
}
|
$plotBubbleSizes = $this->plotBubbleSizes;
|
$this->plotBubbleSizes = [];
|
foreach ($plotBubbleSizes as $plotBubbleSize) {
|
$this->plotBubbleSizes[] = clone $plotBubbleSize;
|
}
|
}
|
}
|