• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Python openpyxl.style PatternFill не работает

Checat

One Level
01.04.2024
9
1
BIT
152
Нужна помощь с PatternFill из openpyxl.style. Не могу понять как работает. Гугл спросил, ответы почитал, сделал как положено, но не работает. Ошибку не выдает и ячейку не закрашивает.
Импорты сделал пока полностью открытые:
Python:
from openpyxl import *
from openpyxl.styles import *
Пример кода:
Python:
cell_color = PatternFill(patternType='solid', fgColor='C64747')
ws_temp['B3'].fill = cell_color
 

Koloboking

Green Team
12.01.2017
165
46
BIT
772
Python:
from openpyxl import Workbook
from openpyxl.styles import PatternFill

# Создаем новый рабочий лист
wb = Workbook()
ws_temp = wb.active

# Определяем цвет заливки
cell_color = PatternFill(start_color='C64747', end_color='C64747', fill_type='solid')

# Применяем заливку к ячейке B3
ws_temp['B3'].fill = cell_color
print("Заливка применена к ячейке B3")

# Сохраняем файл
wb.save('colored_cells.xlsx')
print("Файл сохранен как colored_cells.xlsx")
Цвет и тип заливки: Обратите внимание, что в некоторых случаях может потребоваться указание обоих параметров цвета: start_color и end_color.
Попробуте- кажется так должно быть
 
Последнее редактирование:

Checat

One Level
01.04.2024
9
1
BIT
152
Admin80 Спасибо. Попробовал и не помогло.
Python:
def sheet_style():
    """
    функция оформления документа с результатами
    """
    ws.column_dimensions['B'].width = 110 # изменение ширины работает
    # а вот именно заливка не работает:
    temp_sheet = ws.cell(row=3, column=2)
    cell_red = PatternFill(start_color='C64747', end_color='C64747', fill_type='solid')
    temp_sheet.fill = cell_red
    for index_row in range(1, ws_requirement.max_row + 1):
           for index_column in (1, 3, 4, 5):
        # здесь выравниваю значения по центру ячеек и это работает без проблем
        cell_style = ws.cell(row=index_row, column=index_column)
        cell_style.alignment = Alignment(horizontal='center')
    

if __name__ == '__main__':
    from openpyxl import *
    from openpyxl.styles import *
    # здесь вызов функций по парсингу и созданию отчетного документа xlsx
    # ...
    # вызов функции оформления документа
    sheet_style()
    # сохранение документа
    wb.save('result.xlsx')

На самом деле в sheet_style() задачи оформления шире, но именно с заливкой пытаюсь закрасить хотя-бы одну ячейку. По аналогии можно будет все остальное сделать. Пробовал задать ячейку через метод cell и через ['B3']; в PatternFill пробовал разные примеры из интернета (в том числе с fgcolor; start_color и end_color) и результат один - ничего. Ни ошибки, ни результата. Код оформления, расположенный в функции sheet_style() работает весь, кроме PatternFill, а это показывает что импорт прошел, openpyxl.style работает, функция вызывается, запись в файл проходит. Как по мне, так вопрос именно в PatternFill, что-то я упустил. В консоли help(PatternFill) показывает мануал и по нему вроде как все соответствует. Кстати пробовал использовать "вшитые" цвета (patternType='gray125') и тоже никакого результата.

Если имеет значение: OS Win10, PyCharm, python 3.11.
 

Koloboking

Green Team
12.01.2017
165
46
BIT
772
Admin80 Спасибо. Попробовал и не помогло.
Python:
def sheet_style():
    """
    функция оформления документа с результатами
    """
    ws.column_dimensions['B'].width = 110 # изменение ширины работает
    # а вот именно заливка не работает:
    temp_sheet = ws.cell(row=3, column=2)
    cell_red = PatternFill(start_color='C64747', end_color='C64747', fill_type='solid')
    temp_sheet.fill = cell_red
    for index_row in range(1, ws_requirement.max_row + 1):
           for index_column in (1, 3, 4, 5):
        # здесь выравниваю значения по центру ячеек и это работает без проблем
        cell_style = ws.cell(row=index_row, column=index_column)
        cell_style.alignment = Alignment(horizontal='center')
   

if __name__ == '__main__':
    from openpyxl import *
    from openpyxl.styles import *
    # здесь вызов функций по парсингу и созданию отчетного документа xlsx
    # ...
    # вызов функции оформления документа
    sheet_style()
    # сохранение документа
    wb.save('result.xlsx')

