当前位置: 首页 > 后端技术 > Python

Python自动化办公Excel对比工具

时间:2023-03-25 22:25:01 Python

今天继续分享真实的办公自动化案例,希望所有Python爱好者都能从中得到一些启发,在工作和生活中更多地应用Python,让工作更有效率!需求因为工作前后经常需要比较两个Excel文件,文件内容比较大,用人眼比较太费力,容易出错。能不能用一个Python小工具来运行脚本事半功倍,并能比较前后两个Excel文件的差异?显示内容数据,不同的工作表标签表示不同的数据处理结果。需求分析不用分析,直接实现代码。我们首先导入两个测试数据,并处理旧的和新的。注意数据中的账号是唯一索引old=pd.read_excel('sample-address-1.xlsx','Sheet1',na_values=['NA'])new=pd.read_excel('sample-address-2.xlsx','Sheet1',na_values=['NA'])old['version']="old"new['version']="new"对于我们这个小工具,主要考虑三种变化哪些是新增账户,哪些是删除账户,就是修改后的账户。对于新增和删除的账号,我们可以直接将这两个数据相减。old_accts_all=set(old['accountnumber'])new_accts_all=set(new['accountnumber'])dropped_accts=old_accts_all-new_accts_alladded_accts=new_accts_all-old_accts_all接下来我们将所有数据拼接在一起,使用drop_duplicates保留修改后的数据all_data=pd.concat([old,new],ignore_index=True)changes=all_data.drop_duplicates(subset=["帐号","Name","STREET","City","State","PostalCode"],keep='Last')接下来,我们需要找出哪些访问有重复的条目,重复的帐户表明我们需要更改那个我们需要标记字段中的值我们可以使用duplicate函数来获取所有这些帐户的列表,并仅过滤掉重复的帐户accountdupe_accts=changes[changes['accountnumber'].duplicated()==True]['accountnumber'].tolist()dupes=changes[changes["账号"].isin(dupe_accts)]dupe_accts=changes[changes['账号'].duplicated()==True]['账号'].tolist()dupes=changes[changes["accountnumber"].isin(dupe_accts)]现在我们拆分旧数据和新数据,删除不需要的版本列并将account设置为索引change_new=dupes[(dupes["version"]=="new")]change_old=dupes[(dupes["version"]=="old")]change_new=change_new.drop(['version'],axis=1)change_old=change_old.drop(['version'],axis=1)change_new.set_index('帐号',inplace=True)change_old.set_index('帐号',inplace=True)df_all_changes=pd.concat([change_old,change_new],轴='列',=s['旧','新'],join='outer')df_all_changes接下来我们定义一个显示从一列到另一列的变化的函数defreport_diff(x):returnx[0]ifx[0]==x[1]else'{}--->{}'.format(*x)defreport_diff(x):returnx[0]ifx[0]==x[1]else'{}--->{}'.format(*x)现在使用swaplevel函数获取旧列和新列最后我们使用groupby然后应用我们的自定义report_diff函数将两个对应的列相互比较df_changed=df_all_changes.groupby(level=0,axis=1).apply(lambdaframe:frame.apply(report_diff,axis=1))df_changed=df_changed.reset_index()df_changed=df_all_changes.groupby(level=0,axis=1).apply(lambdaframe:frame.apply(report_diff,axis=1))df_changed=df_changed.reset_index()接下来我们需要找到删除和添加的数据df_removed=changes[changes["accountnumber"].isin(dropped_accts)]df_added=changes[changes["accountnumber"].isin(added_accts)]df_removed=changes[changes["accountnumber".isin(dropped_accts)]df_added=changes[changes["账号"].isin(added_accts)]我们可以使用对应于更改、添加和删除的单独选项卡将所有内容输出到Excel文件output_columns=["accountnumber","name","街道","城市","州","邮政编码"]writer=pd.ExcelWriter("my-diff.xlsx")df_changed.to_excel(writer,"changed",index=False,columns=output_columns)df_removed.to_excel(writer,"removed",index=False,columns=output_columns)df_added.to_excel(writer,"added",index=False,columns=output_columns)writer.save()最后我们得到了最初步效果图是一个新的Excel文件,当然上面的代码对于不会编程的人来说还是有点复杂,我们来做一个GUI小程序,这次我们使用Tkinter来编写GUI程序,我们先导入Tkinter库,初始化importtkinterfromtkinterimport*fromtkinterimportLabel,Button,Entry,messageboxfromtkinterimportfiledialogfromdealimportdeal_excelwindow=tkinter.Tk()path_file1=StringVar()path_file2=try(winpath.String_path)('380x150')这里我们定义了三个变量String类型保存文件地址和文件夹路径然后我们进行简单的页面布局,只有Label、Entry和Button足够label1=Label(window,text="File1:").grid(column=0,row=0)txt1=Entry(window,width="30",textvariable=path_file1).grid(column=1,row=0)button1=Button(window,text="fileselection1",command=selectFile1).grid(column=2,row=0)label2=标签(窗口,文本=“文件2:”)。网格(列=0,行=1)txt2=条目(窗口,宽度=“30”,文本变量=路径文件2)。网格(列=1,行=1)button2=Button(window,text="FileSelection2",command=selectFile2).grid(row=1,column=2)label3=Label(window,text="Newfilepath:").grid(column=0,row=2)txt3=Entry(window,width="30",textvariable=path_path)txt3.grid(column=1,row=2)button3=Button(window,text="newfilepath",命令=selectPath).grid(row=2,column=2)button4=Button(window,text="Startprocessing",command=save_path).grid(row=3,column=1)获取文件和文件夹的函数defselectFile1():path_=filedialog.askopenfilename()path_file1.set(path_)函数用于保存新生成的文件和提示信息defsave_path():path=txt3.get()deal_excel(path)res="对比处理完成!"messagebox.showinfo('胡萝卜大杂烩',res)这样一个简单的Excel比较工具就完成了,至此我们就完成了一个简单的PDF文件分割GUI工具!以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”也能领取大量学习资料或前往编程学习网了解更多编程技术知识。