通过构建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()