人之所以痛苦,那是因为你在成长。--------magic_guo
众做周知,python处理Excel的模块有很多,最近在做一个数据处理的需求,就开始慢慢了解了xlwt,xlrd这两个模块,虽然用起来有局限性,但是对于一般的数据处理还是游刃有余,下面我来分享一些我的经验,不到之处请大家指正。
先来讲xlwt:
一般的话简单使用xlwt模块的方法是:
1.导入xlwt模块
2.创建工作薄
3.创建工作表
4.(可选)对于单元格样式及格式的设置(这里面有很多内容,后面慢慢讲解)
5.写入数据(加上对于样式格式的设置)
6.保存execl文件
下面看代码:
import xlwt
# 简单的使用xlwt模块
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('my_sheet')
worksheet.write(0, 0, 'this is a test!')
workbook.save('excel.xls')
结果如下:
熟悉了基本操作,我们开始对于单元格的格式样式进行设置:
设置字体样式:
# 给单元格添加样式
workbook = xlwt.Workbook(encoding='ascii')
worksheet = workbook.add_sheet('my_sheet')
# 初始化样式
style = xlwt.XFStyle()
# 为样式创建字体
font = xlwt.Font()
# 设置字体为新罗马字体
font.name = 'Times New Roman'
# 设置字体黑体
font.bold = True
# 设置下划线
font.underline = True
# 设置字体斜体
font.italic = True
# 将上面设置的样式内容设置到font模块中
style.font = font
# 不带样式的写入
worksheet.write(0, 0, 'this is a test!')
# 带样式的写入
worksheet.write(0, 1, 'this is a test!', style)
# 保存excel
workbook.save('excel.xls')
结果如下:
上图结果可以看到两种写入方式并不一样。
设置行高列宽:
在xlwt中没有特定的函数来设置默认的列宽及行高,但是可以通过自动换行通过输入文字的多少来确定行高列宽
列宽:
workbook = xlwt.Workbook(encoding='ascii')
worksheet = workbook.add_sheet('my_sheet')
# 设置列的宽度(第0列的宽度为:3333)
# 在xlwt中列宽的表示方法为:默认字体0的1/256为单位。其创建时使用的默认宽度为2960,即11个字符0的宽度。所以我们在设置列宽时可以使用以下办法:
# 256为衡量单位,20表示20个字符的宽度
# 下面是设置第1列(按照Excel表示是A列)
worksheet.col(0).width = 256 * 20
worksheet.write(0, 0, label='this is a test!')
workbook.save('excel.xls')
结果:
行高:
第一种方法:
workbook = xlwt.Workbook(encoding='ascii')
worksheet = workbook.add_sheet('my_sheet')
# 通过自动换行的方式来设置行高,其中720为可修改参数,可以通过修改可变参数来匹配自己合适的行高
tall_style = xlwt.easyxf('font:height 720')
# 将第一行赋给first_row
first_row = worksheet.row(0)
# 将第一行的行高根据刚才的修改进行设置
first_row.set_style(tall_style)
# 写入数据
worksheet.write(0, 0, label='this is a test!')
workbook.save('excel.xls')
结果:
第二种方法:
# 另一种设置行高的方法
workbook = xlwt.Workbook(encoding='ascii')
worksheet = workbook.add_sheet('my_sheet')
worksheet.row(0).height_mismatch = True
worksheet.row(0).height = 800
worksheet.write(0, 0, label='this is a test!')
workbook.save('excel.xls')
结果:
相比较而言,第二种方法更简单一些。
合并单元格
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('my_sheet')
# 1,2个参数表示行数,3,4的参数表示列数
# 意思是合并0-3行,0-3列
worksheet.write_merge(0, 3, 0, 3, 'Second Merge')
workbook.save('excel.xls')
结果:
xlrd模块:
xlrd模块最重要的是,对于工作薄book、工作表sheet和单元格cell的操作,毕竟该模块是读取excel的数据的:
思路方法:
1.导入xlrd模块
2.打开excel文件,获取工作薄
3.通过工作薄获取工作表
3.对单元格数据进行读取
4.关闭excel
简单的代码:
import xlrd
# 打开excel文件,获取工作薄
workbook = xlrd.open_workbook('excel.xls') # 填写文件路径
# 获取工作表,有好几种方法
# 1.通过索引顺序获取
worksheet = workbook.sheet_by_index(0)
# 2.通过索引顺序获取
# workbook.sheets()返回一个存放所有sheet名字的列表
worksheet2 = workbook.sheets()[0]
# 3.通过名字获取工作表
worksheet3 = workbook.sheet_by_name('my_sheet')
# 对于行的操作
# 获取工作表内的有效行数
nrows = worksheet.nrows()
# 返回由该行中所有的单元格对象组成的列表(rowx=2代表行号)
rowx_list = worksheet.row(rowx=2)
# 返回该行中所有单元格的数据类型组成的列表
rowx_datatype_list = worksheet.row_types(rowx=2, start_colx=0, end_colx=None)
# 返回该行中所有单元格的数据组成的列表
rowx_data_list = worksheet.row_values(rowx=2, start_colx=0, end_colx=None)
# 返回该行中所有单元格对象组成的列表
rowx_data_list1 = worksheet.row_slice(rowx=2, start_colx=0, end_colx=None)
# 对于列的操作
# 获取工作表内的有效列数
ncols = worksheet.ncols()
# 返回由该列中所有的单元格对象组成的列表(rowx=2代表行号)
colx = worksheet.col(colx=2)
# 返回该列中所有单元格对象组成的列表
colx_list = worksheet.row_slice()
# 返回该列中所有单元格对象的数据类型组成的列表
colx_datatype_list = worksheet.row_types(colx=2, start_colx=0, end_colx=None)
# 返回该列中所有单元格对象的数据组成的列表
colx_data_list = worksheet.col_values(colx=2, start_rowx=0, end_rowx=None)
# 对单元格的操作
# 返回单元格对象(即第二行第二列的单元格对象)
cell = worksheet.cell(rowx=2, colx=2)
# 返回单元格中的数据类型
cell_type = worksheet.cell_type(rowx=2, colx=2)
# 返回单元格中的数据
cell_data = worksheet.cell_value(rowx=2, colx=2)