Python xlrd和xlwt模塊的簡單使用


最近在工作中需要對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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM