Vendor/phpspreadsheet/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php
public static function OFFSET($cellAddress = null, $rows = 0, $columns = 0, $height = null, $width = null, Cell $pCell = null)
    {
        $rows = Functions::flattenSingleValue($rows);
        $columns = Functions::flattenSingleValue($columns);
        $height = Functions::flattenSingleValue($height);
        $width = Functions::flattenSingleValue($width);
        if ($cellAddress == null) {
            return 0;
        }

        if (!is_object($pCell)) {
            return Functions::REF();
        }

        $sheetName = null;
        if (strpos($cellAddress, '!')) {
            list($sheetName, $cellAddress) = explode('!', $cellAddress);
            $sheetName = trim($sheetName, "'");
        }
        if (strpos($cellAddress, ':')) {
            list($startCell, $endCell) = explode(':', $cellAddress);
        } else {
            $startCell = $endCell = $cellAddress;
        }
        list($startCellColumn, $startCellRow) = Coordinate::coordinateFromString($startCell);
        list($endCellColumn, $endCellRow) = Coordinate::coordinateFromString($endCell);

        $startCellRow += $rows;
        $startCellColumn = Coordinate::columnIndexFromString($startCellColumn) - 1;
        $startCellColumn += $columns;

        if (($startCellRow <= 0) || ($startCellColumn < 0)) {
            return Functions::REF();
        }
        $endCellColumn = Coordinate::columnIndexFromString($endCellColumn) - 1;
        if (($width != null) && (!is_object($width))) {
            $endCellColumn = $startCellColumn + $width - 1;
        } else {
            $endCellColumn += $columns;
        }
        $startCellColumn = Coordinate::stringFromColumnIndex($startCellColumn + 1);

        if (($height != null) && (!is_object($height))) {
            $endCellRow = $startCellRow + $height - 1;
        } else {
            $endCellRow += $rows;
        }

        if (($endCellRow <= 0) || ($endCellColumn < 0)) {
            return Functions::REF();
        }
        $endCellColumn = Coordinate::stringFromColumnIndex($endCellColumn + 1);

        $cellAddress = $startCellColumn . $startCellRow;
        if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) {
            $cellAddress .= ':' . $endCellColumn . $endCellRow;
        }

        if ($sheetName !== null) {
            $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);
        } else {
            $pSheet = $pCell->getWorksheet();
        }

        return Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false);
    }
public static function OFFSET($cellAddress = null, $rows = 0, $columns = 0, $height = null, $width = null, Cell $pCell = null)
    {
        $rows = Functions::flattenSingleValue($rows);
        $columns = Functions::flattenSingleValue($columns);
        $height = Functions::flattenSingleValue($height);
        $width = Functions::flattenSingleValue($width);
        if ($cellAddress == null) {
            return 0;
        }

        if (!is_object($pCell)) {
            return Functions::REF();
        }

        $sheetName = null;
        if (strpos($cellAddress, '!')) {
            list($sheetName, $cellAddress) = explode('!', $cellAddress);
            $sheetName = trim($sheetName, "'");
        }
        if (strpos($cellAddress, ':')) {
            list($startCell, $endCell) = explode(':', $cellAddress);
        } else {
            $startCell = $endCell = $cellAddress;
        }
        list($startCellColumn, $startCellRow) = Coordinate::coordinateFromString($startCell);
        list($endCellColumn, $endCellRow) = Coordinate::coordinateFromString($endCell);

        $startCellRow += $rows;
        $startCellColumn = Coordinate::columnIndexFromString($startCellColumn) - 1;
        $startCellColumn += $columns;

        if (($startCellRow <= 0) || ($startCellColumn < 0)) {
            return Functions::REF();
        }
        $endCellColumn = Coordinate::columnIndexFromString($endCellColumn) - 1;
        if (($width != null) && (!is_object($width))) {
            $endCellColumn = $startCellColumn + $width - 1;
        } else {
            $endCellColumn += $columns;
        }
        $startCellColumn = Coordinate::stringFromColumnIndex($startCellColumn + 1);

        if (($height != null) && (!is_object($height))) {
            $endCellRow = $startCellRow + $height - 1;
        } else {
            $endCellRow += $rows;
        }

        if (($endCellRow <= 0) || ($endCellColumn < 0)) {
            return Functions::REF();
        }
        $endCellColumn = Coordinate::stringFromColumnIndex($endCellColumn + 1);

        $cellAddress = $startCellColumn . $startCellRow;
        if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) {
            $cellAddress .= ':' . $endCellColumn . $endCellRow;
        }

        if ($sheetName !== null) {
            $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName);
        } else {
            $pSheet = $pCell->getWorksheet();
        }

        return Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false);
    }
