最近在工作中需要對EXCEL表進行操作,故而對xlrd和xlwt模塊進行了一番學習,功能很強大,我就常用的一些基本功能做點總結吧。
模塊的安裝:
xlrd和xlwt模塊不是自帶模塊。需要進行安裝,安裝方法不多說,有很多種通常用下面的這種方法安裝簡單方便。
pip install xlrd
pip install xlwt
導入模塊:import xlrd,xlwt
xlrd模塊的使用

獲取表格名稱的方法:
(1) 打開excel文件並獲取所有sheet(表格)
>>> import xlrd >>> workbook = xlrd.open_workbook(r'D:\路徑\文件名.xlsx') >>> print workbook.sheet_names() [u'Sheet1', u'Sheet2', u'Sheet3']
(2) 根據下標獲取sheet名稱
>>> sheet2_name=workbook.sheet_names()[1] >>> print sheet2_name Sheet2
(3) 根據sheet索引或者名稱獲取sheet內容
#根據名字獲取sheet內容 >>> sheet_name = work_book.sheet_by_name('Sheet1') #如果知道表格名可以這樣寫,注意這里需要區分大小寫。 <xlrd.sheet.Sheet object at 0x0393B5B0> #得到的是對象的地址。
#根據索引獲取sheet內容 >>> sheet_name = work_book.sheet_by_index(0) <xlrd.sheet.Sheet object at 0x0346B5D0> #得到的是對象的地址。
#獲取表格信息(名字,行數,列數) >>> print(sheet_name.name, sheet_name.nrows, sheet_name.ncols) Sheet1 9 4 #表名為Sheet1 行數9 列數4
(4) 根據sheet名稱(索引)獲取整行和整列的值
>>> sheet_name = work_book.sheet_by_name('Sheet1') #按名稱獲取值 >>> sheet_name = work_book.sheet_by_index(0) #按索引獲取值 >>>print(sheet_name.row_values(2)) ['第2行1列', '第2行2列', '第2行3列', '第2行4列'] >>>print(sheet_name.col_values(3)) ['第四列', '第1行4列', '第2行4列', '第3行4列', '第4行4列', '第5行4列', '第6行4列', '第7行4列', '第8行4列']
(5)獲取指定單元格的內容(三種方法)
>>> print(sheet_name.cell(1, 2).value) 第1行3列 >>> print(sheet_name.cell_value(1, 2)) 第1行3列 >>> print(sheet_name.row(1)[2].value) #row和col方法一樣,是以行或列為基准,通過下標獲取單元格內容 第1行3列 >>> print(sheet_name.col(2)[1].value) 第1行3列
(6)獲取單元格內容的數據類型
>>> print(sheet_name.cell(1, 0).ctype) 1 #注意:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error #ctype類型數值表示:0為空格,1為字符型,2為數值型,3為日期型,4為布爾型,5為錯誤
(7)獲取單元內容為日期類型的方式
使用xlrd的xldateastuple處理為date格式,先判斷表格的ctype=3時xlrd才能執行操作,如下:
from datetime import date >>> print(sheet_name.cell(0, 0).ctype) 3 #先判斷是否為日期型 >>> print(sheet_name.cell(0, 0).value) 43271.0 #獲得單元格中日期的值 >>> print(xlrd.xldate_as_tuple(sheet_name.cell(0, 0).value, work_book.datemode)) (2018, 6, 20, 0, 0, 0) #獲得元祖形式的日期值 >>> data_time_value = xlrd.xldate_as_tuple(sheet_name.cell(0, 0).value, work_book.datemode) >>> print(date(*data_time_value[:3])) 2018-06-20 #通過date獲得日期值 ('*'星號是剝掉元祖或列表括號) >>> print(date(*data_time_value[:3]).strftime('%Y/%m/%d')) 2018/06/20 #再通過strftime格式化輸出
那么如果是在腳本中需要獲取並顯示單元格內容為日期類型的,可以先做一個判斷。判斷ctype是否等於3,如果等於3,則用時間格式處理:
if (sheet_name.cell(row, col).ctype == 3): data_time_value = xlrd.xldate_as_tuple(sheet_name.cell_value(row, col), book.datemode) date_time = date(*data_time_value[:3]).strftime('%Y/%m/%d')
(8) 獲取合並單元格的內容

>>> print(sheet_name.cell(1, 3).value) #第四列的1行和2行合並單元格 第1,2行四列合並 >>> print(sheet_name.cell(2, 3).value) #同樣是第四列,讀取第2行值時顯示為空 '' >>> print(sheet_name.cell(8, 1).value) #第8行,二、三、四列合並 第8行二,三, 四列合並 >>> print(sheet_name.cell(8, 2).value) '' >>> print(sheet_name.cell(8, 3).value) #同樣是第8行,讀取三、四列值時顯示為空 ''
那么我們可以看出,當單元格合並的時候,只能讀取合並單元格第一個單元格的值時才有值,其他合並的單元格沒有對應的值。
讓我們以整行和整列讀取的值來更直觀的看一下。
>>> print(sheet_name.row_values(8)) ['第8行1列', '第8行二,三, 四列合並', '', ''] >>> print(sheet_name.col_values(3)) ['第四列', '第1,2行四列合並', '', '第3行4列', '第4行4列', '第5行4列', '第6行4列', '第7行4列', '']
如何准確的讀取到合並單元格的內容呢?我們可以使用merged_cells方法,一次性將所有合並單元格全部讀取出來。
>>> sheet_name = work_book.sheet_by_index(2) >>> print(sheet_name.merged_cells) [(8, 9, 1, 4), (1, 3, 3, 4)]
注意:mergedcells返回的這四個參數的含義是:(row,rowrange,col,colrange),其中(row,rowrange)為一對,(col,colrange)為一對。讀取規則與列表的下標讀取規則一致,"顧前不顧后"。也就是,包含row值,不包括rowrange的值,col同理一樣,下標數都是從0開始。
>>> print(sheet_name.cell(8, 1).value) 第8行二,三, 四列合並 >>> print(sheet_name.cell(1, 3).value) 第1,2行四列合並
由於合並單元格的第一個單元格是有值的,所以,通過merged_cells得到的4個下標值,只取每對的第一個值便可以得到組合表格的值了。
那么可以通過提取每對下標的最小下標值,來對合並的表格單元取值。
>>>merge_lis =[] >>>for (row_l,row_h,col_l,col_h) in sheet_name.merged_cells: ... merge_lis.append([row_l,col_l]) >>>for i in merge_lis: ... print(sheet_name.cell(i[0], i[1]).value) 第8行二,三, 四列合並 第1,2行四列合並
未完待續。。。 xlwt
