主要思路:
- 利用win32ui库创建弹出框,交互式获取要拆分的文件和拆分依据的列名
- 用openpyxl.load_workbook反复读取要拆分的表格
- 循环表格拆分列表(去重),每读取一次,就循环判断表格拆分列是否包含拆分列表元素,不含则删除一整行(这里用倒序删除,避免行序重置出错)
- 循环一次就另存一次表格
缺点
比较慢,可以考虑把删除换成复制到新表的办法,可以更快
优点
完美保留原表格格式,代码量比较少,逻辑简单
完整代码:
import pyautogui
import win32ui
import os
import tkinter as tk
import openpyxl
import datetime
time_str = datetime.datetime.now().strftime("%Y-%m-%d %H%M%S")
# 0代表另存为对话框,1代表打开文件对话框
dlg = win32ui.CreateFileDialog(1)
#设置默认目录
dlg.SetOFNInitialDir('C:/')
#显示对话框
dlg.DoModal()
#获取用户选择的文件全路径
filename = dlg.GetPathName()
filepath = dlg.GetPathName().split(dlg.GetFileName())[0]
#打印用户选择的文件全路径
#print("%s" % filename)
#-------------------------------创建弹出框,获取输入要拆分的文件和列名----------------
def on_click():
global col_name
col_name = xls_text.get().lstrip()
if len(col_name) == 0:
# print("列名必须输入!")
exit()
root.quit()
root.destroy()
# print("列名:%s" %(col_name))
root = tk.Tk()
root.geometry("350x200")
root.title("请输入要拆分的列名")
xls_text = tk.StringVar()
l1 = tk.Label(root, text="请输入列名:")
l1.pack() # 这里的side可以赋值为LEFT RTGHT TOP BOTTOM
xls = tk.Entry(root, textvariable=xls_text)
xls_text.set(" ")
xls.pack()
tk.Button(root, text="点击确认", command=on_click).pack()
root.mainloop()
# 拆分为工作表
# ---------------------------------------加载需要处理的excel文件------------------
wb = openpyxl.load_workbook(filename)
# 选择表单
sheet = wb.active
#-----------------------------------------获取选择列的列号-转为数字----------------
for row in sheet.iter_cols(min_row=1,max_col=sheet.max_column,max_row=1):
if str(row[0].value) in col_name:
col_name_num = openpyxl.utils.column_index_from_string(row[0].column)
#--------------------------------------------------创建待拆分列表 -------------------------
class_list = []
for row in sheet.rows:
class_list.append(row[col_name_num-1].value)
class_list = set(class_list[1:])
class_list = [i for i in class_list if i != '']
#print(class_list)
#----------------------------------创建存放拆分表文件夹,为区别使用到时间命名------------------------
isExits = os.path.exists(filepath+"拆分表存放%s\\"%(time_str))
# 判断结果
if not isExits:
os.makedirs(filepath+"拆分表存放%s\\"%(time_str)) # 不存在则创建该目录
# ----------------------------------将表拆分为单独的新表---------------------------------
for prv in list(class_list):
for i in range(sheet.max_row,1,-1):
if sheet.cell(i,1).value not in prv and sheet.cell(i,1).value != None: #注意要用not in判断,其他会出错
sheet.delete_rows(i)
wb.save(filepath+"拆分表存放%s\\"%(time_str)+r'%s.xlsx'%(prv))
# wb.close()
wb = openpyxl.load_workbook(filename)
sheet = wb.active
wb.close()
pyautogui.alert("数据拆分已完成!!!")