原文链接:http://www.juzicode.com/python-tutorial-xlwt-excel
在 Python进阶教程m2d–xlrd读excel 中我们介绍了Excel表格的读取模块xlrd,今天这篇文章带大家了解Excel表格写存模块xlwt。他俩名字相近都以Excel的简写xl开头,rd是read的简写,wt是write的简写。
xlwt也是三方库,需要使用pip安装:
pip install xlwt
1、xlwt的基本用法
跟xlrd一样,也是按照三级结构:文件file-表页sheet-单元格cell 对Excel表格进行写存操作。
首先使用 xlwt.Workbook() 创建Excel写文件对象,会生成一个xlwt.Workbook.Workbook的实例wb:
import xlwt
wb = xlwt.Workbook()
然后用wb的add_sheet()方法添加一个sheet页,传入的参数为sheet页的名称:
ws = wb.add_sheet('juzicode')
再用add_sheet()生成ws实例的write()方法,直接对cell单元进行写入操作,cell单元的行和列的编号都是从0开始编号的,最左上角的单元格编号为(0,0),下面的例子在第0行第0列(对应excel表格的A1单元格)和第1行第3列(D2单元格)分别写入2个字符串:
ws.write(0,0,'juzicode.com')
ws.write(1,3,'vx:juzicode')
最后一步就是用wb.save()保存表格,传入的参数为保存文件的名称:
wb.save('output.xls')
打开生成的excel文件是这样的:
完整的例子如下:
#juzicode.com / VX公众号:juzicode
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('juzicode')
ws.write(0,0,'juzicode.com')
ws.write(1,3,'vx:juzicode')
wb.save('output.xls')
2、单元格数据类型
前面的例子中单元格写入的数据格式都是字符串,除了字符串,还可以写入数值类型、日期、bool值等,也可以是xlwt.Formula()计算结果。其中日期转换为Excel日期格式,该格式是从1899-12-31T00:00:00开始的浮点数值。bool类型会被转换为TRUE或者FALSE。
#juzicode.com/VX公众号:juzicode
import xlwt
import datetime
wb = xlwt.Workbook()
ws = wb.add_sheet('juzicode')
ws.write(0, 0, 3.14159265) # float
ws.write(1, 0, datetime.date(2025,1,31)) #date
ws.write(1, 1, datetime.time(23,25,27)) #time
ws.write(2, 0, 10)
ws.write(2, 1, 19)
ws.write(2, 2, xlwt.Formula("A3+B3")) #计算公式,A3对应2,0 和 B3对应 2,1
ws.write(3, 0, '桔子code') #unicode
ws.write(4, 0, True) #bool
ws.write(4, 1, False)
wb.save('output-data-type.xls')
生成的excel文件:
3、单元格格式
上节的例子中第2行的日期和时间看到效果是浮点数值,只有打开文件后选中单元格后右键设置单元格格式,转换为日期或者时间才能看到正确的数据。其实也可以在写入的时候就设定格式,这样打开文件就能看到正确的日期和时间了。
xlwt提供了easyxf()方法用来构建单元格格式的数据类型XFStyle,再传入到write()的第4个位置参数,就可以设置单元格格式了。
XFStyle 相关的格式有如下几种类型,这6种类型正好对应了excel表格中“设置单元格”场景下的标签页:
Group | Attributes |
---|---|
Number format | Number format index (index to FORMAT record) |
Font | Font index (index to FONT record) |
Alignment | Horizontal and vertical alignment, text wrap, indentation, orientation/rotation, text direction |
Border | Border line styles and colours |
Background | Background area style and colours |
Protection | Cell locked, formula hidden |
easyxf()方法有2个关键入参,一个是num_format_str,表示数据的格式 Number format ;一个是strg_to_parse,用来表示上表中除 Number format 以外的其他5种类型的属性。该方法返回的是 XFStyle 对象。
下面是一个浮点数值设置不同小数点后有效数值的例子,用到了 num_format_str 入参:
#juzicode.com/VX公众号:juzicode
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('juzicode')
ws.write(0, 0, 3.14159265,xlwt.easyxf(num_format_str='0.00')) #设置有效位数
ws.write(1, 0, 3.14159265,xlwt.easyxf(num_format_str='0.00000'))
ws.write(2, 0, 3.14159265,xlwt.easyxf(num_format_str='00.00')) #前面补0
ws.write(3, 0, 1234563.14159265,xlwt.easyxf(num_format_str='0.00'))
ws.write(4, 0, 1234563.14159265,xlwt.easyxf(num_format_str='#,##0.00')) #设置千位分隔符
生成的文件:
num_format_str 入参还可以用来指定日期和时间类型的数据类型:
#juzicode.com/VX公众号:juzicode
import xlwt
import datetime
wb = xlwt.Workbook()
ws = wb.add_sheet('juzicode')
ws.write(0, 0, datetime.date(2025,1,31),xlwt.easyxf(num_format_str='dd/mm/yyyy'))
ws.write(1, 0, datetime.date(2025,1,31),xlwt.easyxf(num_format_str='yyyy-mm-dd'))
ws.write(2, 0, datetime.time(23,25,27),xlwt.easyxf(num_format_str='h:mm:ss'))
ws.write(3, 0, datetime.time(23,25,27),xlwt.easyxf(num_format_str='h:mm AM/PM'))
ws.write(3, 0, datetime.time(23,25,27),xlwt.easyxf(num_format_str='mm:ss'))
wb.save('output-style-date-time.xls')
生成的文件:
前面的例子介绍了怎么设置数值格式,下面是一个设置字体、对齐方式、边框等格式的例子:
wb = xlwt.Workbook()
ws = wb.add_sheet('juzicode')
xf=xlwt.easyxf('font: bold on; align: wrap on, vert centre, horiz center',
num_format_str='dd/mm/yyyy') #加粗,中心对齐
ws.write(0, 0, datetime.date(2025,1,31),xf)
ws.col(0).width=50*256 # 256表示默认为1个字符宽度,这里设置50个字符跨度
xf=xlwt.easyxf('font: bold on, height 500 ; align: wrap on, vert top, horiz left',
num_format_str='dd/mm/yyyy') #设置字体大小为500,加粗,左上对齐
ws.write(1, 0, datetime.date(2025,1,31),xf)
ws.row(1).height_mismatch = True # 打开设置高度开关
ws.row(1).height = 60*20 # 20表示默认为1磅高度,这里设置行高为60磅
xf=xlwt.easyxf('font: bold on ; border: top 5, bottom 5,left 5, right 5',
num_format_str='h:mm:ss') # 边框加粗
ws.write(2, 0, datetime.time(23,25,27),xf)
xf=xlwt.easyxf('font: italic on; pattern: pattern solid, fore-colour red',
num_format_str='$#,##0.00000') # italic字体,红底
ws.write(3, 0, 3.14159265,xf)
wb.save('output-style-font-align.xls')
生成的文件:
tips
1、excel表格数值格式( num_format_str )的取值可以参考:打开excel文件–选中一个单元格–右键点击单元格–设置单元格格式–数字–自定义–类型。
2、xlwt当前的版本仅支持xls格式excel文件的写入,不支持xlsx格式。