设计一个相对通用型的表格拆分程序,并将其封装成exe格式

【核心设计思路】

1.使用pandas读取待拆分文件后,读取可用于拆分的字段名称
2.根据使用者传入的字段名称,对df进行分组
3.将各个df写入到表格中

【实际应用中需要解决的几个问题】

1.使用者传入的表格可能包含多个子表,因此需要使用者确认对哪个子表进行拆分操作;确认子表设置成可选择位置1.2.3或者输入子表名称的方式进行选取,因此此时还需要解决表格名称以数字命名的情形;
2.设置允许错误使用该程序的次数,达到允许错误产生的次数上限后强制退出程序;
3.若待拆分表格仅有1个子表,则无需进行子表选择操作.

    def choose_from_list(list_0,file_0,sht_type,positon,type=1):if type>0:list_1=[i.replace(file_0,'') for i in list_0]else:list_1=list_0[:]s=0t=0if len(list_0)==1:choosed_data=list_0[0]else:print('检测到【{}】内存在多个{},请选择其中一个进行后续操作:\n\t若{}是以整数命名的,请使用·[整数+]·的格式,如:{}+.'.format(positon,sht_type,sht_type,random.randint(1,9)))while s==0:if t<=3:print('可选{}清单:\n\t{}.'.format(sht_type,list_1))sht_x = input('请输入{}名称或{}位次:'.format(sht_type,sht_type))try:sht_num=int(sht_x)if sht_num<=1 or sht_num=='':sht_num=0choosed_data = list_0[sht_num]s=1else:if sht_num>=len(list_0)+1:print('\t※----下标越界-----------下标越界-----------下标越界----※\n')t+=1else:sht_num-=1s=1choosed_data = list_0[sht_num]except (TypeError,ValueError):if "'" in sht_x:sht_x=sht_x.replace("'",'')else:if sht_x[-1]=='+':sht_x=sht_x[:-1]else:passif sht_x not in list_1:print('\t输入的{}名称不在【{}】内,请核验!\n'.format(sht_type,positon))t+=1else:choosed_data=list_0[list_1 .index(sht_x)]s=1else:s=1print('\n-----*-----您已多次输错{}名称,请核验后重启程序再次尝试!-----*-----\nHint:\n\t①注意审查输入的{}名称是否存在空格\n\t②直接在可选{}清单内复制对应名称'.format(sht_type ,sht_type,sht_type))choosed_data=''if len(choosed_data)>0:if type <=1:if len(list_0)>1:print('\t□······已选{}·[{}].\n'.format(sht_type,choosed_data.replace(file_0,'')))else:print('\t\t□······即将使用{}·[{}]的数据进行后续操作.\n'.format(sht_type, choosed_data.replace(file_0, '')))else:if len(list_0)>1:print('\t□······已选{}·[{}]作为样表写入数据.'.format(sht_type,choosed_data.replace(file_0,'')))else:print('\t□······将使用·[{}]·作为{}写入数据.'.format(choosed_data.replace(file_0, ''),sht_type))time.sleep(0.5)return choosed_data

4.将待拆分的表格放置在一个文件夹【待拆分总表】内,拆分的结果放置在【拆分结果】文件夹内,此外额外设置一个【空样表】文件夹,使得输出的表格按照指定的样式输出;因此此时需要完成以下几个认证工作:
4.1 文件夹的校验工作,即检验是否存在以上文件夹,如无进行自动创建
4.2 待拆分总表/样表的表格是否处于编辑状态验证,如处于编辑状态则需要提示使用者先对其关闭,并设置可在输入界面运行强制关闭的代码;

def check_data_source():f_x = [f_0 + i for i in os.listdir(f_0)]if len(f_x) == 0:print('\n※----※-----------源为空!-----------※----※')ori_data=''else:for i in f_x:  #剔除非xls和处于编辑状态的文件if '~$' in i:print('※----提示-----------数据源文件夹内的[{}]正处于编辑状态!-----------提示----※\n'.format((i.replace('~$', ''))).replace(f_0, ''))f_x.remove(i)else:if '.xls' not in i[-5:]:print('※----提示-----数据源文件夹内的[{}]非本程序支持的.xls或.xlsx格式文件-----提示----※'.format(i.replace(f_0, '')))f_x.remove(i)else:passori_data=choose_from_list(f_x,f_0,'源表','待拆分总表',type=1)return ori_data

