Итак, у меня есть рабочий сценарий, который в основном объединит обе таблицы в одну. Он даже скажет мне о новых строках, но не выделит новые строки в объединенной электронной таблице. Я бы хотел, чтобы 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 позже. Я также приложил два файла.
Когда скрипт запускает и обрабатывает новые файлы, я вижу в своем терминале следующее:
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.
Я хотел бы, чтобы эти строки и их элементы выделиться и сохранить вывод в файл. У меня все работает, кроме основных моментов.
Файлы Excel с расширением .xlsx можно найти здесь: https://github.com/Richard-Barrett/ITDataServicesInfra/tree/master/Python/Analyses