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

最近在做一些數(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 即可獲壤帘右蹦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歼捐,隨后出現(xiàn)的幾起案子何陆,更是在濱河造成了極大的恐慌,老刑警劉巖豹储,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贷盲,死亡現(xiàn)場離奇詭異,居然都是意外死亡剥扣,警方通過查閱死者的電腦和手機(jī)巩剖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠怯,“玉大人佳魔,你說我怎么就攤上這事』薮叮” “怎么了鞠鲜?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長断国。 經(jīng)常有香客問我贤姆,道長,這世上最難降的妖魔是什么稳衬? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任霞捡,我火速辦了婚禮,結(jié)果婚禮上薄疚,老公的妹妹穿的比我還像新娘碧信。我一直安慰自己,他們只是感情好街夭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布砰碴。 她就那樣靜靜地躺著,像睡著了一般莱坎。 火紅的嫁衣襯著肌膚如雪衣式。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天檐什,我揣著相機(jī)與錄音碴卧,去河邊找鬼。 笑死乃正,一個胖子當(dāng)著我的面吹牛住册,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼聘殖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坪哄?” 一聲冷哼從身側(cè)響起叹阔,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤挠轴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耳幢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岸晦,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年睛藻,在試婚紗的時候發(fā)現(xiàn)自己被綠了启上。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡店印,死狀恐怖冈在,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情按摘,我是刑警寧澤包券,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站院峡,受9級特大地震影響兴使,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜照激,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹牧。 院中可真熱鬧俩垃,春花似錦、人聲如沸汰寓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽有滑。三九已至跃闹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毛好,已是汗流浹背望艺。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肌访,地道東北人找默。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像吼驶,于是被迫代替她去往敵國和親惩激。 傳聞我的和親對象是個殘疾皇子店煞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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