只要是小组工作,经常会遇到这种的场景。比如一个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里面,就可以使用。
效果如下:
注意,只是合并了内容,不保留单元格格式