xlrd 簡介:
xlrd是python支持的讀取excel的第三方庫,功能十分強大,今天我們一起來學習下吧!
xlrd 的安裝:pip install xlrd
xlrd的基本操作:
首先我們創建一個測試的excel:
創建python文件,具體操作excel
import xlrd my_excel = xlrd.open_workbook("./test.xlsx") #讀取excel文件,相當於打開excel my_sheet = my_excel.sheet_by_name("Sheet1") #通過sheet頁的名字,跳轉sheet頁 #獲取數據的最大行數 max_row = my_sheet.nrows #獲取最大列數 max_col = my_sheet.ncols #獲取某一列的數據, my_sheet.col_values(2) #返回第二列的列表 #獲取某一行的數據 my_sheet.row_values(2) #返回第二列的列表 #獲取某個坐標的值 my_sheet.cell_value(1,2)
上面代碼的運行結果如下:
4
3
['sex', '男', '男', '女']
['李四', 20.0, '男']
男
xlrd還有很多方法這里就不一一列舉,從上面我們已經可以用python操作excel文件了
xrld的高級用法-合並單元格處理:
我們日常使用,常常會有合並單元格的場景:
使用基本方法 my_sheet.cell_value(2,0),我們會發現取到的值為空,因為excel的機制,一班的值是(1,0),為了使合並單元格的值一致
我們需要用到merged_cells屬性,它會返回所有合並單元格的坐標:[(1, 4, 0, 1)],所以我們的思路是,只要輸入的坐標在這個范圍內,我們
把(1,0)的值賦值給輸入的坐標,這樣就能達到我們的目的:合並單元格的值能正常獲取:
row_index = 3 #輸入合並單元格行數 col_index = 0 #輸入合並單元格列數 merged = my_sheet.merged_cells print(merged) for(rlow, rhigh, clow, chigh) in merged: # 遍歷表格中所有合並單元格位置信息 if (row_index >= rlow and row_index < rhigh): # 行坐標判斷,判斷輸入的值 1=< row_index <4 if (col_index >= clow and col_index < chigh): # 列坐標判斷 0 =<col_index < 1 # 如果滿足條件,就把合並單元格第一個位置的值賦給其它合並單元格 cell_value = my_sheet.cell_value(rlow, clow) print(cell_value)
如上代碼就能讓我們獲取合並單元格的值都能獲取到一班了,好了如果已經掌握,最好封裝起來,這樣以后用起來就方便了,如下:
def excel_merge_cell(self, row_index, col_index): """ 根據輸入坐標,輸出合並單元格或者普通單元格的值 :param row_index int型,行數 :param col_index int型,列數 :return :返回對應坐標的值 """ workbook = xlrd.open_workbook(excel_path) sheet = workbook.sheet_by_name('Sheet1') # merged_cells 獲取當前表格所有合並單元格的位置信息 ,返回一個列 print(sheet.merged_cells) merged = sheet.merged_cells for (rlow, rhigh, clow, chigh) in merged: # 遍歷表格中所有合並單元格位置信息 if (row_index >= rlow and row_index < rhigh): # 行坐標判斷 if (col_index >= clow and col_index < chigh): # 列坐標判斷 # 如果滿足條件,就把合並單元格第一個位置的值賦給其它合並單元格 cell_value = sheet.cell_value(rlow, clow) return "合並單元格數據第%d列,第%d行: %s" %(row_index, col_index,cell_value) else: cell_value =sheet.cell_value(row_index,col_index) #如果不是合並單元格,直接輸出普通單元格的值 return "普通單元格數據第%d列,第%d行: %s" %(row_index, col_index,cell_value)