5.使用者引入的表格可能为多层级表头,或者表格前面几行为空,此时需要使用者确认使用的表头层级数量和跳空数量

def check_n_level(ori_data,sht_name):level,header=-1,-1d_0 = pd.read_excel(ori_data, header=0, sheet_name=sht_name, keep_default_na=False)q = 0while q == 0:try:level = int(input('【请输入表头层级】※-----------请输入表头层级数:'))k=0if level >= len(d_0):print('\t※----下标越界----------超越理论层级----------下标越界----※\n')header=[]level=''else:if level <0:print('\t输入的格式或内容有误,请重新输入大于等于0的整数!\n')else:if level in [1,0]:level = 1else:passprint('\t□······已锁定·[{}级]·表头.\n'.format(level))header = [i for i in range(level)]q = 1except (ValueError,TypeError):print('\t输入的格式或内容有误,请重新输入大于等于0的整数!\n')return level,header

6.优化可选项在端口的展示方式

def refix_col(col_0,step,diff=''):col_plus = int(len(col_0) % step)c = 1col_x = []for i in range(len(col_0)):if c % step == 0:print('\t{}{}'.format(diff,col_x))col_x = []else:col_x.append(col_0[i])c += 1col_left = col_0[-col_plus - 1:]if col_plus > 0:col_x = []for i in range(len(col_left)):col_x.append(col_left[i])print('\t{}{}'.format(diff,col_x))

7.询问使用者是否使用样表,并进行具体的样式验证

def example_xls_check(header):Use_Yb = 0p = 1yb_xls = ''yb_sht = ''p=0while p == 0:Use_Yb = input('\n【请输入内容】※-----------是否使用样表?(1/0): ')if Use_Yb in ['yes', '1', 'y', 'YES', 'Yes', '是', '']:Use_Yb=1print('\t□······已选[是]:将使用样表作为模板进行拆分写入.')# 判断样表是否符合规范f_z = [f_k + i for i in os.listdir(f_k)]if len(f_z) == 0:print('\t\t※----样表为空,请补充样表!-----※\n')else:yb_xls=choose_from_list(f_z,f_k,'样表','空样表',type=2)if '.xls' not in yb_xls[-5:]:print('\n※----对象错误--------所使用的样表非.xls或.xlsx格式文件,请核验!-------对象错误----※')else:yb_names = pd.ExcelFile(yb_xls).sheet_namesyb_sht=choose_from_list(yb_names,f_k,'样表_子表','已选样表',type=0)try:dz = pd.read_excel(yb_xls, header=header, sheet_name=yb_sht,keep_default_na=False) #col_yb = list(dz.columns)col_over=set(col_yb)-(set(col_yb)&set(col_0))col_less=set(col_0)-(set(col_yb)&set(col_0))if set(col_0) == set(col_yb):p = 1print('\t·············样表验证通过···············√')else:print('\t××××××××××表头不一致,样表验证未通过×××××××××××')if len(col_over)>0:print('\t错误类型:\n\t\t样表表头>待拆分表表头.')else:if len(col_less) > 0:print('\t错误类型:\n\t\t样表表头<待拆分表表头.')except AttributeError:print('\t※----※-------样表的格式设置不受支持!\n\t\t错误类型:\n\t\t\t可读取行数<=选定表头层级.\n\t\t请使用以下方法进行调试:\n\t\t\t①.新建空白表格,将表头复制至新表后设置格式\n\t\t\t②.使用已有表格作为样表的,请保证表头下方至少存在1个数据,如空格-------※----※')else:print('\t□······已选择[否]:将不参照样表格式直接进行拆分.')return Use_Yb,yb_xls,yb_sht

8.字段选择校验函数

