Есть ли способ вызвать форматирование в документах Excel через Python - PullRequest
1 голос
/ 26 марта 2020

Я работаю над автоматическим 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()
...