通过构建GUI用户界面,获取要比对文件的路径和忽略(不进行比对)的列名,比对采用双循环查找另一文件中是否存在完全相同的行的方式,找到则一致,未找到则不一致,比对结果输出在最后一列;

#导入所需库
import tkinter as tk
import tkinter.messagebox
import threading
import excelformat2
#函数定义---------------------------------------------------------------------------------------
#线程函数,防止界面卡死,把主函数放在线程函数中执行
def thread_it(func, *args):
    '''将函数放入线程中执行'''
    # 创建线程
    t = threading.Thread(target=func, args=args)
    # 守护线程
    t.setDaemon(True)
    # 启动线程
    t.start()
#比较函数——主函数
def compare():
    import pandas as pd
    global path_new,path_old,path_out,tk,ignore,te1
    info='比对完成'  #若运行未终止,最终会输出比对完成
    try:
        path_new=en2.get()  #接收新文件路径
        path_old=en1.get()  #接受原文件路径
        path_out=en3.get()  #接受结果输出路径
        ignore=en4.get().split('|')  #接收忽略列名
        path=r'{}\比对结果.xlsx'.format(path_out)    #处理结果输出路径
        writer=pd.ExcelWriter(path)  #生成writer用于写入比对结果
        print('原文件:',path_old,'新文件:',path_new)   #打印路径信息
        df1=pd.read_excel(path_new,sheet_name=None)  #sheet-name=None,可以用df.keys获取sheet 每个sheet名称
        
        for i in df1.keys():   #循环每个sheet
            print(i)    
            sheet1=pd.read_excel(path_old,sheet_name=i)  #读取原文件sheet
            sheet1.fillna('-',inplace=True)  #处理缺失值
            sheet2=pd.read_excel(path_new,sheet_name=i)  #读取新文件sheet
            sheet2.fillna('-',inplace=True)   #处理缺失值
            result=[]    #用于存放比对结果的list
    
            for r in range(len(sheet2)):   #先用NA填充比对结果列
                result.append('NA')
            for m in range(len(sheet2)):  #循环新文件每行
                for n in range(len(sheet1)):  #循环旧文件每行
                    flag=1  #定义flag,若行与行比较中不一致,则flag变为0,继续比较旧文件剩余行,若完全一致,则flag为1,比较新文件下一行
                    for c in sheet2.columns:
                        if c not in ignore and sheet1[c][n]!=sheet2[c][m]:
                            flag=0
                            result[m]='不一致'
    
                            break
                        else:
                            pass
                    if flag==1:
                        result[m]='一致'
                        te1.insert('end','{}_line{}:一致\n'.format(i,m))  #insert用于输出信息到GUI界面
                        te1.see('end')
                        print('line{}:一致'.format(m))
                        break
                if flag==0:
                    print('line{}不一致'.format(m))
                    te1.insert('end','{}_line{}:不一致\n'.format(i,m))
                    te1.see('end')
            sheet2.insert(len(sheet2.columns),'比较结果',result)  #将比较结果例插入新文件最后一列
    
            sheet2.to_excel(writer,index=False,sheet_name=i)  #保持原列名输出到文件
        writer.save()
        excelformat2.reset_col(path)   #调整格式
        excelformat2.reset_format(path)
    except Exception as e:
        te1.insert('end',e)
        print(e)     #输出报错信息

        info='比对失败! 请检查:\n1.文件路径输入是否有误;\n2.前后文件sheet名称及列名称是否完全相同!'
    tkinter.messagebox.showinfo('提示',info)  #若try中出现错误,则会出现以上错误提示
#窗体构建-----------------------------------------------------------------------------------------------    
window=tk.Tk()
window.geometry('840x560')
window.title('Excel文件比对')
path_old=tk.StringVar()
path_new=tk.StringVar()
path_out=tk.StringVar() 
ignore=[]

lb1=tk.Label(window,text='请输入原文件路径\n(带文件名后缀.xlsx):',font=('楷体',14),padx=5,pady=5)
lb1.grid(row=0,column=0)
en1=tk.Entry(window,width=80)
en1.grid(row=0,column=1)
lb2=tk.Label(window,text='请输入新文件路径\n(带文件名后缀.xlsx):',font=('楷体',14),padx=5,pady=5)
lb2.grid(row=1,column=0)
en2=tk.Entry(window,width=80)
en2.grid(row=1,column=1)
lb3=tk.Label(window,text='请输入比对结果输出路径:',font=('楷体',14),padx=5,pady=5)
lb3.grid(row=2,column=0)
en3=tk.Entry(window,width=80)
en3.grid(row=2,column=1)
lb4=tk.Label(window,text='请输入不进行比较的列名\n(以竖杠|隔开):',font=('楷体',14),padx=5,pady=5)
lb4.grid(row=3,column=0)
en4=tk.Entry(window,width=80)
en4.grid(row=3,column=1)
bu1=tk.Button(window,text='开始运行',command=lambda:thread_it(compare),font=('楷体',15,'bold'),activebackground='white')
bu1.grid(row=4,column=1)
te1=tk.Text(window)
#text增加滑动条
te1_sc=tk.Scrollbar()  #构建滑动条
te1_sc.grid_configure(row=5,column=1,sticky=tk.N+tk.S+tk.E)  #设置滑动条放置,n+s:上下延申,E:靠右
te1_sc.configure(command=te1.yview)  #将滑动条与texty方向绑定
te1.configure(yscrollcommand=te1_sc.set)  #将text与滑动条绑定
te1.grid(row=5,column=1)
window.mainloop()