Я работаю над автоматическим c сценарием сравнения листов Excel python, но у меня возникают проблемы с отображением изменений при открытии документа Excel. По сути, он выполняет сравнение уровня ячеек и добавляет красную заливку, если ячейка изменилась, и зеленую заливку, если ячейка не изменилась. Я использую openpyxl для редактирования значения и изменения цвета заливки. После запуска кода я открываю файл excel, чтобы не видеть никаких изменений. Однако, когда я нажимаю на сами ячейки, я вижу изменение цвета заливки. Мне нужна помощь в поиске решения, которое автоматически активирует это форматирование перед открытием файла Excel. Кто-нибудь имеет опыт работы с этим?
Для запуска создайте файл Excel с именем 'test', затем добавьте значения в строки в первом столбце Sheet1. Создайте второй Лист2 и добавьте те же значения для половины первого столбца, затем измените значения для второй половины первого столбца. Сохранить, закрыть файл, запустить. Тогда ищите изменения.
import pandas as pd
import openpyxl as op
from openpyxl.utils.cell import get_column_letter
from openpyxl.styles import PatternFill
def main():
old_tab = "Sheet1"
new_tab = "Sheet2"
# set up A1:A10 on Sheet1 all to be = 10
# ... then on Sheet2, have A1:A5 be = 10, and A6:A10 be = 20
path = './test.xlsx'
# set up list to track indices that should be highlighted red
cells_to_highlight_red = []
red_fill = PatternFill(fill_type=None, start_color='FFFFFFFF', end_color='FF0000')
# set up list to track indices that should be highlighted green
cells_to_highlight_green = []
green_fill = PatternFill(fill_type=None, start_color='FFFFFFFF', end_color='008000')
old_sheet = pd.read_excel(path, sheet_name=old_tab, data_only=True, header=None).fillna('-')
new_sheet = pd.read_excel(path, sheet_name=new_tab, data_only=True, header=None).fillna('-')
# do cell by cell comparison to see if cells have changed
bool_df = old_sheet.eq(new_sheet)
# go through each column
for col_index in range(bool_df.shape[1]):
# then through each row of the bool_df.
# ... if the cell is False, that means a change has occurred
# ... if the cell is not False, so True, that means no
for row_index, row in enumerate(bool_df.iloc[:,col_index].values.flatten()):
if row == False:
col_letter = get_column_letter(col_index+1)
trg_cell = col_letter + str(row_index+1)
trg_cell.replace(" ", "")
# if this is true, then there was no value to begin or end, so do not add to list to track
if old_sheet.iloc[row_index, col_index] == "-" and new_sheet.iloc[row_index, col_index] == "-":
continue
cells_to_highlight_red.append(trg_cell)
else:
col_letter = get_column_letter(col_index+1)
trg_cell = col_letter + str(row_index+1)
trg_cell.replace(" ", "")
# if this is true, then there was no value to begin or end, so do not add to list to track
if old_sheet.iloc[row_index, col_index] == "-" and new_sheet.iloc[row_index, col_index] == "-":
continue
cells_to_highlight_green.append(trg_cell)
target_workbook = op.load_workbook( filename=path )
target_sheet = target_workbook["Sheet2"]
for trg_col_row in cells_to_highlight_red:
cell_to_edit = target_sheet[trg_col_row]
cell_to_edit.fill = red_fill
for trg_col_row in cells_to_highlight_green:
cell_to_edit = target_sheet[trg_col_row]
cell_to_edit.fill = green_fill
target_workbook.save( path )
main()