def get_col_name(level,ori_data,sht_name):zd_name=''col_s = list(df.columns)wb = app.books.open(ori_data)sht = wb.sheets[sht_name]rng = sht.range('A{}'.format(level)).expand('table')c_0 = rng.columns.countwb.close()app.kill()col_0=col_s[:c_0]step = round(8 / level, 0) + 1print('·可选字段如下:')refix_col(col_0,step)p = 0s=0while p == 0:zd_name = input('\n【请输入内容】※-----多级表头请以··[列表]·或·(元组)··形式输入用于拆分的字段·[字段名称]:')if level==1:if zd_name[0]=="'" or zd_name[-1]=="'":zd_name=zd_name.replace("'",'')else:passelse:passif zd_name !='zd_name':try:zd_name = tuple(eval(zd_name))except (NameError, SyntaxError, TypeError):passif zd_name not in col_0:if ('\\n' in zd_name):  # or ('\t' in zd_name)print('\t※----对象错误---------不支持对含跨行符的非标准表头的拆分---------对象错误----※')else:s+=1if s<=2:print('\t※----对象错误---------无效字段---------对象错误----※')else:print('\t※----对象错误---------无效字段---------对象错误----※')print('\tHint:请注意区分大小写及字段中可能存在的空格和标点符号.')try:e = []if level==1:for j in col_0:if zd_name in j:e.append(j)else:for i in range(level):for j in col_0:if zd_name in j[i]:e.append(j)e = list(set(e))if len(e) == 0:passelse:print('\t※····提示···包含该关键字的可选字段为:')refix_col(e,step,diff='\t')except (NameError, SyntaxError, TypeError):passelse:if len(list(set(list(df[zd_name])))) == 1:print('\t※-----不可拆分------该字段仅有1个可拆分序列,请选择其它可拆分字段-----不可拆分------※')passelse:print('\t··········字段校验通过···········√')p = 1return col_0,zd_name

9.给生成的各个子表设置一个统一的前方名称,注意某些字符不允许出现在excel文件名称内,需要逐个排除

def set_file_name():es = 0sp = 0s_name=''while es == 0:sk=0s_name = input('\n【请输入内容】※-----请输入即将应用至生成文件的规范文件名:')for ep in forbidden_symbol:if ep in s_name:sk+=1if sk>0:print('\t※----命名错误----键入的文件名不符合规范,请重新输入!----命名错误----※')sp+=1if sp>=2:print('\t提示:Excel文件名称不可包含以下字符:\n\t\t{}'.format(forbidden_symbol))else:es=1print('\t※-----文件名验证通过······√')time.sleep(1)print('\t······表格拆分开始······')if len(s_name)>0:s_name += '_'else:passreturn s_name

10.写入样表的函数

def write_to_yb(df,level,zd_name,yb_xls,yb_sht,s_name):t_0 = time.time()app = xw.App(visible=False, add_book=False)app.display_alerts = Falseapp.screen_updating = Falsetarget = list(set(list(df[zd_name])))for qs in tqdm.trange(len(target)):i = target[qs]time.sleep(0.25)ds = df.loc[df[zd_name] == i].copy()if str(i).strip() == '':i = '空白'else:for ep in forbidden_symbol:if ep in str(i):i = eval(repr(str(i)).replace(ep, '@'))else:i = str(i).strip()wb = app.books.open(yb_xls)sht = wb.sheets[yb_sht]sht.range('A{}'.format(level + 1)).options(transpose=False).value = ds.values.tolist()wb.save(f_s + s_name+str(i) + '.xlsx')app.kill()t_1 = time.time()print('\n √·······拆分完成!·······用时{}s,合计生成{}个子表·······※'.format(round(t_1 - t_0, 2), len(list(set(list(df[zd_name]))))))

11.写入空表的函数

def write_to_null(df,level,zd_name,s_name):t_0 = time.time()target = list(set(list(df[zd_name])))for qs in tqdm.trange(len(target)):i = target[qs]time.sleep(0.25)ds = df.loc[df[zd_name] == i].copy()if str(i).strip() == '':i = '空白'else:for ep in forbidden_symbol:if ep in str(i):i = eval(repr(str(i)).replace(ep, '@'))else:i = str(i).strip()if level == 1:ds.to_excel(f_s +s_name+ str(i) + '.xlsx', index=False)else:ex = app.books.add()st=ex.sheets[0]st.range('A1').options(transpose=True).value = ds.columns.tolist()  #.options(transpose=False)st.range('A{}'.format(level + 1)).options(transpose=False).value = ds.values.tolist()ex.save(f_s + s_name+str(i) + '.xlsx')ex.close()t_1 = time.time()print('\n √·······拆分完成!·······用时{}s,合计生成{}个子表·······※'.format(round(t_1 - t_0, 2), len(list(set(list(df[zd_name]))))))

12.将以上代码封装成exe格式后就可以给任意人员进行使用了,使用过程中会提供各种保姆式提示,按照提示进行逐步输入参数即可.

运行效果展示


程序存在的不足

1.读取较大的excel时会出现前期读取时间过长的问题,需要进一步优化
2.对非标准表头格式的支持一般

