from collections.abc import Callable from typing import Any from common.utils.openpyxl import maximum_row from openpyxl import Workbook from openpyxl.cell import Cell from openpyxl.worksheet.worksheet import Worksheet from src.validation.worksheet.worksheet_errors import WorksheetErrors def create_worksheet(values: list[list[Any]]) -> Worksheet: """Create sheet from values.""" workbook = Workbook() worksheet: Worksheet = workbook.create_sheet(index=0) for row in range(len(values)): for column in range(len(values[row])): worksheet.cell(row=row + 2, column=column + 1, value=values[row][column]) return worksheet def create_workbook(value_list: list[tuple[str, list[list[Any]]]]) -> Workbook: """Create workbook from values.""" workbook = Workbook() i = 0 for sheet_name, values in value_list: worksheet: Worksheet if i == 0: worksheet = workbook.worksheets[0] worksheet.title = sheet_name else: worksheet = workbook.create_sheet(sheet_name) for row in range(len(values)): for column in range(len(values[row])): worksheet.cell( row=row + 2, column=column + 1, value=values[row][column] ) i += 1 return workbook def run_worksheet_validator( worksheet: Worksheet, validator: tuple[ Callable[[Worksheet, tuple[Cell, ...], int], None], Callable[[Worksheet], WorksheetErrors | None], ], ) -> WorksheetErrors | None: """Run a single worksheet validator""" for index, row in enumerate( worksheet.iter_rows(min_row=3, max_row=maximum_row(worksheet)) ): validator[0](worksheet, row, index) return validator[1](worksheet)