1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python自动化处理Excel表格实战完整代码分享(课表解析)

Python自动化处理Excel表格实战完整代码分享(课表解析)

时间:2023-10-26 23:22:53

相关推荐

Python自动化处理Excel表格实战完整代码分享(课表解析)

今天不做展开式讲解,就分享春节期间接的Python单子,将原始课程总表按照指定格式输出。

目录:

1. 需求

2. 代码

1. 需求

输入:就是以下课程总表

周一到周五,不同班级上午和下午的课程+任课老师排班

课程总表

输出1:各班级课程表

各班级周一到周五全部课程科目

班级课程表

输出2:各老师课程表

各老师周一到周五归属不同班级的课程安排

老师课表

除了上述输出外,因需要打包成工具软件,软件启动时需要输入账号和密码才能运行,这里是写进程序代码里的账号和密码哈!

2. 代码

完整代码附上,大家可以直接运行。

当然,最好先安装好相关第三方库哈!

请在公众号【Python工程师】后台回复课表领取案例数据

该数据中涉及姓名均由faker库随机生成!

importPySimpleGUIassgimportsysimportpandasaspdfromopenpyxlimportWorkbookfromopenpyxl.stylesimportFont,Alignmentimportosimportwarningswarnings.filterwarnings('ignore')#读取课程表原始数据defget_data(fileName):df=pd.read_excel(fileName,header=[1,2,3])data=df.melt(id_vars=df.columns[:1].to_list())data.columns=['班级','星期','上下午','第N节课','课程_老师']#data['课程_老师']=data['课程_老师'].apply(lambdas:re.sub('上|必须|走.*','',s))data['课程']=data['课程_老师'].apply(lambdas:sif'上'inselses[:2])data['老师']=data['课程_老师'].apply(lambdas:''if'上'inselses[2:]).str.strip().replace('','无')data['星期']=data['星期'].str.strip()#data['课程路径']=data['班级'].astype('str')+'班\n'+data['课程']returndata#解析班级课表并保存defget_class(data,path):wb=Workbook()ws=wb.active#按班级foriindata['班级'].unique():result=data.query(f'班级=={i}').pivot(index=['第N节课'],columns='星期',values='课程')result=result[['星期一','星期二','星期三','星期四','星期五']]result.index=result.index.map(lambdax:f'第{x}节')result.index.name=''result.reset_index(inplace=True)result=result.append(pd.Series({'':'第8节','星期一':'班/安'}),ignore_index=True)#文件名filename=r'按班级课程表.xlsx'name=f'{i}班'filepath=path+'/'+filename#构建excel表格内容title=f'课程表{name}'value_list=[[title]]value_list.append(result.columns.to_list())temp=result.values.tolist()temp.insert(4,[])value_list.extend(temp)#写入数据forrowinvalue_list:ws.append(row)#合并单元格ws.merge_cells(f'A{(i-1)*11+1}:F{(i-1)*11+1}')cell=ws[f'A{(i-1)*11+1}']cell.font=Font(bold=True)cell.alignment=Alignment(horizontal='center')print(f'{name}的课表已生成')wb.save(filepath)#解析老师课表并保存defget_teacher(data,path):wb=Workbook()ws=wb.active#按老师forn,iinenumerate(data['老师'].unique()):try:result=data.query(f'老师=="{i}"').pivot(index=['第N节课'],columns='星期',values='班级')except:continue#补全星期weekdays=['星期一','星期二','星期三','星期四','星期五']forweekinweekdays:ifweeknotinresult.columns:result[week]=''result=result[weekdays]#补全课时indexs=range(1,8)forindexinindexs:ifindexnotinresult.index:result.loc[index,:]=''result.sort_index(inplace=True)result.index.name=''result.loc[8,:]=''result.reset_index(inplace=True)#文件名称filename=r'按老师课程表.xlsx'name=f'{i}'filepath=path+'/'+filename#构建excel表格内容value_list=[]title1='任课教师'title2=ititle3='学科'title4=data.query(f'老师=="{i}"')['课程'].unique()[0]title=[[title1,'',title2,'',title3,title4],[]]value_list.extend(title)value_list.append(result.columns.to_list())temp=result.values.tolist()temp.insert(4,[])value_list.extend(temp)#写入数据forrowinrange((n//4)*14+1,(n//4+1)*14+1):forcolinrange(n%4*7+1,n%4*7+7):ifrow==(n//4)*14+1:a=ws.cell(row=row,column=col)a.font=Font(bold=True)else:a=ws.cell(row=row,column=col)a.alignment=Alignment(horizontal="center")try:ws.cell(row=row,column=col,value=value_list[row-14*(n//4)-1][col-7*(n%4)-1])except:ws.cell(row=row,column=col,value='')print(f'{name}老师的课表已生成')wb.save(filepath)#构建GUIlayout_login=[[sg.Text('账号:'),sg.Input(key='account_id')],[sg.Text('密码:'),sg.Input(password_char='*',key='password')],[sg.Button('确定'),sg.Button('关闭')]]w=sg.Window('请输入账号密码',layout=layout_login)whileTrue:event,values=w.read()ifeventin(None,'关闭'):sys.exit('程序关闭')#判断账号密码elifvalues['account_id']=='admin'andvalues['password']=='admin':breakelse:sg.popup('账号密码不正确')w.close()layout=[[sg.Text('选择课程表原始文件')],[sg.Input(key='fileName',enable_events=True),sg.FileBrowse('打开',file_types=(("TextFiles","*.xls*"),))],[sg.Text('选择解析结果存储地址')],[sg.Input(key='path',enable_events=True),sg.FolderBrowse('浏览')],[sg.Text('程序操作记录:',justification='center')],[sg.Output(size=(50,8))],[sg.Button('开始处理'),sg.Button('关闭')]]window=sg.Window('课程表解析工具',layout)whileTrue:event,values=window.read()ifeventin(None,'关闭'):breakifevent=='开始处理':fileName=values['fileName']path=values['path']ifos.path.exists(fileName)andos.path.exists(path):data=get_data(fileName)get_class(data,path)print('按班级课程表已经保存完毕..')get_teacher(data,path)print('按教师课程表已经保存完毕..')else:sg.popup('请选择正确的待处理文件及保存路径')window.close()

以上就是本次全部内容,没有过多的讲解,大家自己研究代码加深学习哈!

当然,代码只是实现功能,有很多可以迭代优化的地方,就交给亲爱的你啦~

欢迎扫码与我交流

朋友圈经常有点赞送书,发红包等活动

欢迎来围观

- EOF -

推荐阅读点击标题可跳转

1、10行python代码做出哪些酷炫的事情?

2、20行代码,如何用Python将 “妹子图” 制成好玩儿的gif动态图?

3、Pandas vs SQL

觉得本文对你有帮助?请分享给更多人

点赞和在看就是最大的支持❤️

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。