Python中xlrd和xlwt模块读写Excel的方法
本文主要介绍可操作excel文件的xlrd、xlwt模块。其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入。
着重掌握读取操作,因为实际工作中读取excel用得比较多,写操作几乎不怎么用。
python读excel—xlrd
测试使用excel文档名称为result.xls,内容如下:
1、 打开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])
2、 根据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)
3、根据sheet名称获取整行和整列的值
1 #获取整行和整列的值(数组) 2 rows = sheet1.row_values(3) #获取第四行的内容 3 cols = sheet1.col_values(2) #获取第三列的内容 4 print(rows) 5 print(cols)
4、获取指定单元格的内容
1 #获取单元格内容 2 print(sheet1.cell(1,0).value) 3 print(sheet1.cell_value(1,0)) 4 print(sheet1.row(1)[0].value)
5、获取单元格内容的数据类型
1 #获取单元格内容的数据类型 2 print(sheet1.cell(7,4).ctype)
说明:ctype:0 empty,1 string,2 number,3 date,4 boolean,5 error
6、获取单元内容为日期类型的方式
使用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')
7、获取合并单元格的内容
读取合并单元格时,只有合并单元格的第一个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') #保存文件
参考资料:python中使用xlrd、xlwd操作excel表格详解