使用openpyxl+ win32ui库,交互式拆分表格,并且完美保留原表格格式方案

主要思路:

  1. 利用win32ui库创建弹出框,交互式获取要拆分的文件和拆分依据的列名
  2. 用openpyxl.load_workbook反复读取要拆分的表格
  3. 循环表格拆分列表(去重),每读取一次,就循环判断表格拆分列是否包含拆分列表元素,不含则删除一整行(这里用倒序删除,避免行序重置出错)
  4. 循环一次就另存一次表格
    缺点
    比较慢,可以考虑把删除换成复制到新表的办法,可以更快
    优点
    完美保留原表格格式,代码量比较少,逻辑简单
    完整代码:
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("数据拆分已完成!!!")
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值