<?php
|
|
namespace PhpOffice\PhpSpreadsheet\Chart;
|
|
use PhpOffice\PhpSpreadsheet\RichText\RichText;
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
use PhpOffice\PhpSpreadsheet\Style\Font;
|
|
class Title
|
{
|
public const TITLE_CELL_REFERENCE
|
= '/^(.*)!' // beginning of string, everything up to ! is match[1]
|
. '[$]([A-Z]{1,3})' // absolute column string match[2]
|
. '[$](\d{1,7})$/i'; // absolute row string match[3]
|
|
/**
|
* Title Caption.
|
*
|
* @var array<RichText|string>|RichText|string
|
*/
|
private array|RichText|string $caption;
|
|
/**
|
* Allow overlay of other elements?
|
*/
|
private bool $overlay = true;
|
|
/**
|
* Title Layout.
|
*/
|
private ?Layout $layout;
|
|
private string $cellReference = '';
|
|
private ?Font $font = null;
|
|
/**
|
* Create a new Title.
|
*/
|
public function __construct(array|RichText|string $caption = '', ?Layout $layout = null, bool $overlay = false)
|
{
|
$this->caption = $caption;
|
$this->layout = $layout;
|
$this->setOverlay($overlay);
|
}
|
|
/**
|
* Get caption.
|
*/
|
public function getCaption(): array|RichText|string
|
{
|
return $this->caption;
|
}
|
|
public function getCaptionText(?Spreadsheet $spreadsheet = null): string
|
{
|
if ($spreadsheet !== null) {
|
$caption = $this->getCalculatedTitle($spreadsheet);
|
if ($caption !== null) {
|
return $caption;
|
}
|
}
|
$caption = $this->caption;
|
if (is_string($caption)) {
|
return $caption;
|
}
|
if ($caption instanceof RichText) {
|
return $caption->getPlainText();
|
}
|
$retVal = '';
|
foreach ($caption as $textx) {
|
/** @var RichText|string $text */
|
$text = $textx;
|
if ($text instanceof RichText) {
|
$retVal .= $text->getPlainText();
|
} else {
|
$retVal .= $text;
|
}
|
}
|
|
return $retVal;
|
}
|
|
/**
|
* Set caption.
|
*
|
* @return $this
|
*/
|
public function setCaption(array|RichText|string $caption): static
|
{
|
$this->caption = $caption;
|
|
return $this;
|
}
|
|
/**
|
* Get allow overlay of other elements?
|
*/
|
public function getOverlay(): bool
|
{
|
return $this->overlay;
|
}
|
|
/**
|
* Set allow overlay of other elements?
|
*/
|
public function setOverlay(bool $overlay): self
|
{
|
$this->overlay = $overlay;
|
|
return $this;
|
}
|
|
public function getLayout(): ?Layout
|
{
|
return $this->layout;
|
}
|
|
public function setCellReference(string $cellReference): self
|
{
|
$this->cellReference = $cellReference;
|
|
return $this;
|
}
|
|
public function getCellReference(): string
|
{
|
return $this->cellReference;
|
}
|
|
public function getCalculatedTitle(?Spreadsheet $spreadsheet): ?string
|
{
|
preg_match(self::TITLE_CELL_REFERENCE, $this->cellReference, $matches);
|
if (count($matches) === 0 || $spreadsheet === null) {
|
return null;
|
}
|
$sheetName = preg_replace("/^'(.*)'$/", '$1', $matches[1]) ?? '';
|
|
return $spreadsheet->getSheetByName($sheetName)?->getCell($matches[2] . $matches[3])?->getFormattedValue();
|
}
|
|
public function getFont(): ?Font
|
{
|
return $this->font;
|
}
|
|
public function setFont(?Font $font): self
|
{
|
$this->font = $font;
|
|
return $this;
|
}
|
|
/**
|
* Implement PHP __clone to create a deep clone, not just a shallow copy.
|
*/
|
public function __clone()
|
{
|
$this->layout = ($this->layout === null) ? null : clone $this->layout;
|
$this->font = ($this->font === null) ? null : clone $this->font;
|
if (is_array($this->caption)) {
|
$captions = $this->caption;
|
$this->caption = [];
|
foreach ($captions as $caption) {
|
$this->caption[] = is_object($caption) ? (clone $caption) : $caption;
|
}
|
} else {
|
$this->caption = is_object($this->caption) ? (clone $this->caption) : $this->caption;
|
}
|
}
|
}
|