上一篇告別單調(diào)工作系列——利用python拯救漂亮妹子中「拯救」了漂亮妹子之后,原本以為事情告一段落,哪知道......
起因
記得幫妹子搞定自動提交表單之后的第三天,妹子端著奶茶樂呵呵的來找我,和我一番暢談理想,又指點江山之后,終于切入了正題。
大致的意思就是通過excel自動提交表單數(shù)據(jù)你幫我搞定了,你好厲害,現(xiàn)在整理excel的工作我也不是很想做,你有沒有辦法幫我搞定,搞定之后不會虧待你的,奶茶一定雙手奉上。
碰到這樣的事情其實我的內(nèi)心是拒絕的,這明顯有點‘貪得無厭’,不知道什么叫見好就收嗎?
可是,誰叫人家妹子長得漂亮呢,嘴巴又甜,被她這么忽悠了幾下,習(xí)慣性的開始調(diào)研起需求來了,哎,這職業(yè)習(xí)慣得改改。
經(jīng)過
聊了十幾分鐘之后,大致了解了需求,其實就是有幾個部門每天會發(fā)來固定的excel,她需要根據(jù)一定的要求整理匯總,有問題的數(shù)據(jù)聯(lián)系對應(yīng)的人去處理,沒有問題的數(shù)據(jù)再錄入到系統(tǒng)。
要了excel模板和具體的整理規(guī)則之后,漂亮妹子樂呵呵的走了,我有點后悔,又要犧牲自己的下班時間了,哎,好人難做啊。
理了下思路,其實解決這個需求不是很難。
首先先約定好規(guī)則,包括excel的命名,存放路徑,excel格式等。其中excel命名和格式已經(jīng)是固定的,不用操太多心。
但存放路徑不定,基本上都是通過郵件來溝通的,原本想去遍歷郵件去獲取附件的,但考慮到無法判斷哪份excel是最終版,所以這一步就算了,讓業(yè)務(wù)自行判斷后放到統(tǒng)一的路徑下。
接下來就是遍歷指定路徑下的excel,根據(jù)業(yè)務(wù)給的數(shù)據(jù)規(guī)則進行整合,整合之后生成一個目標(biāo)excel,一份是正確的數(shù)據(jù),還一份是異常數(shù)據(jù)。
所用到的python模板基本上也是自帶的,加上操作Excel的xlrd
,xlwt
。
python操作excel
面對這樣的需求,正好也讓自己復(fù)習(xí)鞏固下python操作excel的幾個模板,記錄下來,供大家參考。
操作excel我主要用xlrd
,xlwt
,XlsxWriter
這三個模塊,基本可以解決我遇到的所有需求。
xlrd
模塊只支持讀取excel,不管是.xls
的還是.xlsx
的,可以看個簡單的demo:
import xlrd
rd = xlrd.open_workbook("test.xls") #讀取文件
sheets = rd.sheet_names() #獲取所有sheet名
table = rd.sheet_by_name("sheet1") #通過sheet名獲取名為 sheet1 的表
#遍歷excel,打印出第一列
for i in range(table.nrows):
print(excelData.col_values(0)[i])
xlwt
和XlsxWriter
模塊,只支持寫excel操作,兩者各有優(yōu)缺點,相對來說XlsxWriter
不管從功能上還是性能上都略勝與xlwt
,尤其是在支持大文件寫入方面,如果數(shù)據(jù)量非常大,可以啟用constant memory
模式,這是一種順序?qū)懭肽J剑玫揭恍袛?shù)據(jù)就立刻寫入一行,而不會把所有的數(shù)據(jù)都保持在內(nèi)存中。
網(wǎng)上有一篇Python Excel技術(shù)比較,大家可以看下,講的比較詳細(xì),各模塊的優(yōu)缺點。
至于寫法,其實兩者差不多,直接看下官方文檔即可,這里以xlwt
舉例:
import xlwt
# 創(chuàng)建一個workbook 設(shè)置編碼
workbook = xlwt.Workbook(encoding = 'utf-8')
# 創(chuàng)建一個worksheet
worksheet = workbook.add_sheet('Worksheet1')
# 寫入excel
# 參數(shù)對應(yīng) 行, 列, 值
worksheet.write(1,0, label = 'test')
style = xlwt.XFStyle() # 初始化樣式
font = xlwt.Font() # 為樣式創(chuàng)建字體
font.name = 'Times New Roman'
font.bold = True # 黑體
font.underline = True # 下劃線
font.italic = True # 斜體字
style.font = font # 設(shè)定樣式
worksheet.write(2, 0, 'Unformatted value') # 不帶樣式的寫入
worksheet.write(3, 0, 'Formatted value', style) # 帶樣式的寫入
# 設(shè)置單元格寬度
worksheet.col(0).width = 3333
# 輸入日期
style = xlwt.XFStyle()
style.num_format_str = 'M/D/YY' # Other options: D-MMM-YY, D-MMM, MMM-YY, h:mm, h:mm:ss, h:mm, h:mm:ss, M/D/YY h:mm, mm:ss, [h]:mm:ss, mm:ss.0
worksheet.write(4, 0, datetime.datetime.now(), style)
#添加公式
worksheet.write(5, 0, 5) # Outputs 5
worksheet.write(5, 1, 2) # Outputs 2
worksheet.write(6, 0, xlwt.Formula('A5*B5'))
worksheet.write(1, 1, xlwt.Formula('SUM(A5,B5)'))
#添加超鏈接
worksheet.write(7, 0, xlwt.Formula('HYPERLINK("http://www.google.com";"Google")'))
# 保存
workbook.save('test.xls')
后記
終于利用下班時間將這個需求搞定了,妹子很開心,但隱隱覺得沒有達到她想要的,也許過幾天,妹子又會樂呵呵的端著奶茶來找我了......