Python讀寫Excel表格,就是這么簡單粗暴又好用

最近在做一些數(shù)據(jù)處理和計(jì)算的工作鹉动,因?yàn)閿?shù)據(jù)是以.csv格式保存的轧坎,因此剛開始直接用Excel來處理。但是做著做著發(fā)現(xiàn)重復(fù)的勞動(dòng)其實(shí)并沒有多大的意義泽示,于是就想著寫個(gè)小工具幫著處理缸血。以前正好在一本書上看到過使用Python來處理Excel表格,可惜沒有仔細(xì)看械筛。于是我到處查找資料捎泻,基本解決了日常所需,終于算是完成了任務(wù)埋哟,因此撰寫此文就算是總結(jié)吧笆豁,主要記錄使用過程的常見問題及解決。

python操作excel主要用到xlrd和xlwt這兩個(gè)庫赤赊,即xlrd是讀excel闯狱,xlwt是寫excel的庫∨准疲可從這里下載https://pypi.python.org/pypi哄孤。下面分別記錄python讀和寫excel。

Python寫excel——xlwt

Python寫excel的難點(diǎn)不在構(gòu)造一個(gè)workbook的本身吹截,而是填充的數(shù)據(jù)瘦陈,不過這不在范圍內(nèi)朦肘。在寫excel的操作中也有棘手的問題,比如寫入合并的單元格就是比較麻煩的双饥,另外寫入還有不同的樣式媒抠。

詳細(xì)代碼如下:

import xlwt

#設(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提供的接口比較多统求,但過程也有幾個(gè)比較麻煩的問題检碗,比如讀取日期、讀合并單元格內(nèi)容码邻。

下面先看看基本的操作:

圖表數(shù)據(jù)

整體思路為折剃,打開文件,選定表格像屋,讀取行列內(nèi)容怕犁,讀取表格內(nèi)數(shù)據(jù)

詳細(xì)代碼如下:

import xlrd

from datetime import date,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('年級(jí)')#通過名字獲取表格

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ù);同時(shí)合并單元格里面應(yīng)該是有內(nèi)容的凌受,結(jié)果不能為空阵子。

別急,我們來一一解決這兩個(gè)問題:

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解虱,這時(shí)需要使用xlrd的xldate_as_tuple來處理為date格式攘须,先判斷表格的ctype=3時(shí)xldate才能開始操作。

詳細(xì)代碼如下:

import xlrd

from datetime import date,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'))

2.獲取合并單元格的內(nèi)容

在操作之前殴泰,先介紹一下merged_cells()用法于宙,merged_cells返回的這四個(gè)參數(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))

發(fā)現(xiàn)規(guī)律了沒至会?是的,獲取merge_cells返回的row和col低位的索引即可谱俭!?于是可以這樣批量獲确罴:

詳細(xì)代碼如下:

merge = []

print(sheet1.merged_cells)

for (rlow,rhigh,clow,chigh) in sheet1.merged_cells:

merge.append([rlow,clow])

for index in merge:

print(sheet1.cell_value(index[0],index[1]))

運(yùn)行結(jié)果跟上圖一樣,如下:

Python讀寫Excel表格昆著,就是這么簡單粗暴又好用县貌,如果覺得不錯(cuò),對你工作中有幫助凑懂,動(dòng)動(dòng)手指分享給更多人哦煤痕。

- The End -

小猿圈-IT自學(xué)人的小圈子每日分享免費(fèi)的python視頻教程?(可以加入免費(fèi)python學(xué)習(xí)交流群:242719133)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市接谨,隨后出現(xiàn)的幾起案子摆碉,更是在濱河造成了極大的恐慌,老刑警劉巖疤坝,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兆解,死亡現(xiàn)場離奇詭異,居然都是意外死亡跑揉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門埠巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來历谍,“玉大人,你說我怎么就攤上這事辣垒⊥蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵勋桶,是天一觀的道長脱衙。 經(jīng)常有香客問我,道長例驹,這世上最難降的妖魔是什么捐韩? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鹃锈,結(jié)果婚禮上荤胁,老公的妹妹穿的比我還像新娘。我一直安慰自己屎债,他們只是感情好仅政,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布垢油。 她就那樣靜靜地躺著,像睡著了一般圆丹。 火紅的嫁衣襯著肌膚如雪滩愁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天辫封,我揣著相機(jī)與錄音硝枉,去河邊找鬼。 笑死秸讹,一個(gè)胖子當(dāng)著我的面吹牛檀咙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璃诀,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弧可,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劣欢?” 一聲冷哼從身側(cè)響起棕诵,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凿将,沒想到半個(gè)月后校套,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牧抵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年笛匙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犀变。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妹孙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出获枝,到底是詐尸還是另有隱情蠢正,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布省店,位于F島的核電站嚣崭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懦傍。R本人自食惡果不足惜雹舀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谎脯。 院中可真熱鬧葱跋,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荠卷,卻和暖如春模庐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背油宜。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工掂碱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慎冤。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓疼燥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚁堤。 傳聞我的和親對象是個(gè)殘疾皇子醉者,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容