最近在做一些數(shù)據(jù)處理和計(jì)算的工作词爬,因?yàn)閿?shù)據(jù)是以.CSV格式保存的秃嗜,因此剛開始直接用Excel來處理。
但是做著做著發(fā)現(xiàn)重復(fù)的勞動,其實(shí)并沒有多大的意義锅锨,于是就想著寫個小工具幫著處理叽赊。
以前正好在一本書上看到過,使用Python來處理Excel表格必搞,可惜沒有仔細(xì)看必指。
于是我到處查找資料,基本解決了日常所需恕洲,終于算是完成了任務(wù)塔橡,因此撰寫此文就算是總結(jié)吧,主要記錄使用過程的常見問題及解決霜第。
Python操作Excel葛家,主要用到xlrd和xlwt這兩個庫,即xlrd是讀Excel泌类,xlwt是寫Excel的庫癞谒。
可從這里下載https://pypi.python.org/pypi。下面分別記錄Python讀和寫Excel刃榨。
一
Python寫Excel——xlwt
Python寫Excel的難點(diǎn)弹砚,不在構(gòu)造一個Workbook的本身,而是填充的數(shù)據(jù)枢希,不過這不在范圍內(nèi)桌吃。
在寫Excel的操作中,也有棘手的問題晴玖,比如寫入合并的單元格读存,就是比較麻煩的,另外寫入還有不同的樣式呕屎。
詳細(xì)代碼如下:
importxlwt
#設(shè)置表格樣式
def?set_style(name,height,bold=False):
????style?=?xlwt.XFStyle()
????font?=?xlwt.Font()
????font.name?=?name
????font.bold?=?bold
????font.color_index?=?4
????font.height?=?height
????style.font?=?font
????return?style
#寫Excel
def?write_excel():
????f?=?xlwt.Workbook()
????sheet1?=?f.add_sheet('學(xué)生',cell_overwrite_ok=True)
????row0?=?["姓名","年齡","出生日期","愛好"]
????colum0?=?["張三","李四","戀習(xí)Python","小明","小紅","無名"]
????#寫第一行
????for?i?in?range(0,len(row0)):
????????sheet1.write(0,i,row0[i],set_style('Times?New?Roman',220,True))
????#寫第一列
????for?i?in?range(0,len(colum0)):
????????sheet1.write(i+1,0,colum0[i],set_style('Times?New?Roman',220,True))
????sheet1.write(1,3,'2006/12/12')
????sheet1.write_merge(6,6,1,3,'未知')#合并行單元格
????sheet1.write_merge(1,2,3,3,'打游戲')#合并列單元格
????sheet1.write_merge(4,5,3,3,'打籃球')
????f.save('test.xls')
if?__name__?==?'__main__':
????write_excel()
結(jié)果圖:
在此让簿,對write_merge()的用法稍作解釋,如上述:sheet1.write_merge(1,2,3,3,'打游戲')秀睛,即在四列合并第2,3列尔当,合并后的單元格內(nèi)容為"合計(jì)",并設(shè)置了style蹂安。其中椭迎,里面所有的參數(shù)都是以0開始計(jì)算的。
二
Python讀Excel——xlrd
Python讀取Excel表格田盈,相比xlwt來說畜号,xlrd提供的接口比較多,但過程也有幾個比較麻煩的問題允瞧,比如讀取日期简软、讀合并單元格內(nèi)容蛮拔。
下面先看看基本的操作:
(圖表數(shù)據(jù))
整體思路為,打開文件痹升,選定表格建炫,讀取行列內(nèi)容,讀取表格內(nèi)數(shù)據(jù)
詳細(xì)代碼如下:
importxlrd
fromdatetimeimportdate,datetime
file?='test3.xlsx'
def?read_excel():
wb?=?xlrd.open_workbook(filename=file)#打開文件
????print(wb.sheet_names())#獲取所有表格名字
????sheet1?=?wb.sheet_by_index(0)#通過索引獲取表格
????sheet2?=?wb.sheet_by_name('年級')#通過名字獲取表格
????print(sheet1,sheet2)
????print(sheet1.name,sheet1.nrows,sheet1.ncols)
????rows?=?sheet1.row_values(2)#獲取行內(nèi)容
????cols?=?sheet1.col_values(3)#獲取列內(nèi)容
????print(rows)
????print(cols)
????print(sheet1.cell(1,0).value)#獲取表格里的內(nèi)容疼蛾,三種方式
????print(sheet1.cell_value(1,0))
????print(sheet1.row(1)[0].value)
運(yùn)行結(jié)果如下:
那么問題來了肛跌,上面的運(yùn)行結(jié)果中紅框框中的字段明明是出生日期,可顯示的確實(shí)浮點(diǎn)數(shù)察郁;同時合并單元格里面應(yīng)該是有內(nèi)容的衍慎,結(jié)果不能為空。
別急绳锅,我們來一一解決這兩個問題:
1.Python讀取Excel中單元格內(nèi)容為日期的方式
Python讀取Excel中單元格的內(nèi)容返回的有5種類型西饵,即上面例子中的ctype:
ctype : ?0 empty,1 string鳞芙,2 number, 3 date期虾,4 boolean原朝,5 error
即date的ctype=3,這時需要使用xlrd的xldate_as_tuple來處理為date格式镶苞,先判斷表格的ctype=3時xldate才能開始操作喳坠。
詳細(xì)代碼如下:
importxlrd
fromdatetimeimportdate,datetime
print(sheet1.cell(1,2).ctype)
date_value?=?xlrd.xldate_as_tuple(sheet1.cell_value(1,2),wb.datemode)
print(date_value)
print(date(*date_value[:3]))
print(date(*date_value[:3]).strftime('%Y/%m/%d'))
運(yùn)行結(jié)果如下:
2.獲取合并單元格的內(nèi)容
在操作之前,先介紹一下merged_cells()用法茂蚓,merged_cells返回的這四個參數(shù)的含義是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一樣壕鹉,即(1, 3, 4, 5)的含義是:第1到2行(不包括3)合并,(7, 8, 2, 5)的含義是:第2到4列合并聋涨。
詳細(xì)代碼如下:
print(sheet1.merged_cells)
print(sheet1.cell_value(1,3))
print(sheet1.cell_value(4,3))
print(sheet1.cell_value(6,1))
運(yùn)行結(jié)果如下:
發(fā)現(xiàn)規(guī)律了沒晾浴?是的,獲取merge_cells返回的row和col低位的索引即可牍白!?于是可以這樣批量獲燃够恕:
詳細(xì)代碼如下:
merge=?[]
print(sheet1.merged_cells)
for(rlow,rhigh,clow,chigh)insheet1.merged_cells:
merge.append([rlow,clow])
forindexinmerge:
print(sheet1.cell_value(index[0],index[1]))
運(yùn)行結(jié)果跟上圖一樣,如下:
Python讀寫Excel表格茂腥,就是這么簡單粗暴又好用狸涌,如果覺得不錯,對你工作中有幫助最岗,動動手指分享給更多人哦帕胆。
好了,本文就給大伙分享到這里般渡,文末分享一波福利
獲取方式:加python群 839383765 即可獲壤帘右蹦!