1. 程式人生 > >Python讀寫Excel表格,就是這麼簡單粗暴又好用

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

最近在做一些資料處理和計算的工作,因為資料是以.csv格式儲存的,因此剛開始直接用Excel來處理。但是做著做著發現重複的勞動其實並沒有多大的意義,於是就想著寫個小工具幫著處理。以前正好在一本書上看到過使用Python來處理Excel表格,可惜沒有仔細看。於是我到處查詢資料,基本解決了日常所需,終於算是完成了任務,因此撰寫此文就算是總結吧,主要記錄使用過程的常見問題及解決。

 

python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。可從這裡下載https://pypi.python.org/pypi。下面分別記錄python讀和寫excel。

更多幹貨分享加python程式語言學習QQ群 515267276

Python寫excel——xlwt

Python寫excel的難點不在構造一個workbook的本身,而是填充的資料,不過這不在範圍內。在寫excel的操作中也有棘手的問題,比如寫入合併的單元格就是比較麻煩的,另外寫入還有不同的樣式。

詳細程式碼如下:

 
 

import xlwt

 

#設定表格樣式

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('學生',cell_overwrite_ok=True)

row0 = ["姓名","年齡","出生日期","愛好"]

colum0 = ["張三","李四","戀習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()

 

更多幹貨分享加python程式語言學習QQ群 515267276

結果圖:

 

 

在此,對write_merge()的用法稍作解釋,如上述:sheet1.write_merge(1,2,3,3,'打遊戲'),即在四列合併第2,3列,合併後的單元格內容為"合計",並設定了style。其中,裡面所有的引數都是以0開始計算的。

 

Python讀excel——xlrd

Python讀取Excel表格,相比xlwt來說,xlrd提供的介面比較多,但過程也有幾個比較麻煩的問題,比如讀取日期、讀合併單元格內容。

下面先看看基本的操作:

 

 

圖表資料

整體思路為,開啟檔案,選定表格,讀取行列內容,讀取表格內資料

詳細程式碼如下:

 
 

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('年級')#通過名字獲取表格

print(sheet1,sheet2)

print(sheet1.name,sheet1.nrows,sheet1.ncols)

 

rows = sheet1.row_values(2)#獲取行內容

cols = sheet1.col_values(3)#獲取列內容

print(rows)

print(cols)

 

print(sheet1.cell(1,0).value)#獲取表格裡的內容,三種方式

print(sheet1.cell_value(1,0))

print(sheet1.row(1)[0].value)

更多幹貨分享加python程式語言學習QQ群 515267276

執行結果如下:

 

 

那麼問題來了,上面的執行結果中紅框框中的欄位明明是出生日期,可顯示的確實浮點數;同時合併單元格里面應該是有內容的,結果不能為空。

 

別急,我們來一一解決這兩個問題:

 

1.python讀取excel中單元格內容為日期的方式

 

python讀取excel中單元格的內容返回的有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才能開始操作。

 

 

詳細程式碼如下:

 
 
 

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.獲取合併單元格的內容

 

在操作之前,先介紹一下merged_cells()用法,merged_cells返回的這四個引數的含義是:(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列合併。

 

詳細程式碼如下:

 
 

print(sheet1.merged_cells)
print(sheet1.cell_value(1,3))

print(sheet1.cell_value(4,3))

print(sheet1.cell_value(6,1))

 

 

 

發現規律了沒?是的,獲取merge_cells返回的row和col低位的索引即可! 於是可以這樣批量獲取:

 

詳細程式碼如下:

 
 
 

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]))

 

執行結果跟上圖一樣,如下:

 

 

Python讀寫Excel表格,就是這麼簡單粗暴又好用,如果覺得不錯,對你工作中有幫助,動動手指分享給更多人哦。