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表格详解

 

posted @ 2018-05-01 18:21  #天羽Owl  阅读(571)  评论(0编辑  收藏  举报