使用Python與openpyxl進行表格處理(一)——讀取資料
雖然現在的工作跟程式設計已經沒有關係,但是曾經學過的東西也可以為我所用,運用到自己的目前工作崗位中,提高工作效率。
這篇要講到的就是如何利用Python與openpyxl結合來處理xlsx表格資料。Python處理表格的庫有很多,這裡的openpyxl就是其中之一,但是它是處理excel2007/2010的格式,也就是xlsx系列,如果要處理以前的2003的表格(xls),那麼則要用另外的庫。如果只是要進行表格資料讀取和進行簡單的寫資料的話,推薦使用openpyxl。下篇會介紹到另外一個操作表格文件的庫,叫做xlsxwriter,這是一個專門寫表格的庫,在寫資料和進行表格畫圖方面比較強大(不能讀取和修改表格),因為這次分析資料最後需要進行繪圖展示(openpyxl雖然也能作圖,但是功能有限),所以也會用到這個庫。
更多關於Python操作excel的庫,請參考這個網站
對於學習openpyxl,參考官方文件基本就夠了,另外也找到一個比較好的學習文章,一個老外寫的,看完操作openpyxl就不難了——教程請猛擊這裡
介紹下自己需要處理的表格情況,這是一個關於酬金的表格,每月都有,它的格式都是固定的,所以完全可以利用Python寫一個指令碼,來實現自己的需求,這樣一來,每月只需敲擊一個命令列,就能生成自己想要的表格,節約不少時間!~因為酬金分為很多大項,大項中又有很多小項,而我要做的就是把大項中的小項進行金額彙總,然後在寫入一個新的表格,表格中是每個大項彙總的資料,以此生成我們需要進行繪圖的資料。
這裡直接貼上原始碼,因為可能涉及敏感資訊,故有XXXX出現以代替原始註釋,圖片還有馬賽克出現:
from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook("C:/Users/Administrator/Desktop/酬金.xlsx")
ws = wb.get_sheet_by_name('酬金明細')
ws_rows_len = len(ws.rows) #行數
ws_columns_len = len(ws.columns) #列數
#xxxxxxx
shop_name_column = 5
#xxxxx
user_start = 8
user_end = 23
#xxxxx
terminal_start = 24
terminal_end = 35
#xxxxx
infomation_start = 36
infomation_end = 42
#xxxx
group_start = 43
group_end = 45
#xxxx
commission_start = 46
commission_end = 60
#xxxx
stimulate_start = 61
stimulate_end = 65
#xxxx
net_start = 66
net_end = 67
#xxxxxxx
agreement_start = 68
agreement_end = 70
#資料有效行從第四行開始
start_row = 4
temp_data = []
for row in range(start_row, ws_rows_len+1):
t = 0
temp_data.append(ws.cell(row=row,column=shop_name_column).value)
#計算xxxxxx總金額
for column in range(user_start,user_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxx總金額
for column in range(terminal_start,terminal_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxx發展總金額
for column in range(infomation_start,infomation_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxx總金額
for column in range(group_start,group_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxxx總金額
for column in range(commission_start,commission_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxxx總金額
for column in range(stimulate_start,stimulate_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxxx總金額
for column in range(net_start,net_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
t = 0
#計算xxxxxxxx總金額
for column in range(agreement_start,agreement_end+1):
t += ws.cell(row=row,column=column).value
temp_data.append(t)
#以上程式碼為獲取酬金原始資料進行彙總
#下面將彙總得到的資料插入到一個新的資料表中
reward_ws_hearder = ['xxxx','xxxxx','xxxx','xxxxx','xxxxxx','xxxx','xxxx','xxxx','xxxx']
reward_ws = wb.create_sheet(title='酬金分析')
reward_ws.append(reward_ws_hearder)
start_list = 0
list_step = 9
end_list = start_list + list_step
for i in range(0,ws_rows_len-start_row+1):
reward_ws.append(temp_data[start_list:end_list])
start_list += list_step
end_list = start_list + list_step
wb.save("C:/Users/Administrator/Desktop/酬金1.xlsx") #另存為另一個表,防止意外破壞原始資料。
程式碼寫得有點亂,僅供學習openpyxl參考。通過上述的程式碼,實現了一個新表存放了彙總的資料(原始資料有很多列,現在彙總到一起了)
被馬賽克塗抹的左邊A列是名稱,首行則是業務列別。可見資料則是彙總金額。如果我不用指令碼處理的話,每次利用excel進行手動操作,那麼需要對每個大項的小項進行彙總,然後用手動貼上到一個新表中(自己的EXCEL不是很熟,然後對每一行都要進行一個繪圖操作,算下來花的時間很多哦)而現在,只是花了時間寫了一段程式碼,然後以後的以後,只要表格格式不變,我只需要執行py檔案即可!~花的時間就1s吧。
下篇會介紹xlsxwriter這個庫,因為我寫到這裡的時候想用openpyxl來進行繪圖,發現openpyxl實現不了自己的需求,於是找到了這個寫資料和畫圖都很強的xlsxwriter!而且文件也更加完善,有很多例子!!!
通過這次這個例子,自己以後也會更加學習如何善於發現,善於思考,如何運用自己以前所學的知識將它運用新的崗位上。