Python操作excel主要用到xlrd和xlwt两个库。
xlrd:读excel表格,即读取excel表格的数据,转换成pthon对象。
xlwt:写excel表格,即由python对象生成excel表格。
xlrd常用API
- 导入xlrd包
import xlrd 打开excel文件
workbook = xlrd.open_workbook(‘simple.xls’)
xlrd.open_workbook()方法返回的是xlrd.Book对象,携带了该工作簿的所有信息。workbook即xlrd.Book的一个对象。
当然,根据官方的python-excel文档,Workbook对象的打开方式可以是文件、mmap.mmap对象或字符串。
mmap.mmap对象或字符串都添加到open_workbook()方法的file_contents属性中。获取sheet
- 获取所有sheet
sheets = workbook.sheets()
返回一个列表,常用于遍历,如 for s in workbook.sheets(): - 获取名字列表
workbook.sheet_names()
返回此workbook中所有sheet的名字列表。 - 获取单个sheet
- 按索引
sheet1 = workbook.sheet_by_index(index)
xlrd.Book.nsheets属性表示了工作簿里的sheet的个数,索引index的范围正是[0,nsheets-1]。 - 按名字
sheet1 = workbook.sheet_by_name(name)
注:这里的sheet1是通过以上两种方法得到的sheet对象(即xlrd.sheet.Sheet类),对象名叫sheet1。后面的sheet1均指这里得到的sheet对象。
- 按索引
- 获取所有sheet
- 获取sheet的属性
- 名称
sheet1.name - 行列数
sheet1.nrows
sheet1.ncols - 整行值
rows = sheet1.row_values(3) # 获取第四行内容
或者
row = sheet1.row_slice(3,0) #从第四行的索引为0的位置开始获取行的内容,直至行末。
对比:
row = sheet1.row_slice(3,2,7) #从第四行的索引为2的位置开始获取行的内容,直至索引为6的位置。
注:这里的row_slice()、col_slice()两方法不能指定分片的步数,只能按顺序逐个读取,无法跳跃地读取。 - 整列值
cols = sheet1.col_values(2) # 获取第三列内容
- 名称
注:关于行和列的操作,官方文档描述如下:
获取单元格值
cell()方法返回一个xlrd.sheet.Cell类对象。
三种方式均可:
sheet1.cell(1,0).value.encode(‘utf-8’)
sheet1.cell_value(1,0).encode(‘utf-8’)
sheet1.row(1)[0].value.encode(‘utf-8’)单元格内容的类型
sheet1.cell(row,col).ctype
python读取excel中单元格的内容返回的有5种类型,即ctype有以下5种取值:- 0:empty
- 1:string
- 2:number
- 3:date
- 4:boolean
- 5:error
下面给出一个使用示例:
- 读取单元格中的日期
首先判断ctype是否等于3,如果为3,则用时间格式处理。先使用xlrd.xldate_as_tuple()方法来处理,讲date类型的数据转换成元组。1991/11/11 -> (1991,11,11,0,0,0)
然后使用date的strftime()方法进行格式化。 (1991,11,11,0,0,0) -> 1991/11/11
if (sheet.cell(row,col).ctype == 3):
date_value = xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)
date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
- 读取合并单元格中的内容
这里xlrd并不是很高效,只能从合并单元格的第一个(最左上)单元格中读取值,其他单元格读到的都是空值。
获取最左上的单元格的方法:
读取文件时将formatting_info参数设置为True,默认是False。示例如下:
在读取合并单元格的时候,关于merged_cells中元组的的理解和python的分片一致。
从上面的结果可以看出,所谓的“最左上”单元格其实由merged_cells返回的row和col的低位构成,于是有:
xlwt常用API
- 导入包
import xlwt 创建工作簿
f = xlwt.Workbook() #不带参数
返回一个xlwt.Workbook对象创建sheet
sheet1 = f.add_sheet(u’sheetName’, cell_overwrite_ok=True)
可以多次调用f.add_sheet()方法在同一个工作簿中创建多个sheet。- 检索sheet
sheet2 = f.get_sheet(index)
根据sheet的索引检索。 写入单元格
sheet1.write(row_index,col_index,contents) #往坐标为(row_index,col_index)的单元格写入数据contents
或者
sheet1.row(row_index).write(col_index,contents) #与上面等价
或者
sheet1.col(col_index).write(row_index,contents) #与上面等价
注:
row(index)或col(index)方法既可以检索已存在的行/列,也可以创建不存在的行/列。
官方文档中示例如下:
保存文件
f.save(name)- 合并单元格,并写入数据
用到sheet的write_merge(x,x+m,y,y+n,string,style)方法。
这与xlrd读取合并单元格sheet.merged_cells的方式不一样。 故对参数作如下重点说明:
- x,y,m,n都是以0开始计数的;
- x,x+m:合并从第x行开始到x+m行结束的单元格,包括第x+m行;
- y, y+n: 合并从第y列开始到第y+n列结束的单元格,包括第y+n列。
如:
sheet1.write_merge(1,4,0,0,’Hello’): 合并第1列的第2、3、4、5行(索引1-4),内容为Hello。
sheet1.write_merge(21,21,0,1,’Hello’):合并第22行的第1、2列。
参考资料
- 博客python中使用xlrd、xlwt操作excel表格详解,xlrdxlwt
该博客中给出了读写excel文档的实例,并配有插图和代码,值得借鉴。 - 博客python操作excel文件——Python Excel Tutorial 指南
- python-excel文档 下载地址