本文主要介紹可操做excel文件的xlrd、xlwt模塊。其中xlrd模塊實現對excel文件內容讀取,xlwt模塊實現對excel文件的寫入。python
着重掌握讀取操做,由於實際工做中讀取excel用得比較多,寫操做幾乎不怎麼用。數組
python讀excel—xlrdapp
測試使用excel文檔名稱爲result.xls,內容以下:函數
一、 打開excel文件並獲取全部sheet的名稱,以及根據下標獲取sheet名稱測試
1 #打開excel文件 2 workbook = xlrd.open_workbook(r'C:\Users\Administrator.USER-20170604IN\Desktop\result.xls') 3 #獲取excel中全部的sheet頁 4 sheet_names = workbook.sheet_names() 5 print(sheet_names) 6 #獲取第一個sheet的名稱 7 print(sheet_names[0])
二、 根據sheet索引或者名稱獲取sheet內容,並獲取sheet名稱、行數、列數字體
1 #根據sheet索引或者名稱獲取sheet內容 2 sheet1 = workbook.sheet_by_index(0) #sheet索引從0開始 3 sheet1 = workbook.sheet_by_name('Sheet1') 4 5 #打印sheet1的名稱,行數,列數 6 print(sheet1.name, sheet1.nrows, sheet1.ncols)
三、根據sheet名稱獲取整行和整列的值spa
1 #獲取整行和整列的值(數組) 2 rows = sheet1.row_values(3) #獲取第四行的內容 3 cols = sheet1.col_values(2) #獲取第三列的內容 4 print(rows) 5 print(cols)
四、獲取指定單元格的內容.net
1 #獲取單元格內容 2 print(sheet1.cell(1,0).value) 3 print(sheet1.cell_value(1,0)) 4 print(sheet1.row(1)[0].value)
五、獲取單元格內容的數據類型3d
1 #獲取單元格內容的數據類型 2 print(sheet1.cell(7,4).ctype)
說明:ctype:0 empty,1 string,2 number,3 date,4 boolean,5 errorexcel
六、獲取單元內容爲日期類型的方式
使用xlrd的xldate_as_tuple處理date格式,先判斷表格的ctype=3時xlrd才能執行操做,以下:
1 if (sheet.cell(row,col).ctype == 3): 2 date_value = xlrd.xldate_as_tuple(sheet.cell_value(1,2),workbook.datemode) 3 date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
七、獲取合併單元格的內容
讀取合併單元格時,只有合併單元格的第一個cell是有值的,其餘cell都是空的。若是但願知道哪些是合併單元格,須要在讀取文件的時候須要將formatting_info參數設置爲True,默認是False。
1 workbook = xlrd.open_workbook(r'C:\Users\Administrator.USER-20170604IN\Desktop\result.xls', formatting_info = True) 2 sheet1 = workbook.sheet_by_name('Sheet1') 3 print(sheet1.merged_cells) 4 5 merge = [] 6 for rlow, rhigh, clow, chigh in sheet1.merged_cells: 7 merge.append([rlow, clow]) 8 print(merge) 9 for index in merge: 10 print(sheet1.cell_value(index[0], index[1]))
運行結果以下:
merged_cell返回的四個參數的含義是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是同樣,即(1,3,4,5)的含義是:在第5列,第2行到第3行合併,(7,8,2,5)的含義是:在第8行,第3列到第5列合併。注意這些數字都是下標,換成實際excel行數列數時要加1。
python寫excel——xlwt
下面的sheet1是即將要用xlwt實現的東西:
代碼以下:
1 ''' 2 設置單元格樣式 3 ''' 4 5 def set_style(name,height,bold=False): 6 style = xlwt.XFStyle() # 初始化樣式 7 8 font = xlwt.Font() # 爲樣式建立字體 9 font.name = name # 'Times New Roman' 10 font.bold = bold 11 font.color_index = 4 12 font.height = height 13 14 # borders= xlwt.Borders() 15 # borders.left= 6 16 # borders.right= 6 17 # borders.top= 6 18 # borders.bottom= 6 19 20 style.font = font 21 # style.borders = borders 22 23 return style 24 25 26 #寫excel 27 def write_excel(): 28 f = xlwt.Workbook() #建立工做簿 29 30 ''' 31 建立第一個sheet: 32 sheet1 33 ''' 34 sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #建立sheet 35 row0 = [u'業務',u'狀態',u'北京',u'上海',u'廣州',u'深圳',u'狀態小計',u'合計'] 36 column0 = [u'機票',u'船票',u'火車票',u'汽車票',u'其它'] 37 status = [u'預訂',u'出票',u'退票',u'業務小計'] 38 39 #生成第一行 40 for i in range(0,len(row0)): 41 sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True)) 42 43 #生成第一列和最後一列(合併4行) 44 i, j = 1, 0 45 while i < 4*len(column0) and j < len(column0): 46 sheet1.write_merge(i,i+3,0,0,column0[j],set_style('Arial',220,True)) #第一列 47 sheet1.write_merge(i,i+3,7,7) #最後一列"合計" 48 i += 4 49 j += 1 50 51 sheet1.write_merge(21,21,0,1,u'合計',set_style('Times New Roman',220,True)) 52 53 #生成第二列 54 i = 0 55 while i < 4*len(column0): 56 for j in range(0,len(status)): 57 sheet1.write(j+i+1,1,status[j]) 58 i += 4 59 60 f.save('demo1.xlsx') #保存文件 61 62 if __name__ == '__main__': 63 #generate_workbook() 64 #read_excel() 65 write_excel()
解釋一下write_merge方法:
write_merge(x, x + m, y, w + n, string, sytle)
x表示行,y表示列,m表示跨行個數,n表示跨列個數,string表示要寫入的單元格內容,style表示單元格樣式。其中,x,y,w,h,都是以0開始計算的。
這個和xlrd中的讀合併單元格的不太同樣。
如上述:sheet1.write_merge(21,21,0,1,u'合計',set_style('Times New Roman',220,True))
即在22行合併第1,2列,合併後的單元格內容爲"合計",並設置了style。
若是須要建立多個sheet,則只要f.add_sheet便可。
如在上述write_excel函數裏f.save('demo1.xlsx') 這句以前再建立一個sheet2,效果以下:
代碼以下:
1 ''' 2 建立第二個sheet: 3 sheet2 4 ''' 5 sheet2 = f.add_sheet(u'sheet2',cell_overwrite_ok=True) #建立sheet2 6 row0 = [u'姓名',u'年齡',u'出生日期',u'愛好',u'關係'] 7 column0 = [u'小杰',u'小胖',u'小明',u'大神',u'大仙',u'小敏',u'無名'] 8 9 #生成第一行 10 for i in range(0,len(row0)): 11 sheet2.write(0,i,row0[i],set_style('Times New Roman',220,True)) 12 13 #生成第一列 14 for i in range(0,len(column0)): 15 sheet2.write(i+1,0,column0[i],set_style('Times New Roman',220)) 16 17 sheet2.write(1,2,'1991/11/11') 18 sheet2.write_merge(7,7,2,4,u'暫無') #合併列單元格 19 sheet2.write_merge(1,2,4,4,u'好朋友') #合併行單元格 20 21 f.save('demo1.xlsx') #保存文件