#导入所需库
import tkinter as tk
import tkinter.messagebox
import threading
import excelformat2
from tkinter import filedialog
#函数定义---------------------------------------------------------------------------------------
#线程函数,防止界面卡死,把主函数放在线程函数中执行
def askfile2(): #源文件路径
global file_path2
file_path2=filedialog.askopenfilename()
print(file_path2)
en1.insert(0, file_path2)
def askfile1(): #新文件路径
global file_path1
file_path1=filedialog.askopenfilename()
print(file_path1)
en2.insert(0, file_path1)
def askdir(): #结果输出路径
global file_path3
file_path3=filedialog.askdirectory()
print(file_path3)
en3.insert(0, file_path3)
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=file_path1 #接收新文件路径
path_old=file_path2 #接受原文件路径
path_out=file_path3 #接受结果输出路径
ignore=en4.get().split('|') #接收忽略列名
keyl=en5.get().split('|') #接收key值列名
print(ignore,keyl)
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
diff1=[]
diff2=[]
for r in range(len(sheet2)): #先用NA填充比对结果列
result.append('新增')
diff1.append('NA')
diff2.append('NA')
for m in range(len(sheet2)): #循环新文件每行
dif1=[]
dif2=[]
for n in range(len(sheet1)): #循环旧文件每行
flag=1 #定义flag,若行与行比较中不一致,则flag变为0,继续比较旧文件剩余行,若完全一致,则flag为1,比较新文件下一行
flag1=1
for k in keyl:
if sheet2[k][m]==sheet1[k][n]:
continue
else:
flag1=0
break
if flag1==0:
continue
else:
print(sheet2[k][m],sheet1[k][n])
for c in sheet2.columns:
try:
sheet1.loc[n,c]=str(int(sheet1[c][n]))
except:
pass
try:
sheet2.loc[m,c]=str(int(sheet2[c][m]))
except:
pass
if c not in ignore and sheet1[c][n]!=sheet2[c][m]:
print(sheet1[c][n],sheet2[c][m])
flag=0
result[m]='不一致'
# dif1.append(c)
# dif2.append(c)
dif1.append(c+':'+sheet1[c][n])
dif2.append(c+':'+sheet2[c][m])
# if m==0 and n==35:
# print(c,sheet1[c][n],sheet2[c][m])
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')
if len(dif1)>0:
diff1[m]=';'.join(dif1)
diff2[m]=';'.join(dif2)
else:
diff1[m]=''
diff2[m]=''
sheet2.insert(len(sheet2.columns),'比较结果',result) #将比较结果例插入新文件最后一列
sheet2.insert(len(sheet2.columns),'原值',diff1)
sheet2.insert(len(sheet2.columns),'新值',diff2)
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=[]
bu2=tk.Button(window,text='点击选择原文件',font=('楷体',10),padx=3,pady=3,command=askfile2)
bu2.grid(row=0,column=0)
en1=tk.Entry(window,width=80)
en1.grid(row=0,column=1)
bu3=tk.Button(window,text='点击选择新文件',font=('楷体',10),padx=3,pady=3,command=askfile1)
bu3.grid(row=1,column=0)
en2=tk.Entry(window,width=80)
en2.grid(row=1,column=1)
bu4=tk.Button(window,text='点击选择比对结果输出文件夹',font=('楷体',10),padx=3,pady=3,command=askdir)
bu4.grid(row=2,column=0)
en3=tk.Entry(window,width=80)
en3.grid(row=2,column=1)
lb4=tk.Label(window,text='请输入不进行比较的列名\n(以竖杠|隔开):',font=('楷体',10),padx=5,pady=5)
lb4.grid(row=3,column=0)
en4=tk.Entry(window,width=80)
en4.grid(row=3,column=1)
lb5=tk.Label(window,text='请输入作为Key值列名\n(以竖杠|隔开):',font=('楷体',10),padx=5,pady=5)
lb5.grid(row=4,column=0)
en5=tk.Entry(window,width=80)
en5.grid(row=4,column=1)
bu1=tk.Button(window,text='开始运行',command=lambda:thread_it(compare),font=('楷体',15,'bold'),activebackground='white')
bu1.grid(row=5,column=1)
te1=tk.Text(window)
#text增加滑动条
te1_sc=tk.Scrollbar() #构建滑动条
te1_sc.grid_configure(row=6,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=6,column=1)
window.mainloop()
Excel文件操作-Excel文件key值比对,输出修改内容
于 2022-08-23 14:17:47 首次发布