Я загрузил данные из листа Excel, в котором применено форматирование ячеек (граница, слияние, шрифт..)
Затем я использовал условный оператор в Python для окрашивания ячеек при определенных условиях. Я хочу снова сохранить таблицу с этим стилем, сохранив формат исходного листа Excel, как показано ниже.
Как я могу кодировать? Я пробовал ниже, но меня не хотели.
import pandas as pd
import numpy as np
from openpyxl import load_workbook
workbook = openpyxl.load_workbook('test.xlsx')
worksheet = workbook['Tables']
# Load the DataFrame from the Excel file
df = pd.read_excel('test.xlsx', sheet_name='Tables')
# Define the column list
column_list = df.columns.to_list()[3:]
# Define the color function
def color(df, subset=column_list, up=5, low=-5):
tmp = df[column_list].sub(pd.to_numeric(df['Unnamed: 2'], errors='coerce'), axis=0)
return pd.DataFrame(np.select([tmp.gt(up), tmp.lt(low)],
['background-color: #e6ffe6;',
'background-color: #ffe6e6;'],
None), columns=subset, index=df.index
).reindex_like(df)
df.style.apply(color, axis=None).to_excel('result.xlsx', engine='openpyxl', index=False)
Я использовал приведенный ниже код, и он сохранил форматирование, а также изменил цвет ячейки при условии. Использование pandas 1.5.2 (я не думаю, что это как-то связано) и openpyxl 3.0.9. Он сохраняет размер, границу, стиль шрифта, толщину, семейство и цвет, как это было в тестовом файле.
import openpyxl
from openpyxl.styles import PatternFill
workbook = openpyxl.load_workbook('test.xlsx')
worksheet = workbook['Sheet1']
for row in worksheet.iter_rows(min_row=2, min_col=1, max_col=3):
if row[0].value > 1:
row[2].fill = PatternFill(start_color = "FDFF00", end_color = "FDFF00", fill_type='solid')
workbook.save('newfilename.xlsx')
@lbraheem Азим Спасибо за ваш ответ. Однако в коде, о котором я спрашивал, произошли изменения. Не могли бы вы проверить еще раз?
Логика не совсем ясна за цветными ячейками в ожидаемом выводе.
В любом случае, чтобы читать/условно-форматировать/записывать диапазон ячеек (в том же файле), используйте это:
import openpyxl
from openpyxl.styles import PatternFill
workbook = openpyxl.load_workbook('filename.xlsx')
worksheet = workbook['Sheet1']
for row in worksheet.iter_rows(min_row=3, min_col=3, max_col=9):
for cell in row:
if cell.value == 1: # <-- change the condition(s) here
cell.fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
workbook.save('filename.xlsx') # here, we write on the same file while keeping/updating the old F.
Выход :
Благодарю за ваш ответ. Однако в коде, о котором я спрашивал, произошли изменения. Не могли бы вы проверить еще раз?
Итак, почему у вас сначала был код openpyxl? В любом случае, вы не можете использовать pandas (в конечном итоге ExcelWriter) для записи в существующей электронной таблице, сохраняя при этом старые настройки форматирования, данные и т. д. (даже с mode=a, if_sheet_exists = "overlay"
), но вы можете сделать это с помощью openpyxl.
Как я могу управлять кадром данных без панд?
Вы полностью изменили свой код! Для этого вам придется использовать openpyxl.