Python自動化處理Excel表格實(shí)戰(zhàn)完整代碼分享(課表解析)
今天不做展開式講解,就分享春節(jié)期間接的Python單子,將原始課程總表按照指定格式輸出。
目錄:
1. 需求
2.?代碼

1. 需求



輸入:就是以下課程總表
周一到周五,不同班級上午和下午的課程+任課老師排班

輸出1:各班級課程表
各班級周一到周五全部課程科目

輸出2:各老師課程表
各老師周一到周五歸屬不同班級的課程安排

除了上述輸出外,因需要打包成工具軟件,軟件啟動時需要輸入賬號和密碼才能運(yùn)行,這里是寫進(jìn)程序代碼里的賬號和密碼哈!

2. 代碼



完整代碼附上,大家可以直接運(yùn)行。
當(dāng)然,最好先安裝好相關(guān)第三方庫哈!
請?jiān)诠娞枴竞喺f編程】后臺回復(fù) 資源?領(lǐng)取案例數(shù)據(jù),
該數(shù)據(jù)中涉及姓名均由faker庫隨機(jī)生成!
import?PySimpleGUI?as?sg
import?sys
import?pandas?as?pd
from?openpyxl?import?Workbook
from?openpyxl.styles?import?Font,?Alignment
import?os
import?warnings
warnings.filterwarnings('ignore')
#?讀取課程表原始數(shù)據(jù)
def?get_data(fileName):
????df?=?pd.read_excel(fileName,?header=[1,2,3])
????data?=?df.melt(id_vars=df.columns[:1].to_list())
????data.columns?=?['班級','星期','上下午','第N節(jié)課','課程_老師']
????#?data['課程_老師']?=?data['課程_老師'].apply(lambda?s:re.sub('上|必須|走.*','',s))
????data['課程']?=?data['課程_老師'].apply(lambda?s:?s?if?'上'?in?s?else?s[:2])
????data['老師']?=?data['課程_老師'].apply(lambda?s:?''?if?'上'?in?s?else?s[2:]).str.strip().replace('','無')
????data['星期']?=?data['星期'].str.strip()
????#?data['課程路徑']?=?data['班級'].astype('str')?+?'班\n'?+?data['課程']
????
????return?data
#?解析班級課表并保存
def?get_class(data,path):
????wb?=?Workbook()
????ws?=?wb.active
????#?按班級
????for?i?in?data['班級'].unique():
????????result?=?data.query(f'班級=={i}').pivot(index=['第N節(jié)課'],columns='星期',values='課程')
????????result?=?result[['星期一',?'星期二',?'星期三',?'星期四',?'星期五']]
????????result.index?=?result.index.map(lambda?x:?f'第{x}節(jié)')
????????result.index.name?=?''
????????result.reset_index(inplace=True)
????????result?=?result.append(pd.Series({'':'第8節(jié)',?'星期一':'班/安'}),ignore_index=True)
????????#?文件名
????????filename?=?r'按班級課程表.xlsx'
????????name?=?f'{i}班'
????????filepath?=?path?+?'/'?+?filename
????????#?構(gòu)建excel表格內(nèi)容
????????title?=?f'課程表??{name}'
????????value_list?=?[[title]]
????????
????????value_list.append(result.columns.to_list())
????????temp?=?result.values.tolist()
????????temp.insert(4,[])
????????value_list.extend(temp)
????????
????????#?寫入數(shù)據(jù)
????????for?row?in?value_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)
#?解析老師課表并保存
def?get_teacher(data,path):
????wb?=?Workbook()
????ws?=?wb.active
????#?按老師
????for?n,i?in?enumerate(data['老師'].unique()):
????????try:
????????????result?=?data.query(f'老師=="{i}"').pivot(index=['第N節(jié)課'],columns='星期',values='班級')
????????except:
????????????continue
????????#?補(bǔ)全星期
????????weekdays?=?['星期一',?'星期二',?'星期三',?'星期四',?'星期五']
????????for?week?in?weekdays:
????????????if?week?not?in?result.columns:
????????????????result[week]?=?''
????????result?=?result[weekdays]
????????#?補(bǔ)全課時
????????indexs?=?range(1,8)
????????for?index?in?indexs:
????????????if?index?not?in?result.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
????????#?構(gòu)建excel表格內(nèi)容
????????value_list?=?[]
????????title1?=?'任課教師'
????????title2?=?i
????????title3?=?'學(xué)科'
????????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)
????????
????????#?寫入數(shù)據(jù)
????????for?row?in?range((n//4)*14+1,?(n//4+1)*14+1):????????
????????????for?col?in?range(n%4*7+1,?n%4*7+7):
????????????????if?row?==?(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)??
?????
#?構(gòu)建GUI
layout_login?=?[[sg.Text('賬號:'),sg.Input(key='account_id')],
????????????????[sg.Text('密碼:'),sg.Input(password_char='*',?key='password')],
????????????????[sg.Button('??????確定??????'),?sg.Button('??????關(guān)閉??????')]
????????????????]
w?=?sg.Window('請輸入賬號密碼',?layout=layout_login)
while?True:
????event,?values?=?w.read()
????if?event?in?(None,?'??????關(guān)閉??????'):
????????sys.exit('程序關(guān)閉')
????#?判斷賬號密碼
????elif?values['account_id']?==?'admin'?and?values['password']?==?'admin':
????????break
????else:
????????sg.popup('賬號密碼不正確')
w.close()
layout?=?[[sg.Text('選擇課程表原始文件')],?[sg.Input(key='fileName',enable_events=True),?sg.FileBrowse('打開',file_types=(("Text?Files",?"*.xls*"),))],
??????????[sg.Text('選擇解析結(jié)果存儲地址')],?[sg.Input(key='path',enable_events=True),?sg.FolderBrowse('瀏覽')],
??????????[sg.Text('程序操作記錄:',justification='center')],
??????????[sg.Output(size=(50,?8))],
??????????[sg.Button('???開始處理???'),?sg.Button('??????關(guān)閉??????')]]
window?=?sg.Window('課程表解析工具',?layout)
while?True:
????event,?values?=?window.read()
????if?event?in?(None,?'??????關(guān)閉??????'):
????????break
????if?event?==?'???開始處理???':
????????fileName?=?values['fileName']
????????path?=?values['path']
????????if?os.path.exists(fileName)?and?os.path.exists(path):
????????????data?=?get_data(fileName)
????????????get_class(data,path)
????????????print('按班級課程表已經(jīng)保存完畢..')
????????????get_teacher(data,path)
????????????print('按教師課程表已經(jīng)保存完畢..')
????????else:
????????????sg.popup('請選擇正確的待處理文件及保存路徑')
window.close()
以上就是本次全部內(nèi)容,沒有過多的講解,大家自己研究代碼加深學(xué)習(xí)哈!
當(dāng)然,代碼只是實(shí)現(xiàn)功能,有很多可以迭代優(yōu)化的地方,就交給親愛的你啦~
歡迎掃碼與我交流
那么下期見,我是愛貓愛技術(shù),更愛思思的老表???( ˙?˙ )???
近期閱讀學(xué)習(xí)推薦:
情人節(jié)Github開源項(xiàng)目大“賞”,花樣表白她!
如何找到我:
評論
圖片
表情
