{"record":{"id":"9cae133237bf9f15","repo":"pola-rs/polars","slug":"cannot-create-a-second-col-r-column","errorCode":null,"errorMessage":"cannot create a second {col!r} column","messagePattern":"cannot create a second (.+?) column","errorType":"exception","errorClass":"DuplicateError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/io/spreadsheet/_write_utils.py","lineNumber":247,"sourceCode":"    )\n\n\ndef _xl_inject_dummy_table_columns(\n    df: DataFrame,\n    coldefs: dict[str, Any],\n    *,\n    dtype: dict[str, PolarsDataType] | PolarsDataType | None = None,\n    expr: Expr | None = None,\n) -> DataFrame:\n    \"\"\"Insert dummy frame columns in order to create empty/named table columns.\"\"\"\n    df_original_columns = set(df.columns)\n    df_select_cols = df.columns.copy()\n    cast_lookup = {}\n\n    for col, definition in coldefs.items():\n        if col in df_original_columns:\n            msg = f\"cannot create a second {col!r} column\"\n            raise DuplicateError(msg)\n        elif not isinstance(definition, dict):\n            df_select_cols.append(col)\n        else:\n            cast_lookup[col] = definition.get(\"return_dtype\")\n            insert_before = definition.get(\"insert_before\")\n            insert_after = definition.get(\"insert_after\")\n\n            if insert_after is None and insert_before is None:\n                df_select_cols.append(col)\n            else:\n                insert_idx = (\n                    df_select_cols.index(insert_after) + 1  # type: ignore[arg-type]\n                    if insert_before is None\n                    else df_select_cols.index(insert_before)\n                )\n                df_select_cols.insert(insert_idx, col)\n\n    expr = F.lit(None) if expr is None else expr","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/pola-rs/polars/blob/fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e/py-polars/src/polars/io/spreadsheet/_write_utils.py#L229-L265","documentation":"_xl_inject_dummy_table_columns adds computed/dummy columns to the DataFrame before writing to Excel; if a column definition names a column that already exists in the original df, creating it again would duplicate it, so a DuplicateError is raised.","triggerScenarios":"write_excel with column_defs (via column_formatting/dummy column specs) where a definition key matches an existing df column name; typically from using a computed-column spec (dict definition) on a column already present in the data.","commonSituations":"Reusing a column-defs dict across sheets whose DataFrames differ in schema; defining a derived column under a name that already exists instead of a new name.","solutions":["Rename the definition key to a new column name not present in df.columns","Remove the duplicate entry from coldefs for columns already in the DataFrame","If the intent is formatting an existing column, use format/column-width options rather than a column definition","Ensure the correct DataFrame is being written (schema mismatch between sheets)"],"exampleFix":"// before\ncolumn_defs = {'total': {'return_dtype': pl.Float64}}  # 'total' already in df\n// after\ncolumn_defs = {'total_calc': {'return_dtype': pl.Float64, 'insert_after': 'total'}}","handlingStrategy":"validation","validationCode":"dupes = set(coldefs) & set(df.columns)\nif dupes:\n    raise ValueError(f'column definitions collide with existing columns: {dupes}')","typeGuard":null,"tryCatchPattern":"try:\n    write_excel(wb, df, column_defs=defs)\nexcept Exception as e:\n    if \"cannot create a second\" in str(e):\n        defs = {k: v for k, v in defs.items() if k not in df.columns}\n        write_excel(wb, df, column_defs=defs)","preventionTips":["Keep computed-column names distinct from source df columns","Diff coldefs keys against df.columns before writing","Use insert_before/insert_after with new names for derived columns"],"tags":["polars","excel","duplicate-column"],"backgroundTag":"schema-validation-failed","analyzedSha":"fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e","analyzedAt":"2026-09-18T22:14:11.667Z","contentChangedAt":"2026-09-18T22:14:11.667Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}