| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <?php
- namespace PhpOffice\PhpSpreadsheet\Cell;
- use PhpOffice\PhpSpreadsheet\Exception;
- use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
- class CellAddress
- {
- /**
- * @var ?Worksheet
- */
- protected $worksheet;
- /**
- * @var string
- */
- protected $cellAddress;
- /**
- * @var string
- */
- protected $columnName;
- /**
- * @var int
- */
- protected $columnId;
- /**
- * @var int
- */
- protected $rowId;
- public function __construct(string $cellAddress, ?Worksheet $worksheet = null)
- {
- $this->cellAddress = str_replace('$', '', $cellAddress);
- [$this->columnId, $this->rowId, $this->columnName] = Coordinate::indexesFromString($this->cellAddress);
- $this->worksheet = $worksheet;
- }
- /**
- * @param mixed $columnId
- * @param mixed $rowId
- */
- private static function validateColumnAndRow($columnId, $rowId): void
- {
- if (!is_numeric($columnId) || $columnId <= 0 || !is_numeric($rowId) || $rowId <= 0) {
- throw new Exception('Row and Column Ids must be positive integer values');
- }
- }
- /**
- * @param mixed $columnId
- * @param mixed $rowId
- */
- public static function fromColumnAndRow($columnId, $rowId, ?Worksheet $worksheet = null): self
- {
- self::validateColumnAndRow($columnId, $rowId);
- /** @phpstan-ignore-next-line */
- return new static(Coordinate::stringFromColumnIndex($columnId) . ((string) $rowId), $worksheet);
- }
- public static function fromColumnRowArray(array $array, ?Worksheet $worksheet = null): self
- {
- [$columnId, $rowId] = $array;
- return static::fromColumnAndRow($columnId, $rowId, $worksheet);
- }
- /**
- * @param mixed $cellAddress
- */
- public static function fromCellAddress($cellAddress, ?Worksheet $worksheet = null): self
- {
- /** @phpstan-ignore-next-line */
- return new static($cellAddress, $worksheet);
- }
- /**
- * The returned address string will contain the worksheet name as well, if available,
- * (ie. if a Worksheet was provided to the constructor).
- * e.g. "'Mark''s Worksheet'!C5".
- */
- public function fullCellAddress(): string
- {
- if ($this->worksheet !== null) {
- $title = str_replace("'", "''", $this->worksheet->getTitle());
- return "'{$title}'!{$this->cellAddress}";
- }
- return $this->cellAddress;
- }
- public function worksheet(): ?Worksheet
- {
- return $this->worksheet;
- }
- /**
- * The returned address string will contain just the column/row address,
- * (even if a Worksheet was provided to the constructor).
- * e.g. "C5".
- */
- public function cellAddress(): string
- {
- return $this->cellAddress;
- }
- public function rowId(): int
- {
- return $this->rowId;
- }
- public function columnId(): int
- {
- return $this->columnId;
- }
- public function columnName(): string
- {
- return $this->columnName;
- }
- public function nextRow(int $offset = 1): self
- {
- $newRowId = $this->rowId + $offset;
- if ($newRowId < 1) {
- $newRowId = 1;
- }
- return static::fromColumnAndRow($this->columnId, $newRowId);
- }
- public function previousRow(int $offset = 1): self
- {
- return $this->nextRow(0 - $offset);
- }
- public function nextColumn(int $offset = 1): self
- {
- $newColumnId = $this->columnId + $offset;
- if ($newColumnId < 1) {
- $newColumnId = 1;
- }
- return static::fromColumnAndRow($newColumnId, $this->rowId);
- }
- public function previousColumn(int $offset = 1): self
- {
- return $this->nextColumn(0 - $offset);
- }
- /**
- * The returned address string will contain the worksheet name as well, if available,
- * (ie. if a Worksheet was provided to the constructor).
- * e.g. "'Mark''s Worksheet'!C5".
- */
- public function __toString()
- {
- return $this->fullCellAddress();
- }
- }
|