public static function OFFSET ( $ cellAddress = null , $ rows = 0 , $ columns = 0 , $ height = null , $ width = null , Cell $ pCell = null ) { $ rows = Functions :: flattenSingleValue ( $ rows ) ; $ columns = Functions :: flattenSingleValue ( $ columns ) ; $ height = Functions :: flattenSingleValue ( $ height ) ; $ width = Functions :: flattenSingleValue ( $ width ) ; if ( $ cellAddress == null ) { return 0 ; } if ( ! is_object ( $ pCell ) ) { return Functions :: REF ( ) ; } $ sheetName = null ; if ( strpos ( $ cellAddress , '!' ) ) { list ( $ sheetName , $ cellAddress ) = explode ( '!' , $ cellAddress ) ; $ sheetName = trim ( $ sheetName , "'" ) ; } if ( strpos ( $ cellAddress , ':' ) ) { list ( $ startCell , $ endCell ) = explode ( ':' , $ cellAddress ) ; } else { $ startCell = $ endCell = $ cellAddress ; } list ( $ startCellColumn , $ startCellRow ) = Coordinate :: coordinateFromString ( $ startCell ) ; list ( $ endCellColumn , $ endCellRow ) = Coordinate :: coordinateFromString ( $ endCell ) ; $ startCellRow += $ rows ; $ startCellColumn = Coordinate :: columnIndexFromString ( $ startCellColumn ) - 1 ; $ startCellColumn += $ columns ; if ( ( $ startCellRow <= 0 ) || ( $ startCellColumn < 0 ) ) { return Functions :: REF ( ) ; } $ endCellColumn = Coordinate :: columnIndexFromString ( $ endCellColumn ) - 1 ; if ( ( $ width != null ) && ( ! is_object ( $ width ) ) ) { $ endCellColumn = $ startCellColumn + $ width - 1 ; } else { $ endCellColumn += $ columns ; } $ startCellColumn = Coordinate :: stringFromColumnIndex ( $ startCellColumn + 1 ) ; if ( ( $ height != null ) && ( ! is_object ( $ height ) ) ) { $ endCellRow = $ startCellRow + $ height - 1 ; } else { $ endCellRow += $ rows ; } if ( ( $ endCellRow <= 0 ) || ( $ endCellColumn < 0 ) ) { return Functions :: REF ( ) ; } $ endCellColumn = Coordinate :: stringFromColumnIndex ( $ endCellColumn + 1 ) ; $ cellAddress = $ startCellColumn . $ startCellRow ; if ( ( $ startCellColumn != $ endCellColumn ) || ( $ startCellRow != $ endCellRow ) ) { $ cellAddress .= ':' . $ endCellColumn . $ endCellRow ; } if ( $ sheetName !== null ) { $ pSheet = $ pCell -> getWorksheet ( ) -> getParent ( ) -> getSheetByName ( $ sheetName ) ; } else { $ pSheet = $ pCell -> getWorksheet ( ) ; } return Calculation :: getInstance ( ) -> extractCellRange ( $ cellAddress , $ pSheet , false ) ; }
OFFSET.

Returns a reference to a range that is a specified number of rows and columns from a cell or range of cells.
The reference that is returned can be a single cell or a range of cells. You can specify the number of rows and
the number of columns to be returned.

Excel Function:
=OFFSET(cellAddress, rows, cols, [height], [width])

@param null|array|string $cellAddress The reference from which you want to base the offset. Reference must refer to a cell or
range of adjacent cells; otherwise, OFFSET returns the #VALUE! error value.
@param mixed $rows The number of rows, up or down, that you want the upper-left cell to refer to.
Using 5 as the rows argument specifies that the upper-left cell in the reference is
five rows below reference. Rows can be positive (which means below the starting reference)
or negative (which means above the starting reference).
@param mixed $columns The number of columns, to the left or right, that you want the upper-left cell of the result
to refer to. Using 5 as the cols argument specifies that the upper-left cell in the
reference is five columns to the right of reference. Cols can be positive (which means
to the right of the starting reference) or negative (which means to the left of the
starting reference).
@param mixed $height The height, in number of rows, that you want the returned reference to be. Height must be a positive number.
@param mixed $width The width, in number of columns, that you want the returned reference to be. Width must be a positive number.
@param null|Cell $pCell

@return string A reference to a cell or range of cells
OFFSET .