790 lines
15 KiB
PHP
790 lines
15 KiB
PHP
<?php
|
|
|
|
namespace PhpOffice\PhpSpreadsheet\Chart;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Settings;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
|
|
|
class Chart
|
|
{
|
|
/**
|
|
* Chart Name.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $name = '';
|
|
|
|
/**
|
|
* Worksheet.
|
|
*
|
|
* @var ?Worksheet
|
|
*/
|
|
private $worksheet;
|
|
|
|
/**
|
|
* Chart Title.
|
|
*
|
|
* @var ?Title
|
|
*/
|
|
private $title;
|
|
|
|
/**
|
|
* Chart Legend.
|
|
*
|
|
* @var ?Legend
|
|
*/
|
|
private $legend;
|
|
|
|
/**
|
|
* X-Axis Label.
|
|
*
|
|
* @var ?Title
|
|
*/
|
|
private $xAxisLabel;
|
|
|
|
/**
|
|
* Y-Axis Label.
|
|
*
|
|
* @var ?Title
|
|
*/
|
|
private $yAxisLabel;
|
|
|
|
/**
|
|
* Chart Plot Area.
|
|
*
|
|
* @var ?PlotArea
|
|
*/
|
|
private $plotArea;
|
|
|
|
/**
|
|
* Plot Visible Only.
|
|
*
|
|
* @var bool
|
|
*/
|
|
private $plotVisibleOnly = true;
|
|
|
|
/**
|
|
* Display Blanks as.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $displayBlanksAs = DataSeries::EMPTY_AS_GAP;
|
|
|
|
/**
|
|
* Chart Asix Y as.
|
|
*
|
|
* @var Axis
|
|
*/
|
|
private $yAxis;
|
|
|
|
/**
|
|
* Chart Asix X as.
|
|
*
|
|
* @var Axis
|
|
*/
|
|
private $xAxis;
|
|
|
|
/**
|
|
* Top-Left Cell Position.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $topLeftCellRef = 'A1';
|
|
|
|
/**
|
|
* Top-Left X-Offset.
|
|
*
|
|
* @var int
|
|
*/
|
|
private $topLeftXOffset = 0;
|
|
|
|
/**
|
|
* Top-Left Y-Offset.
|
|
*
|
|
* @var int
|
|
*/
|
|
private $topLeftYOffset = 0;
|
|
|
|
/**
|
|
* Bottom-Right Cell Position.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $bottomRightCellRef = '';
|
|
|
|
/**
|
|
* Bottom-Right X-Offset.
|
|
*
|
|
* @var int
|
|
*/
|
|
private $bottomRightXOffset = 10;
|
|
|
|
/**
|
|
* Bottom-Right Y-Offset.
|
|
*
|
|
* @var int
|
|
*/
|
|
private $bottomRightYOffset = 10;
|
|
|
|
/** @var ?int */
|
|
private $rotX;
|
|
|
|
/** @var ?int */
|
|
private $rotY;
|
|
|
|
/** @var ?int */
|
|
private $rAngAx;
|
|
|
|
/** @var ?int */
|
|
private $perspective;
|
|
|
|
/** @var bool */
|
|
private $oneCellAnchor = false;
|
|
|
|
/** @var bool */
|
|
private $autoTitleDeleted = false;
|
|
|
|
/** @var bool */
|
|
private $noFill = false;
|
|
|
|
/** @var bool */
|
|
private $roundedCorners = false;
|
|
|
|
/**
|
|
* Create a new Chart.
|
|
* majorGridlines and minorGridlines are deprecated, moved to Axis.
|
|
*
|
|
* @param mixed $name
|
|
* @param mixed $plotVisibleOnly
|
|
* @param string $displayBlanksAs
|
|
*/
|
|
public function __construct($name, ?Title $title = null, ?Legend $legend = null, ?PlotArea $plotArea = null, $plotVisibleOnly = true, $displayBlanksAs = DataSeries::EMPTY_AS_GAP, ?Title $xAxisLabel = null, ?Title $yAxisLabel = null, ?Axis $xAxis = null, ?Axis $yAxis = null, ?GridLines $majorGridlines = null, ?GridLines $minorGridlines = null)
|
|
{
|
|
$this->name = $name;
|
|
$this->title = $title;
|
|
$this->legend = $legend;
|
|
$this->xAxisLabel = $xAxisLabel;
|
|
$this->yAxisLabel = $yAxisLabel;
|
|
$this->plotArea = $plotArea;
|
|
$this->plotVisibleOnly = $plotVisibleOnly;
|
|
$this->displayBlanksAs = $displayBlanksAs;
|
|
$this->xAxis = $xAxis ?? new Axis();
|
|
$this->yAxis = $yAxis ?? new Axis();
|
|
if ($majorGridlines !== null) {
|
|
$this->yAxis->setMajorGridlines($majorGridlines);
|
|
}
|
|
if ($minorGridlines !== null) {
|
|
$this->yAxis->setMinorGridlines($minorGridlines);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get Name.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getName()
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function setName(string $name): self
|
|
{
|
|
$this->name = $name;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get Worksheet.
|
|
*/
|
|
public function getWorksheet(): ?Worksheet
|
|
{
|
|
return $this->worksheet;
|
|
}
|
|
|
|
/**
|
|
* Set Worksheet.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setWorksheet(?Worksheet $worksheet = null)
|
|
{
|
|
$this->worksheet = $worksheet;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getTitle(): ?Title
|
|
{
|
|
return $this->title;
|
|
}
|
|
|
|
/**
|
|
* Set Title.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTitle(Title $title)
|
|
{
|
|
$this->title = $title;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getLegend(): ?Legend
|
|
{
|
|
return $this->legend;
|
|
}
|
|
|
|
/**
|
|
* Set Legend.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setLegend(Legend $legend)
|
|
{
|
|
$this->legend = $legend;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getXAxisLabel(): ?Title
|
|
{
|
|
return $this->xAxisLabel;
|
|
}
|
|
|
|
/**
|
|
* Set X-Axis Label.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setXAxisLabel(Title $label)
|
|
{
|
|
$this->xAxisLabel = $label;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getYAxisLabel(): ?Title
|
|
{
|
|
return $this->yAxisLabel;
|
|
}
|
|
|
|
/**
|
|
* Set Y-Axis Label.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setYAxisLabel(Title $label)
|
|
{
|
|
$this->yAxisLabel = $label;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getPlotArea(): ?PlotArea
|
|
{
|
|
return $this->plotArea;
|
|
}
|
|
|
|
/**
|
|
* Set Plot Area.
|
|
*/
|
|
public function setPlotArea(PlotArea $plotArea): self
|
|
{
|
|
$this->plotArea = $plotArea;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get Plot Visible Only.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function getPlotVisibleOnly()
|
|
{
|
|
return $this->plotVisibleOnly;
|
|
}
|
|
|
|
/**
|
|
* Set Plot Visible Only.
|
|
*
|
|
* @param bool $plotVisibleOnly
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setPlotVisibleOnly($plotVisibleOnly)
|
|
{
|
|
$this->plotVisibleOnly = $plotVisibleOnly;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get Display Blanks as.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDisplayBlanksAs()
|
|
{
|
|
return $this->displayBlanksAs;
|
|
}
|
|
|
|
/**
|
|
* Set Display Blanks as.
|
|
*
|
|
* @param string $displayBlanksAs
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setDisplayBlanksAs($displayBlanksAs)
|
|
{
|
|
$this->displayBlanksAs = $displayBlanksAs;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getChartAxisY(): Axis
|
|
{
|
|
return $this->yAxis;
|
|
}
|
|
|
|
/**
|
|
* Set yAxis.
|
|
*/
|
|
public function setChartAxisY(?Axis $axis): self
|
|
{
|
|
$this->yAxis = $axis ?? new Axis();
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getChartAxisX(): Axis
|
|
{
|
|
return $this->xAxis;
|
|
}
|
|
|
|
/**
|
|
* Set xAxis.
|
|
*/
|
|
public function setChartAxisX(?Axis $axis): self
|
|
{
|
|
$this->xAxis = $axis ?? new Axis();
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get Major Gridlines.
|
|
*
|
|
* @deprecated 1.24.0 Use Axis->getMajorGridlines()
|
|
* @see Axis::getMajorGridlines()
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function getMajorGridlines(): ?GridLines
|
|
{
|
|
return $this->yAxis->getMajorGridLines();
|
|
}
|
|
|
|
/**
|
|
* Get Minor Gridlines.
|
|
*
|
|
* @deprecated 1.24.0 Use Axis->getMinorGridlines()
|
|
* @see Axis::getMinorGridlines()
|
|
*
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function getMinorGridlines(): ?GridLines
|
|
{
|
|
return $this->yAxis->getMinorGridLines();
|
|
}
|
|
|
|
/**
|
|
* Set the Top Left position for the chart.
|
|
*
|
|
* @param string $cellAddress
|
|
* @param int $xOffset
|
|
* @param int $yOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTopLeftPosition($cellAddress, $xOffset = null, $yOffset = null)
|
|
{
|
|
$this->topLeftCellRef = $cellAddress;
|
|
if ($xOffset !== null) {
|
|
$this->setTopLeftXOffset($xOffset);
|
|
}
|
|
if ($yOffset !== null) {
|
|
$this->setTopLeftYOffset($yOffset);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the top left position of the chart.
|
|
*
|
|
* Returns ['cell' => string cell address, 'xOffset' => int, 'yOffset' => int].
|
|
*
|
|
* @return array{cell: string, xOffset: int, yOffset: int} an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell
|
|
*/
|
|
public function getTopLeftPosition(): array
|
|
{
|
|
return [
|
|
'cell' => $this->topLeftCellRef,
|
|
'xOffset' => $this->topLeftXOffset,
|
|
'yOffset' => $this->topLeftYOffset,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get the cell address where the top left of the chart is fixed.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getTopLeftCell()
|
|
{
|
|
return $this->topLeftCellRef;
|
|
}
|
|
|
|
/**
|
|
* Set the Top Left cell position for the chart.
|
|
*
|
|
* @param string $cellAddress
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTopLeftCell($cellAddress)
|
|
{
|
|
$this->topLeftCellRef = $cellAddress;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the offset position within the Top Left cell for the chart.
|
|
*
|
|
* @param ?int $xOffset
|
|
* @param ?int $yOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTopLeftOffset($xOffset, $yOffset)
|
|
{
|
|
if ($xOffset !== null) {
|
|
$this->setTopLeftXOffset($xOffset);
|
|
}
|
|
|
|
if ($yOffset !== null) {
|
|
$this->setTopLeftYOffset($yOffset);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the offset position within the Top Left cell for the chart.
|
|
*
|
|
* @return int[]
|
|
*/
|
|
public function getTopLeftOffset()
|
|
{
|
|
return [
|
|
'X' => $this->topLeftXOffset,
|
|
'Y' => $this->topLeftYOffset,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param int $xOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTopLeftXOffset($xOffset)
|
|
{
|
|
$this->topLeftXOffset = $xOffset;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getTopLeftXOffset(): int
|
|
{
|
|
return $this->topLeftXOffset;
|
|
}
|
|
|
|
/**
|
|
* @param int $yOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setTopLeftYOffset($yOffset)
|
|
{
|
|
$this->topLeftYOffset = $yOffset;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getTopLeftYOffset(): int
|
|
{
|
|
return $this->topLeftYOffset;
|
|
}
|
|
|
|
/**
|
|
* Set the Bottom Right position of the chart.
|
|
*
|
|
* @param string $cellAddress
|
|
* @param int $xOffset
|
|
* @param int $yOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setBottomRightPosition($cellAddress = '', $xOffset = null, $yOffset = null)
|
|
{
|
|
$this->bottomRightCellRef = $cellAddress;
|
|
if ($xOffset !== null) {
|
|
$this->setBottomRightXOffset($xOffset);
|
|
}
|
|
if ($yOffset !== null) {
|
|
$this->setBottomRightYOffset($yOffset);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the bottom right position of the chart.
|
|
*
|
|
* @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell
|
|
*/
|
|
public function getBottomRightPosition()
|
|
{
|
|
return [
|
|
'cell' => $this->bottomRightCellRef,
|
|
'xOffset' => $this->bottomRightXOffset,
|
|
'yOffset' => $this->bottomRightYOffset,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Set the Bottom Right cell for the chart.
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setBottomRightCell(string $cellAddress = '')
|
|
{
|
|
$this->bottomRightCellRef = $cellAddress;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the cell address where the bottom right of the chart is fixed.
|
|
*/
|
|
public function getBottomRightCell(): string
|
|
{
|
|
return $this->bottomRightCellRef;
|
|
}
|
|
|
|
/**
|
|
* Set the offset position within the Bottom Right cell for the chart.
|
|
*
|
|
* @param ?int $xOffset
|
|
* @param ?int $yOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setBottomRightOffset($xOffset, $yOffset)
|
|
{
|
|
if ($xOffset !== null) {
|
|
$this->setBottomRightXOffset($xOffset);
|
|
}
|
|
|
|
if ($yOffset !== null) {
|
|
$this->setBottomRightYOffset($yOffset);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the offset position within the Bottom Right cell for the chart.
|
|
*
|
|
* @return int[]
|
|
*/
|
|
public function getBottomRightOffset()
|
|
{
|
|
return [
|
|
'X' => $this->bottomRightXOffset,
|
|
'Y' => $this->bottomRightYOffset,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param int $xOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setBottomRightXOffset($xOffset)
|
|
{
|
|
$this->bottomRightXOffset = $xOffset;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getBottomRightXOffset(): int
|
|
{
|
|
return $this->bottomRightXOffset;
|
|
}
|
|
|
|
/**
|
|
* @param int $yOffset
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function setBottomRightYOffset($yOffset)
|
|
{
|
|
$this->bottomRightYOffset = $yOffset;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getBottomRightYOffset(): int
|
|
{
|
|
return $this->bottomRightYOffset;
|
|
}
|
|
|
|
public function refresh(): void
|
|
{
|
|
if ($this->worksheet !== null && $this->plotArea !== null) {
|
|
$this->plotArea->refresh($this->worksheet);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render the chart to given file (or stream).
|
|
*
|
|
* @param string $outputDestination Name of the file render to
|
|
*
|
|
* @return bool true on success
|
|
*/
|
|
public function render($outputDestination = null)
|
|
{
|
|
if ($outputDestination == 'php://output') {
|
|
$outputDestination = null;
|
|
}
|
|
|
|
$libraryName = Settings::getChartRenderer();
|
|
if ($libraryName === null) {
|
|
return false;
|
|
}
|
|
|
|
// Ensure that data series values are up-to-date before we render
|
|
$this->refresh();
|
|
|
|
$renderer = new $libraryName($this);
|
|
|
|
return $renderer->render($outputDestination); // @phpstan-ignore-line
|
|
}
|
|
|
|
public function getRotX(): ?int
|
|
{
|
|
return $this->rotX;
|
|
}
|
|
|
|
public function setRotX(?int $rotX): self
|
|
{
|
|
$this->rotX = $rotX;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getRotY(): ?int
|
|
{
|
|
return $this->rotY;
|
|
}
|
|
|
|
public function setRotY(?int $rotY): self
|
|
{
|
|
$this->rotY = $rotY;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getRAngAx(): ?int
|
|
{
|
|
return $this->rAngAx;
|
|
}
|
|
|
|
public function setRAngAx(?int $rAngAx): self
|
|
{
|
|
$this->rAngAx = $rAngAx;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getPerspective(): ?int
|
|
{
|
|
return $this->perspective;
|
|
}
|
|
|
|
public function setPerspective(?int $perspective): self
|
|
{
|
|
$this->perspective = $perspective;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getOneCellAnchor(): bool
|
|
{
|
|
return $this->oneCellAnchor;
|
|
}
|
|
|
|
public function setOneCellAnchor(bool $oneCellAnchor): self
|
|
{
|
|
$this->oneCellAnchor = $oneCellAnchor;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getAutoTitleDeleted(): bool
|
|
{
|
|
return $this->autoTitleDeleted;
|
|
}
|
|
|
|
public function setAutoTitleDeleted(bool $autoTitleDeleted): self
|
|
{
|
|
$this->autoTitleDeleted = $autoTitleDeleted;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getNoFill(): bool
|
|
{
|
|
return $this->noFill;
|
|
}
|
|
|
|
public function setNoFill(bool $noFill): self
|
|
{
|
|
$this->noFill = $noFill;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getRoundedCorners(): bool
|
|
{
|
|
return $this->roundedCorners;
|
|
}
|
|
|
|
public function setRoundedCorners(?bool $roundedCorners): self
|
|
{
|
|
if ($roundedCorners !== null) {
|
|
$this->roundedCorners = $roundedCorners;
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
}
|