"""Column coordinate conversion utilities.""" def col_to_letter(col: int) -> str: """Convert 0-based column index to Excel letter. 0 → A, 1 → B, ..., 25 → Z, 26 → AA, 27 → AB, ... """ result = '' col += 1 while col > 0: col -= 1 result = chr(col % 26 + ord('A')) + result col //= 26 return result def letter_to_col(letter: str) -> int: """Convert Excel column letter to 0-based index. A → 0, B → 1, ..., Z → 25, AA → 26, ... """ result = 0 for ch in letter.upper(): result = result * 26 + (ord(ch) - ord('A') + 1) return result - 1 def cell_ref_to_rc(ref: str) -> tuple[int, int]: """Convert Excel cell reference (e.g. 'A1', 'BC42') to (row, col). Returns 0-based (row, col). """ col_letters = [] row_digits = [] for ch in ref: if ch.isalpha(): col_letters.append(ch) else: row_digits.append(ch) col = letter_to_col(''.join(col_letters)) row = int(''.join(row_digits)) - 1 # 1-based → 0-based return row, col def rc_to_cell_ref(row: int, col: int) -> str: """Convert 0-based (row, col) to Excel cell reference. (0, 0) → 'A1', (1, 2) → 'C2', ... """ return col_to_letter(col) + str(row + 1)