import os from typing import Any from openpyxl import Workbook, load_workbook from openpyxl.worksheet.worksheet import Worksheet def write_row(file_path: str, row_data: dict[str, Any]) -> None: new_keys = list(row_data.keys()) if not os.path.exists(file_path): wb = Workbook() ws: Worksheet = wb.active # type: ignore[assignment] ws.append(new_keys) ws.append(list(row_data.values())) wb.save(file_path) return wb = load_workbook(file_path) ws = wb.active # type: ignore[assignment] # Build a mutable header list and insert new columns using insert_cols so # that existing row data shifts along with the headers. # Filter out None to guard against blank columns in the source file. headers: list[str] = [cell.value for cell in ws[1] if cell.value is not None] # type: ignore[misc] for key in new_keys: if key in headers: continue # Find the first key that comes after this one in new_keys that already # exists in headers — insert before it to keep columns logically grouped. insert_before: str | None = None found = False for k in new_keys: if k == key: found = True continue if found and k in headers: insert_before = k break if insert_before is not None: col_idx = headers.index(insert_before) + 1 # 1-based ws.insert_cols(col_idx) ws.cell(row=1, column=col_idx, value=key) headers.insert(col_idx - 1, key) else: headers.append(key) ws.cell(row=1, column=len(headers), value=key) ws.append([row_data.get(col) for col in headers]) wb.save(file_path)