PHPOffice/PhpSpreadsheet · error · SpreadsheetException

Cannot get row when cell is not bound to a worksheet

Error message

Cannot get row when cell is not bound to a worksheet

What it means

A Cell object is a thin wrapper whose $parent property links it to the Cells collection of a worksheet; getRow() simply delegates to $parent->getCurrentRow(). When the Cell is no longer attached to a collection (worksheet removed, collection emptied or detached, or the Cell object outlived it), $parent is null and this exception is thrown. The row number only exists as metadata owned by the live collection, not by the Cell itself.

Solutions

  1. Capture the row number (or the full coordinate string) as a plain int/string immediately after getCell(), instead of holding the Cell object
  2. Guard the call with $cell->getParent() !== null (or $cell->getWorksheetOrNull() !== null) before getRow()
  3. Re-fetch the cell from a live worksheet via $sheet->getCell($coordinate) when you need it later
  4. Derive the row from a coordinate string you already hold using Coordinate::indexesFromString($coord)

Example fix

// before
$cell = $sheet->getCell('B4');
$spreadsheet->removeSheetByIndex($sheetIndex);
$row = $cell->getRow(); // throws: cell no longer bound to a worksheet

// after
$cell = $sheet->getCell('B4');
$row = $cell->getRow(); // capture while the worksheet is alive
$coord = 'B4';
$spreadsheet->removeSheetByIndex($sheetIndex);
Defensive patterns

Strategy: validation

Validate before calling

if ($cell->getParent() === null) {
    // cell is detached; recover from a live worksheet
    $cell = $spreadsheet->getSheetByName($sheetName)->getCell($coord);
}
$row = $cell->getRow();

Type guard

function cellIsBoundToWorksheet(Cell $cell): bool
{
    return $cell->getParent() !== null && $cell->getParent()->getParent() !== null;
}

Try / catch

try {
    $row = $cell->getRow();
} catch (SpreadsheetException $e) {
    $cell = $sheet->getCell($coord); // re-bind via a live worksheet
    $row = $cell->getRow();
}

Prevention

When it happens

Trigger: Calling $cell->getRow() on a Cell reference kept after $spreadsheet->removeSheetByIndex(), after unset($spreadsheet), after the cell collection was garbage-collected or emptied, or on a Cell obtained from a cloned/detached Cells collection.

Common situations: Caching Cell objects across import/export stages while the spreadsheet is torn down between stages; storing cells in queues or closures that execute after sheet teardown; copying cells between workbooks and then reusing the original references.

Related errors


AI-assisted analysis of PHPOffice/PhpSpreadsheet@65b080eef4 (2026-08-17). Data as JSON: /api/errors/a2810aedb691e82e. Report an issue: GitHub.

Appendix: source

Thrown at src/PhpSpreadsheet/Cell/Cell.php:149

    {
        $parent = $this->parent;
        if ($parent === null) {
            throw new SpreadsheetException('Cannot get column when cell is not bound to a worksheet');
        }

        return $parent->getCurrentColumn();
    }

    /**
     * Get cell coordinate row.
     *
     * @throws SpreadsheetException
     */
    public function getRow(): int
    {
        $parent = $this->parent;
        if ($parent === null) {
            throw new SpreadsheetException('Cannot get row when cell is not bound to a worksheet');
        }

        return $parent->getCurrentRow();
    }

    /**
     * Get cell coordinate.
     *
     * @throws SpreadsheetException
     */
    public function getCoordinate(): string
    {
        $parent = $this->parent;
        if ($parent !== null) {
            $coordinate = $parent->getCurrentCoordinate();
        } else {
            $coordinate = null;
        }

View on GitHub (pinned to 65b080eef4)