Excel文件操作-Excel文件key值比对,输出修改内容

#导入所需库
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值