Member 14059398 Ответов: 0

Нужно сжать код и избежать вложенных циклов for, так как лист excel имеет 8K строк, занимающих слишком много времени [для стилизации ячеек excel]


У меня есть совместимость openpyxl и pyxlsb, используя openpyxlI, я сделал некоторый код для соответствующего стиля ячеек, но мне нужно сжать код или просто избежать вложенных циклов for или itertools. Для следующих требований я попробовал код:

Что я уже пробовал:

1) здесь для 1-й строки Мне нужно получить bgcolor:8A2BE2 и текст должен быть жирным и белым:
if '1' in cell.coordinate and len(cell.coordinate) == 2:
                    cell.font = Font(color=colors.WHITE, bold=True)
                    cell.fill = PatternFill(start_color='8A2BE2', end_color='8A2BE2', fill_type='solid')

2) для A и B cols мне нужен некоторый bgcolor:желтый и полностью бордюрный:
for x in cell.coordinate:
                        if x[0] == 'A' or x[0] == 'B':
                            cell.fill = PatternFill(start_color=colors.YELLOW, end_color=colors.YELLOW, fill_type='solid')
                bd = Side(color="000000")
                cell.border = Border(left=bd, top=bd, right=bd, bottom=bd)

3) для всех столбцов, мне нужно увеличить ширину ячейки.значение:
if cell.value:
                dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value)))) 
    for col, value in dims.items():
        result_sheet.column_dimensions[col].width = value

полный код:
#for styling
    dims = {}
    for row in result_sheet.iter_rows():
        for cell in row:
            cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
            if '1' in cell.coordinate and len(cell.coordinate) == 2:
                cell.font = Font(color=colors.WHITE, bold=True)
                cell.fill = PatternFill(start_color='8A2BE2', end_color='8A2BE2', fill_type='solid')
            else:
                for x in cell.coordinate:
                    if x[0] == 'A' or x[0] == 'B':
                        cell.fill = PatternFill(start_color=colors.YELLOW, end_color=colors.YELLOW, fill_type='solid')
            bd = Side(color="000000")
            cell.border = Border(left=bd, top=bd, right=bd, bottom=bd)
            if cell.value:
                dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value)))) 
    for col, value in dims.items():
        result_sheet.column_dimensions[col].width = value

0 Ответов