PHPOffice/PhpSpreadsheet · error · PhpOffice\PhpSpreadsheet\Exception

Conditional is not a Date Value CF Rule conditional

Error message

Conditional is not a Date Value CF Rule conditional

What it means

Wizard\DateValue::fromConditional() rebuilds a dates-occurring wizard from an existing Conditional, and only CONDITION_TIMEPERIOD conditionals qualify (yesterday/today/this week/last month style rules). Cell value, text, expression and blanks rules use other condition types and are rejected up front rather than being misinterpreted as date rules.

Source

Thrown at src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php:85

    public function getConditional(): Conditional
    {
        $this->setExpression();

        $conditional = new Conditional();
        $conditional->setConditionType(Conditional::CONDITION_TIMEPERIOD);
        $conditional->setText($this->operator);
        $conditional->setConditions([$this->expression]);
        $conditional->setStyle($this->getStyle());
        $conditional->setStopIfTrue($this->getStopIfTrue());

        return $conditional;
    }

    public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface
    {
        if ($conditional->getConditionType() !== Conditional::CONDITION_TIMEPERIOD) {
            throw new Exception('Conditional is not a Date Value CF Rule conditional');
        }

        $wizard = new self($cellRange);
        $wizard->style = $conditional->getStyle();
        $wizard->stopIfTrue = $conditional->getStopIfTrue();
        $wizard->operator = $conditional->getText();

        return $wizard;
    }

    /**
     * @param mixed[] $arguments
     */
    public function __call(string $methodName, array $arguments): self
    {
        if (!isset(self::MAGIC_OPERATIONS[$methodName])) {
            throw new Exception('Invalid Operation for Date Value CF Rule Wizard');
        }

View on GitHub (pinned to 65b080eef4)

Solutions

  1. Check $conditional->getConditionType() === Conditional::CONDITION_TIMEPERIOD first
  2. Use Wizard::fromConditional() to dispatch to the correct wizard automatically
  3. For date formulas saved as expressions, use Wizard\Expression::fromConditional() instead
  4. Guard batch loops with try/catch

Example fix

// before
$wizard = Wizard\DateValue::fromConditional($conditional); // throws unless type is timePeriod

// after
use PhpOffice\PhpSpreadsheet\Style\Conditional;

if ($conditional->getConditionType() === Conditional::CONDITION_TIMEPERIOD) {
    $wizard = Wizard\DateValue::fromConditional($conditional);
} else {
    $wizard = Wizard::fromConditional($conditional);
}
Defensive patterns

Strategy: type-guard

Validate before calling

use PhpOffice\PhpSpreadsheet\Style\Conditional;

if ($conditional->getConditionType() === Conditional::CONDITION_TIMEPERIOD) {
    $wizard = Wizard\DateValue::fromConditional($conditional, $cellRange);
} else {
    $wizard = Wizard::fromConditional($conditional, $cellRange);
}

Type guard

function isDateValueConditional(Conditional $conditional): bool
{
    return $conditional->getConditionType() === Conditional::CONDITION_TIMEPERIOD;
}

Try / catch

use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;

try {
    $wizard = Wizard\DateValue::fromConditional($conditional, $cellRange);
} catch (PhpSpreadsheetException $e) {
    $wizard = Wizard::fromConditional($conditional, $cellRange);
}

Prevention

When it happens

Trigger: Calling DateValue::fromConditional() on a Conditional built by a CellValue, TextValue, Expression or Blanks wizard; passing a date comparison written as an expression formula instead of a true timePeriod rule.

Common situations: Rule editors that assume any date-related condition is a timePeriod rule; date logic stored as expression rules (e.g. A1>TODAY()) in imported files; generic conversion loops that force every rule through one factory.

Related errors


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