{"record":{"id":"19b2d44f52c4b5c3","repo":"PHPOffice/PhpSpreadsheet","slug":"conditional-is-not-a-duplicates-cf-rule-conditiona","errorCode":null,"errorMessage":"Conditional is not a Duplicates CF Rule conditional","messagePattern":"Conditional is not a Duplicates CF Rule conditional","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php","lineNumber":50,"sourceCode":"    public function getConditional(): Conditional\n    {\n        $conditional = new Conditional();\n        $conditional->setConditionType(\n            $this->inverse ? Conditional::CONDITION_UNIQUE : Conditional::CONDITION_DUPLICATES\n        );\n        $conditional->setStyle($this->getStyle());\n        $conditional->setStopIfTrue($this->getStopIfTrue());\n\n        return $conditional;\n    }\n\n    public static function fromConditional(Conditional $conditional, string $cellRange = 'A1'): WizardInterface\n    {\n        if (\n            $conditional->getConditionType() !== Conditional::CONDITION_DUPLICATES\n            && $conditional->getConditionType() !== Conditional::CONDITION_UNIQUE\n        ) {\n            throw new Exception('Conditional is not a Duplicates CF Rule conditional');\n        }\n\n        $wizard = new self($cellRange);\n        $wizard->style = $conditional->getStyle();\n        $wizard->stopIfTrue = $conditional->getStopIfTrue();\n        $wizard->inverse = $conditional->getConditionType() === Conditional::CONDITION_UNIQUE;\n\n        return $wizard;\n    }\n\n    /**\n     * @param mixed[] $arguments\n     */\n    public function __call(string $methodName, array $arguments): self\n    {\n        if (!array_key_exists($methodName, self::OPERATORS)) {\n            throw new Exception('Invalid Operation for Duplicates CF Rule Wizard');\n        }","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php#L32-L68","documentation":"Wizard\\Duplicates::fromConditional() rebuilds a Duplicates wizard from an existing Conditional, but it can only represent the containsDuplicates (duplicates) and containsUnique (unique) condition types. Any other condition type is rejected immediately with this exception rather than being silently converted.","triggerScenarios":"Calling Duplicates::fromConditional() on a Conditional whose type is cellIs, containsText, expression, timePeriod, etc.; looping over mixed rules and forcing each through the Duplicates factory.","commonSituations":"Generic rule-inspection code that assumes all rules are duplicate detectors; round-tripping rule sets where the type of each rule is unknown; copy-pasted conversion snippets.","solutions":["Check getConditionType() is CONDITION_DUPLICATES or CONDITION_UNIQUE before calling","Use Wizard::fromConditional() for automatic dispatch","Wrap batch conversions in try/catch to skip wrong-type rules","Log skipped types so unsupported rules are visible during imports"],"exampleFix":"// before\n$wizard = Wizard\\Duplicates::fromConditional($conditional); // throws unless duplicates/unique\n\n// after\nuse PhpOffice\\PhpSpreadsheet\\Style\\Conditional;\n\nif (in_array($conditional->getConditionType(),\n    [Conditional::CONDITION_DUPLICATES, Conditional::CONDITION_UNIQUE], true)) {\n    $wizard = Wizard\\Duplicates::fromConditional($conditional);\n} else {\n    $wizard = Wizard::fromConditional($conditional);\n}","handlingStrategy":"type-guard","validationCode":"use PhpOffice\\PhpSpreadsheet\\Style\\Conditional;\n\nif (in_array($conditional->getConditionType(),\n    [Conditional::CONDITION_DUPLICATES, Conditional::CONDITION_UNIQUE], true)) {\n    $wizard = Wizard\\Duplicates::fromConditional($conditional, $cellRange);\n} else {\n    $wizard = Wizard::fromConditional($conditional, $cellRange);\n}","typeGuard":"function isDuplicatesConditional(Conditional $conditional): bool\n{\n    return in_array(\n        $conditional->getConditionType(),\n        [Conditional::CONDITION_DUPLICATES, Conditional::CONDITION_UNIQUE],\n        true\n    );\n}","tryCatchPattern":"use PhpOffice\\PhpSpreadsheet\\Exception as PhpSpreadsheetException;\n\ntry {\n    $wizard = Wizard\\Duplicates::fromConditional($conditional, $cellRange);\n} catch (PhpSpreadsheetException $e) {\n    $wizard = Wizard::fromConditional($conditional, $cellRange);\n}","preventionTips":["Check for CONDITION_DUPLICATES or CONDITION_UNIQUE before calling the Duplicates factory","Use the generic Wizard::fromConditional() for mixed rule sets","Counting-based duplicate checks written as formulas are EXPRESSION rules, not duplicates rules","Skip-and-log unsupported types during rule imports"],"tags":["php","phpspreadsheet","conditional-formatting","wizard","duplicates","type-mismatch"],"backgroundTag":"conditional-rule-type-mismatch","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}