На самом деле в sheet_style() задачи оформления шире, но именно с заливкой пытаюсь закрасить хотя-бы одну ячейку. По аналогии можно будет все остальное сделать. Пробовал задать ячейку через метод cell и через ['B3']; в PatternFill пробовал разные примеры из интернета (в том числе с fgcolor; start_color и end_color) и результат один - ничего. Ни ошибки, ни результата. Код оформления, расположенный в функции sheet_style() работает весь, кроме PatternFill, а это показывает что импорт прошел, openpyxl.style работает, функция вызывается, запись в файл проходит. Как по мне, так вопрос именно в PatternFill, что-то я упустил. В консоли help(PatternFill) показывает мануал и по нему вроде как все соответствует. Кстати пробовал использовать "вшитые" цвета (patternType='gray125') и тоже никакого результата.

Если имеет значение: OS Win10, PyCharm, python 3.11.
Python:
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Alignment

def sheet_style(ws):
    """
    Функция оформления документа с результатами
    """
    ws.column_dimensions['B'].width = 110  # изменение ширины работает

    # Заливка ячейки
    temp_sheet = ws.cell(row=3, column=2)
    cell_red = PatternFill(start_color='C64747', end_color='C64747', fill_type='solid')
    temp_sheet.fill = cell_red

    # Выравнивание значений по центру ячеек
    for index_row in range(1, ws.max_row + 1):
        for index_column in (1, 3, 4, 5):
            cell_style = ws.cell(row=index_row, column=index_column)
            cell_style.alignment = Alignment(horizontal='center')

if __name__ == '__main__':
    from openpyxl import Workbook
    from openpyxl.styles import PatternFill, Alignment

    # Создаем новую книгу и активируем рабочий лист
    wb = Workbook()
    ws = wb.active

    # Пример данных, чтобы иметь что форматировать
    ws.append(["Header1", "Header2", "Header3", "Header4", "Header5"])
    ws.append(["Data1", "Data2", "Data3", "Data4", "Data5"])
    ws.append(["Data1", "Data2", "Data3", "Data4", "Data5"])

    # Вызов функции оформления документа
    sheet_style(ws)

    # Сохранение документа
    wb.save('result.xlsx')
    print("Файл сохранен как result.xlsx")
попробуйте этот код отдельно - если все работает как надо можно интегрировать
 

Checat

One Level
01.04.2024
9
1
BIT
152
попробуйте этот код отдельно - если все работает как надо можно интегрировать
В этом коде работает все, кроме заливки. Ради эксперимента выполнил код на связке kali + PyCharm с открытием итогового файла в win - все также. Поменял версию питона на 3.10 - в результате ничего на поменялось.
 

Koloboking

Green Team
12.01.2017
165
46
BIT
772
В этом коде работает все, кроме заливки. Ради эксперимента выполнил код на связке kali + PyCharm с открытием итогового файла в win - все также. Поменял версию питона на 3.10 - в результате ничего на поменялось.
Запускал на вин11 через консоль, писал в Notepad, python 3.12
1721286668199.png

Python:
pip install --upgrade openpyxl
 
Последнее редактирование:

Checat

One Level
01.04.2024
9
1
BIT
152
Admin80, спасибо за помощь. Код приведённый Вами выше полностью рабочий.

Проблема заключалась в самом MS Office. То есть, выполняется код (на самом деле не важно из cmd или PyCharm или чего другого) в результате чего генерируется файл xlsx. А вот при открытии заливки нет. Я искал проблему в patternFill, но если взять сгенерированный xlsx и передать в другую OS, то заливка отображается. При этом, если я перенесу код во вторую OS и выполню его там, то заливка отображается. Отправляю этот файлик в первую OS и заливки нет. Вот такой полтергейст.

Если кому-то понадобиться:
Тестовая машина 1 (исполнение без заливки): MS Excel стандартный 2021 (сборка 14228.20204)
Тестовая машина 2 (исполнение с заливкой): MS Excel профессиональный плюс 2021 (сборка 14332.20400).
Штатная заливка в обоих случаях работает без проблем.

Переустановка офиса все вылечила.
 

Koloboking

Green Team
12.01.2017
165
46
BIT
772
Admin80, спасибо за помощь. Код приведённый Вами выше полностью рабочий.

Проблема заключалась в самом MS Office. То есть, выполняется код (на самом деле не важно из cmd или PyCharm или чего другого) в результате чего генерируется файл xlsx. А вот при открытии заливки нет. Я искал проблему в patternFill, но если взять сгенерированный xlsx и передать в другую OS, то заливка отображается. При этом, если я перенесу код во вторую OS и выполню его там, то заливка отображается. Отправляю этот файлик в первую OS и заливки нет. Вот такой полтергейст.

Если кому-то понадобиться:
Тестовая машина 1 (исполнение без заливки): MS Excel стандартный 2021 (сборка 14228.20204)
Тестовая машина 2 (исполнение с заливкой): MS Excel профессиональный плюс 2021 (сборка 14332.20400).
Штатная заливка в обоих случаях работает без проблем.

Переустановка офиса все вылечила.
Прикольная причина)неожиданная. Спасибо за то что озвучили
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!