Как я могу сохранить таблицу на листе excel с исходным форматированием листа в python?

Я загрузил данные из листа 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)


   

Вы полностью изменили свой код! Для этого вам придется использовать openpyxl.

Charlie Clark 13.04.2023 16:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я использовал приведенный ниже код, и он сохранил форматирование, а также изменил цвет ячейки при условии. Использование 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 Азим Спасибо за ваш ответ. Однако в коде, о котором я спрашивал, произошли изменения. Не могли бы вы проверить еще раз?

purplecollar 13.04.2023 14:14
Ответ принят как подходящий

Логика не совсем ясна за цветными ячейками в ожидаемом выводе.

В любом случае, чтобы читать/условно-форматировать/записывать диапазон ячеек (в том же файле), используйте это:

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.

Выход :

Благодарю за ваш ответ. Однако в коде, о котором я спрашивал, произошли изменения. Не могли бы вы проверить еще раз?

purplecollar 13.04.2023 14:14

Итак, почему у вас сначала был код openpyxl? В любом случае, вы не можете использовать pandas (в конечном итоге ExcelWriter) для записи в существующей электронной таблице, сохраняя при этом старые настройки форматирования, данные и т. д. (даже с mode=a, if_sheet_exists = "overlay"), но вы можете сделать это с помощью openpyxl.

Timeless 13.04.2023 14:17

Как я могу управлять кадром данных без панд?

purplecollar 13.04.2023 14:46

Другие вопросы по теме