【Python】-表格拆分工具相关推荐

  1. python表格处理工具_python 操作excel表格的方法

    说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...

  2. Excel表格拆分成多个表格,蜂鸟转换帮您快捷拆分

    Excel表格是用来整理数据使用的,很多办公族会在表格下存储很多数据,当表格中的数据比较多时,想要将表格数据分开整理时,大家可以新建表格,将就表格中的部分数据复制到新建表格中,同时也可以将一个表格拆分 ...

  3. 80行代码自己动手用python写一个表格拆分与合并小工具

    大家好,我是才哥. 可能是最近加班熬夜太多,这个周末身体不舒服,头痛.冷汗什么的.终于在连着睡了接近2天后,现在慢慢恢复了. 最近有新朋友看到之前<>,想问下有没有免费的小工具,可以进行表 ...

  4. 80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 瑶池阿母绮窗开,黄竹歌声动地哀. ...

  5. excel拆分工具怎么拆分表格?

    今天小编跟大家分享一下excel拆分工具怎么拆分表格? 1.首先我们打开excel文件,接着点击如下图选项 2.接着鼠标单击[汇总拆分] 3.选择[拆分工作表] 4.然后我们要处理的表格标题行数为2, ...

  6. 用Python把它做出来:EXCEL文件合并/拆分工具 (含VBA版)

    前言: 大家好,这里是Seon塞翁.当你收集了 n 个人的 EXCEL 记录表,需要将它们汇成一个总表时你会怎么做呢?如果不通过技术手段,要一个个打开再复制粘贴也太麻烦了吧!此时就需要一个通过几秒钟的 ...

  7. 产品狗的Python之路(1):按照行数将excel表格拆分成多个

    产品狗的Python之路 (1):使用python将excel表格拆分成多个 背景: 因公司内部数据导入系统限制每一次导入的数据行数,故经常需要将一个几万行的表格拆分成多个,费事费力,所以写了一个小程 ...

  8. 产品狗的Python之路(2):excel表格拆分桌面小程序

    产品狗的Python之路(2):excel表格拆分程序 使用tkinter将excel表格拆分脚本制作了GUI,并使用pyinstaller封装成了桌面程序 import tkinter as tk ...

  9. python对图片中的表格拆分

    python对图片中的表格拆分 背景:为了对图片中的表格进行ocr识别,如果直接识别效果较差,所以将表格拆分成小块一个个识别,然后再拼成表格即可. 拆分规则的表格: import cv2 import ...

最新文章

  1. OpenVAS漏洞扫描
  2. Linux 搭建SVN 服务器
  3. 家用计算机内存最大是多少,电脑支持最大内存是多少?选用多大内存才合理?方法技巧要知道...
  4. vi/vim 使用
  5. C语言实现珠排序bead sort算法(附完整源码)
  6. springboot事物注解不生效_SpringBoot攻略三、配置文件说明
  7. 同事就是同事,职场没有兄弟姐妹
  8. ABB RAPID 程序 WorldZone 归纳
  9. UFT开发实例:QTP调用OutLook自动发送邮件
  10. 9:23 2009-7-23
  11. 浏览器渲染原理 记录备份
  12. [转]软件企业的新三十六计
  13. 地统计之检查空间自相关
  14. CrossOver让你在M1Mac计算机运行Windows应用程序
  15. python 爬虫 简单爬虫教程(requests + selenium )
  16. 函数极限什么时候可以拆分
  17. 60个平移过渡预设PR合集
  18. 多路选择器MUX总结-IC学习笔记(八)
  19. 源生代码封装轮播效果
  20. python运行窗口闪退_python+selenium自动化测试,IE浏览器运行过程中出现闪退

热门文章

  1. go语言html模板,Go语言的HTML模板(多值替换)
  2. 科汛CMS Access 自助升级到 Sql Server 版
  3. Errors during downloading metadata for repository ‘docker-ce-stable‘
  4. 如何使用spflashtool备份mtk rom
  5. 利用R,G,B三通道对图像分别生成mask并叠加,最终得到背景和书两种区域
  6. optimize求解非线性方程组求解
  7. 微电影广告的内容突破方案
  8. 结对编程作业二——必应缤纷桌面软件测试报告——10061191洪虹10061162刘俊伟
  9. 入门指南:菜鸟如何学习数据分析?
  10. (七)CDA 数据分析师Level1考试新版大纲解析(自己整理)PART 7 业务分析报告与数据可视化报表