Python—使用tkinter一键实现合并多个Excel的工作表的内容

只要是小组工作,经常会遇到这种的场景。比如一个Excel任务表,每人都有任务,我们需要分发Excel到每个人,让每个人各自反馈自己的任务进度,然后汇总过来。传统的做法就是,Excel群发给每个人,每个人各自筛选自己名下的任务,反馈各自任务进度,然后把各自反馈的Excel发给组长汇总。而组长呢,就只好一个个打开各个组员的Excel,一个个复制粘贴拼接内容,如果组员很多,实在是累死人啊。有没有解决办法呢?

有条件的可以搞个在线共享Excel,大家都可以上去编辑。但是毕竟更多的单位没有这个条件,我想到了一个比较好的解决办法,能对一大群Excel进行内容合并。比如,我们有这么一个任务:
在这里插入图片描述
每个省份代表每个组员,各自反馈自己名下城市的任务进展,比如反馈如下:
在这里插入图片描述 在这里插入图片描述在这里插入图片描述
而我们想得到的是这么一个汇总表
在这里插入图片描述
以下程序可以帮助实现,为了便利,封装到了tkinter中

#-*- coding:utf-8 -*-
import tkinter as tk #使用Tkinter前需要先导入
from tkinter import filedialog,messagebox,ttk
import os
import pandas as pd
#建立窗口window
window = tk.Tk()
window.title('Excel合并工作表工具')
window.geometry('500x500')

paths_tar=tk.StringVar()    #选择的文件字符串
sheetvar=tk.StringVar()     #选择的工作表
newfile=tk.StringVar()      #导出的文件名
segvars=[]                  #要反馈的字段
#打开要合并的文件组
def getmergefiles():
  global file_paths
  file_paths=filedialog.askopenfilenames(title=u'选择文件(多选)',filetype=[('Excel','.xlsx')])
  paths_tar.set(file_paths)
  alldata=pd.read_excel(file_paths[0],None)     #读取第一个文件
  newfile.set(os.path.split(file_paths[0])[1].split('-')[0])
  ttk.Label(frame1,text="请选择目标工作表:").grid(row=1,column=0,sticky='w')
  chosen_sheet=ttk.Combobox(frame1,width=16,textvariable=sheetvar)
  chosen_sheet['values']=list(alldata)
  chosen_sheet.grid(row=1,column=1,sticky='w')
  chosen_sheet.bind("<<ComboboxSelected>>",lambda event:getneedseg(event,alldata,sheetvar.get()))
#选择必填的字段
def getneedseg(event,alldata,sheet):
  global frame2
  try:
    frame2.destroy()
  except:
    pass
  frame2=tk.Frame(window,padx=15,pady=6)
  frame2.grid(row=1,column=0,sticky='w')
  ttk.Label(frame2,text="请勾选反馈必填的字段:").grid(row=0,column=0,columnspan=4,sticky='w')
  data=alldata[sheet]
  for index,item in enumerate(data.columns):
    segvars.append(tk.StringVar())
    ttk.Checkbutton(frame2,text=item,variable=segvars[-1],onvalue=item,offvalue='').grid(row=(index//4+1),column=index%4,sticky='w')
#合并内容
def merging(file_paths,newfile,sheet,segvars):
  segs=[i.get() for i in segvars if i.get()]
  dfall=[]
  for file in file_paths:
    df=pd.read_excel(file,sheet)
    for seg in segs:
      df=df.loc[df[seg].notna()]    #选取非空的内容
    dfall.append(df)
  dff=pd.concat(dfall,axis=0,ignore_index=True)
  dff.drop_duplicates(inplace=True)         #去完成重复的行
  newfile=os.path.join(os.path.dirname(file),newfile+'.xlsx')
  dff.to_excel(newfile,index=False)
  messagebox.showinfo('提示','合并完成,生成了'+newfile)
  os.system('start '+os.path.dirname(file))

frame1=tk.Frame(window,pady=6,padx=15)
frame1.grid(row=0,column=0,sticky='w')
ttk.Button(frame1,text='打开目标文件',command=getmergefiles).grid(row=0,column=0,sticky='w')
ttk.Entry(frame1,textvariable=paths_tar,width=40).grid(row=0,column=1,sticky='w')
frame3=tk.Frame(window,pady=6,padx=15)
frame3.grid(row=2,column=0,sticky='w')
ttk.Label(frame3,text="输入要保存的文件名:").grid(row=0,column=0,sticky='w')
ttk.Entry(frame3,textvariable=newfile).grid(row=0,column=1,pady=6)
ttk.Button(frame3,text="点击合并Excel",command=lambda:merging(file_paths,newfile.get(),sheetvar.get(),segvars)).grid(row=1,column=0,sticky='w')
window.mainloop()

比如一群Excel文件的特定名称的sheet,比如sheet1,大家要反馈的内容都在sheet1里面,就可以使用。

效果如下:
在这里插入图片描述
注意,只是合并了内容,不保留单元格格式

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值