Как выделить новые строки и / или элементы Specifi c в электронной таблице Excel, используя Python - PullRequest
0 голосов
/ 12 марта 2020

Итак, у меня есть рабочий сценарий, который в основном объединит обе таблицы в одну. Он даже скажет мне о новых строках, но не выделит новые строки в объединенной электронной таблице. Я бы хотел, чтобы Python выделил общие дополнения из сравнительной разницы двух таблиц.

Код:

import pandas as pd
from pathlib import Path


def excel_diff(path_OLD, path_NEW, index_col):

    df_OLD = pd.read_excel(path_OLD, index_col=index_col).fillna(0)
    df_NEW = pd.read_excel(path_NEW, index_col=index_col).fillna(0)

    # Perform Diff
    dfDiff = df_NEW.copy()
    droppedRows = []
    newRows = []

    cols_OLD = df_OLD.columns
    cols_NEW = df_NEW.columns
    sharedCols = list(set(cols_OLD).intersection(cols_NEW))

    for row in dfDiff.index:
        if (row in df_OLD.index) and (row in df_NEW.index):
            for col in sharedCols:
                value_OLD = df_OLD.loc[row,col]
                value_NEW = df_NEW.loc[row,col]
                if value_OLD==value_NEW:
                    dfDiff.loc[row,col] = df_NEW.loc[row,col]
                else:
                    dfDiff.loc[row,col] = ('{}→{}').format(value_OLD,value_NEW)
        else:
            newRows.append(row)

    for row in df_OLD.index:
        if row not in df_NEW.index:
            droppedRows.append(row)
            dfDiff = dfDiff.append(df_OLD.loc[row,:])

    dfDiff = dfDiff.sort_index().fillna('')
    print(dfDiff)
    print('\nNew Rows:     {}'.format(newRows))
    print('Dropped Rows: {}'.format(droppedRows))

    # Save output and format
    fname = '{} vs {}.xlsx'.format(path_OLD.stem,path_NEW.stem)
    writer = pd.ExcelWriter(fname, engine='xlsxwriter')

    dfDiff.to_excel(writer, sheet_name='DIFF', index=True)
    df_NEW.to_excel(writer, sheet_name=path_NEW.stem, index=True)
    df_OLD.to_excel(writer, sheet_name=path_OLD.stem, index=True)

    # get xlsxwriter objects
    workbook  = writer.book
    worksheet = writer.sheets['DIFF']
    worksheet.hide_gridlines(2)
    worksheet.set_default_row(15)

    # define formats
    date_fmt = workbook.add_format({'align': 'center', 'num_format': 'yyyy-mm-dd'})
    center_fmt = workbook.add_format({'align': 'center'})
    number_fmt = workbook.add_format({'align': 'center', 'num_format': '#,##0.00'})
    cur_fmt = workbook.add_format({'align': 'center', 'num_format': '$#,##0.00'})
    perc_fmt = workbook.add_format({'align': 'center', 'num_format': '0%'})
    grey_fmt = workbook.add_format({'font_color': '#E0E0E0'})
    highlight_fmt = workbook.add_format({'font_color': '#FF0000', 'bg_color':'#B1B3B3'})
    new_fmt = workbook.add_format({'font_color': '#32CD32','bold':True})

    # set format over range
    ## highlight changed cells
    worksheet.conditional_format('A1:ZZ1000', {'type': 'text',
                                            'criteria': 'containing',
                                            'value':'→',
                                            'format': highlight_fmt})

    # highlight new/changed rows
    for row in range(dfDiff.shape[0]):
        if row+1 in newRows:
            worksheet.set_row(row+1, 15, new_fmt)
        if row+1 in droppedRows:
            worksheet.set_row(row+1, 15, grey_fmt)

    # save
    writer.save()
    print('\nDone.\n')


def main():
    path_OLD = Path('v1.xlsx')
    path_NEW = Path('v2.xlsx')

    # get index col from data
    df = pd.read_excel(path_NEW)
    index_col = df.columns[0]
    print('\nIndex column: {}\n'.format(index_col))

    excel_diff(path_OLD, path_NEW, index_col)

У меня есть две таблицы с именами v1 и v2 соответственно. Скорее всего, я изменю это, сделав имена файлов из него и указав их в загружаемом файле json позже. Я также приложил два файла. enter image description here

Когда скрипт запускает и обрабатывает новые файлы, я вижу в своем терминале следующее:

PS C:\Users\richard.barrett\Git\ITDataServicesInfra\Python\Analyses> python .\excel_diff_nonequal_shape.py

Index column: Student

         Last Name  Student ID  Grade Current Date Effective Date   Code
Student
Abe           Fam1           8      9   2020-02-27      2020-02-27      0
Abel          Fam2           2      4   2019-01-01      2026-02-21      1
Ashley        Fam3           3     10   2019-01-05      2019-05-21      2
Gabe          Fam4           1      9   2020-02-27      2020-02-27      0
James         Fam6           5     11   2018-08-02      2018-09-02      0
John          Fam5           4     10   2018-08-01      2018-09-01      2
Jorge         Fam8           7      2   2018-08-04      2018-09-04      1
Juan          Fam7           6      5   2018-08-03      2018-09-03      1

New Rows:     ['Gabe', 'John', 'James', 'Juan', 'Jorge']
Dropped Rows: ['Abe']

Done.

Я хотел бы, чтобы эти строки и их элементы выделиться и сохранить вывод в файл. У меня все работает, кроме основных моментов.

enter image description here

Файлы Excel с расширением .xlsx можно найти здесь: https://github.com/Richard-Barrett/ITDataServicesInfra/tree/master/Python/Analyses

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...