123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?php
- namespace PhpOffice\PhpSpreadsheet;
- use PhpOffice\PhpSpreadsheet\Cell\AddressRange;
- use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
- class CellReferenceHelper
- {
-
- protected $beforeCellAddress;
-
- protected $beforeColumn;
-
- protected $beforeRow;
-
- protected $numberOfColumns;
-
- protected $numberOfRows;
- public function __construct(string $beforeCellAddress = 'A1', int $numberOfColumns = 0, int $numberOfRows = 0)
- {
- $this->beforeCellAddress = str_replace('$', '', $beforeCellAddress);
- $this->numberOfColumns = $numberOfColumns;
- $this->numberOfRows = $numberOfRows;
-
- [$beforeColumn, $beforeRow] = Coordinate::coordinateFromString($beforeCellAddress);
- $this->beforeColumn = (int) Coordinate::columnIndexFromString($beforeColumn);
- $this->beforeRow = (int) $beforeRow;
- }
- public function beforeCellAddress(): string
- {
- return $this->beforeCellAddress;
- }
- public function refreshRequired(string $beforeCellAddress, int $numberOfColumns, int $numberOfRows): bool
- {
- return $this->beforeCellAddress !== $beforeCellAddress ||
- $this->numberOfColumns !== $numberOfColumns ||
- $this->numberOfRows !== $numberOfRows;
- }
- public function updateCellReference(string $cellReference = 'A1', bool $includeAbsoluteReferences = false): string
- {
- if (Coordinate::coordinateIsRange($cellReference)) {
- throw new Exception('Only single cell references may be passed to this method.');
- }
-
- [$newColumn, $newRow] = Coordinate::coordinateFromString($cellReference);
- $newColumnIndex = (int) Coordinate::columnIndexFromString(str_replace('$', '', $newColumn));
- $newRowIndex = (int) str_replace('$', '', $newRow);
- $absoluteColumn = $newColumn[0] === '$' ? '$' : '';
- $absoluteRow = $newRow[0] === '$' ? '$' : '';
-
- if ($includeAbsoluteReferences === false) {
- $updateColumn = (($absoluteColumn !== '$') && $newColumnIndex >= $this->beforeColumn);
- $updateRow = (($absoluteRow !== '$') && $newRowIndex >= $this->beforeRow);
- } else {
- $updateColumn = ($newColumnIndex >= $this->beforeColumn);
- $updateRow = ($newRowIndex >= $this->beforeRow);
- }
-
- if ($updateColumn) {
- $newColumn = $this->updateColumnReference($newColumnIndex, $absoluteColumn);
- }
-
- if ($updateRow) {
- $newRow = $this->updateRowReference($newRowIndex, $absoluteRow);
- }
-
- return "{$newColumn}{$newRow}";
- }
- public function cellAddressInDeleteRange(string $cellAddress): bool
- {
- [$cellColumn, $cellRow] = Coordinate::coordinateFromString($cellAddress);
- $cellColumnIndex = Coordinate::columnIndexFromString($cellColumn);
-
- if (
- $this->numberOfRows < 0 &&
- ($cellRow >= ($this->beforeRow + $this->numberOfRows)) &&
- ($cellRow < $this->beforeRow)
- ) {
- return true;
- } elseif (
- $this->numberOfColumns < 0 &&
- ($cellColumnIndex >= ($this->beforeColumn + $this->numberOfColumns)) &&
- ($cellColumnIndex < $this->beforeColumn)
- ) {
- return true;
- }
- return false;
- }
- protected function updateColumnReference(int $newColumnIndex, string $absoluteColumn): string
- {
- $newColumn = Coordinate::stringFromColumnIndex(min($newColumnIndex + $this->numberOfColumns, AddressRange::MAX_COLUMN_INT));
- return "{$absoluteColumn}{$newColumn}";
- }
- protected function updateRowReference(int $newRowIndex, string $absoluteRow): string
- {
- $newRow = $newRowIndex + $this->numberOfRows;
- $newRow = ($newRow > AddressRange::MAX_ROW) ? AddressRange::MAX_ROW : $newRow;
- return "{$absoluteRow}{$newRow}";
- }
- }
|