Hi,我是山月。
上次给大家分享了基于xlrd读取excel的教程,希望大家对Python处理Excel有了个初步的认识。
不知道大家还有没有印象,在文章的实例部分(教程详情戳Python自动化办公:xlrd万字教程),山月只讲解了如何读取excel数据,而写入数据则没有讲解。
因此,今天就基于一个最基本的专门用来写入数据的库--xlwt来给大家介绍下如何用Python在Excel里写入数据。
01
准备工作
1.1 xlwt基本介绍
xlwt是一个能将数据和样式信息写入excel表格的库,注意:它只可以通过创建一个新的工作薄写入。
官网:https://xlwt.readthedocs.io/en/latest/
1.2 pip安装xlwt
在cmd命令提示符窗口输入pip install xlwt安装。
02
写入数据
2.1 语法
1)导入xlwt
import xlwt
2)创建一个新的工作薄
xlwt.Workbook(encoding='ascii', style_compression=0)
参数:
encoding:设置字符编码,默认是ascii,一般设置成utf-8。
style_compression:是否压缩。
3)新建工作表
add_sheet(sheetname, cell_overwrite_ok=False)
参数:
sheetname:工作表名称
cell_overwrite_ok:是否可以覆盖单元格,默认为False;如果想对同一单元格多次操作时要设置为 True,否则会报错。
比如重复写入工作表(名称:sheet)的A1单元格会报错:Attempt to overwrite cell: sheetname='sheet' rowx=0 colx=0
4)写入单元格内容
write(r, c, label='', style=)
参数:
5)保存工作薄
save(filename_or_stream)
注意:xlwt模块不支持xlsx格式,因此我们只能保存成xls格式。
2.2 实例
如果我们想通过xlwt在一个新excel文件里写入数据,我们可以:
wb = xlwt.Workbook(encoding='utf-8',style_compression=0) #创建一个新的工作薄,以utf-8编码
ws_1 = wb.add_sheet('这是工作表1',cell_overwrite_ok=True) #创建一个工作表,工作表名称是:这是工作表1
ws_2 = wb.add_sheet('这是工作表2',cell_overwrite_ok=True) #创建一个工作表,工作表名称是:这是工作表2
#对工作表【这是工作表1】的写入
ws_1.write(0, 0, label=1) #在A1写入内容【1】
ws_1.write(0, 1, 2) #省略label,在B1写入内容【2】
ws_1.write(1, 0, label='这是A2') #在A2写入内容【这是A2】
ws_1.write(1, 1, '这是B2') #省略label,在B2写入内容【这是B2】
#对工作表【这是工作表2】的写入
ws_2.write(0, 0, label=1) #在A1写入内容【1】
ws_2.write(0, 1, 2) #省略label,在B1写入内容【2】
ws_2.write(1, 0, label='这是A2') #在A2写入内容【这是A2】
ws_2.write(1, 1, '这是B2') #省略label,在B2写入内容【这是B2】
wb.save('xlwt例子.xls') #保存excel
这个时候py文件所在的目录里产生了一个文件【xlwt例子.xls】,它的内容是:
03
写入样式
xlwt可设置的样式有以下六大类:
对应的excel的含义是:
xlwt有两种方法写入样式,其中常规方法是:创建一个样式对象--设置样式--带样式写入内容。另外还可以用easyxf配置样式。
我们一个个来看。
3.1 数字(Number format)
对于数字样式,我们是通过num_format_str来进行设置。
num_format_str:单元格的“数字格式字符串”。也就是Excel中的自定义部分:
比如我们现在通过datetime.now()得出了目前的时间(格式为:yyyy-m-d h:mm:ss)。
但是我们在写入表格的时候不想按照这个格式写入,这个时候我们就可以通过设置数字格式来改变格式:
import xlwt
from datetime import datetime #导入datetime
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
cell_style = xlwt.XFStyle() #创建一个样式
cell_style.num_format_str = 'd-mmm-yy' # 设置数字格式并导入样式
cell_style_1 = xlwt.XFStyle() #创建一个样式
cell_style_1.num_format_str = 'yyyy"年"m"月"d"日"' # 设置数字格式并导入样式
ws.write(0,0, datetime.now(),cell_style) #带样式cell_style写入
ws.write(1,1, datetime.now(),cell_style_1) #带样式cell_style_1写入
wb.save('数字格式.xls')
结果:
如果你刚开始打开的是下面这个样子,别慌,这是因为单元格的内容过长而表格不够宽。我们只需要把单元格宽度拉长就可以得到上面的内容了。
3.2 字体(Font)
3.2.1 获取字体样式信息
我们可以用_search_key方法来获取样式的信息,比如我们想获取字体样式的信息:
import xlwt
font = xlwt.Font()
font_info = font._search_key() #查看样式信息
print(font_info)
运行结果:
(200, False, False, False, False, 32767, False, 400, 0, 0, 0, 1, 'Arial')
_search_key返回的是一个由样式的默认格式值组成的元组。
对于字体样式,默认值对应的格式是:
(height,italic, struck_out, outline, shadow, colour_index, bold, weight, escapement, underline, family, charset, name)
我们来看个例子用来更好的理解吧:
import xlwt
font_1 = xlwt.Font()
font_info = font_1._search_key() #全部默认
print(font_info)
font_2 = xlwt.Font()
font_2.name = 'Times New Roman' #设置字体为Times New Roman
font_info_2 = font_2._search_key() #只设置了字体为Times New Roman
print(font_info_2)
运行结果:
(200, False, False, False, False, 32767, False, 400, 0, 0, 0, 1, 'Arial')
(200, False, False, False, False, 32767, False, 400, 0, 0, 0, 1, 'Times New Roman')
可以看到两个元组就最后一个元素(也就是字体名称)不一样。
默认的是Arial,如果我们把字体更改为Times New Roman则它的值变成了Times New Roman。
3.2.2 可设置项
其实我们通过_search_key返回的元组就知道了我们可以设置哪些格式,它们的具体含义是:
height #设置字体大小。默认字号:10(200也就是20*10,其中20为衡量单位,10为字号)。
italic #是否设置斜体。默认不设置:False;斜体:True
struck_out #是否设置删除线。默认不设置:False,删除线:True
outline #是否设置轮廓,默认不设置:False,添加轮廓:True。讲真,这个设没设置区别不大。
shadow #是否设置阴影,默认正常:False,添加阴影:True。讲真,这个设没设置区别不大。
colour_index #设置字体颜色。默认:32767(0x7FFF)
bold #是否设置加粗。默认不设置:False,加粗:True。
weight #设置笔画宽度。默认400,可以设置成600看看区别。
escapement #是否设置为上下标。默认正常(0),上标(1),下标(2)。
underline #是否设置下划线。默认不带下划线(0),单下划线(1),双下划线(2),会计用单下划线(3),会计用双下划线(4)
family #设置字体集。默认0
charset #设置字符集。默认1,取值0-255。
name #设置字体名称。默认字体:Arial
3.2.3 实例
import xlwt # 导入xlwt
wb = xlwt.Workbook() # 创建一个新的工作薄
ws = wb.add_sheet('sheet1') # 创建一个工作表
style = xlwt.XFStyle() # 创建一个样式对象
font = xlwt.Font() # 创建一个字体格式
font.name = 'Times New Roman' # 设置字体为Times New Roman
font.height = 20*12 # 设置字号12
font.bold = True # 加粗
font.italic = True # 斜体
font.struck_out = True # 删除线
font.colour_index = 0x36 # 设置字体颜色:0x36
font.underline = 1 # 单下划线
style.font = font #将设置好的字体格式导入样式
ws.write(0,0, "默认") #不带样式写入
ws.write(0,1, "更改样式",style) #带样式的写入
wb.save('字体.xls') #保存excel文件
结果:
3.3 对齐(Alignment)
3.3.1 获取对齐样式信息
import xlwt
cell_al = xlwt.Alignment()
alignment_info = cell_al._search_key()
print(alignment_info)
运行结果:
(0, 2, 0, 0, 0, 0, 0, 0, 0)
对应的格式是:
(horz, vert,dire, orie, rota, wrap,shri, inde, merg)
3.3.2 可设置项
对齐样式可设置的选项及其说明如下:
horz # 设置水平对齐方式,默认0。常规(0);左对齐(1); 居中(2); 右对齐(3);填充(4);两端对齐(5);跨列居中(6);分散对齐(7)。
vert # 设置垂直对齐方式,默认2。顶端对齐(0); 垂直居中(1); 底端对齐(2);两端对齐(3);分散对齐(4)。
dire # 设置文字方向,默认0。根据内容(0),总是从左到右(1),总是从右到左(2)
orie # 默认为0
rota # 设置旋转方向,默认为0,范围:0-255
wrap # 是否设置自动换行,默认不自动换行:0。自动换行:1
shri # 是否设置缩小字体填充,也就是根据单元格缩小字体,默认不设置:0。设置:1
inde # 默认为0
merg # 默认为0
3.3.3 实例
import xlwt # 导入xlwt
wb = xlwt.Workbook() # 创建一个新的工作薄
ws = wb.add_sheet('sheet1') # 创建一个工作表
style = xlwt.XFStyle() # 创建一个样式对象
cell_al = xlwt.Alignment() # 创建一个对齐格式
cell_al.horz = 2 # 设置水平对齐方式为居中
cell_al.vert = 1 # 设置垂直对齐方式为垂直居中
style.alignment = cell_al # 将设置好的对齐格式导入样式
ws.write(0, 0, '默认') # 不带样式写入
ws.write(0, 1, '居中',style) # 带样式写入
wb.save('对齐.xls') #保存excel
结果:
3.4 边框(Border)
3.4.1 获取边框样式信息
import xlwt
cell_borders = xlwt.Borders()
borders_info = cell_borders._search_key()
print(borders_info)
运行结果:
(0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 0, 0)
对应的格式是:
(left, right, top, bottom, diag, left_colour, right_colour, top_colour, bottom_colour, diag_colour, need_diag1, need_diag2)
3.4.2 可设置项
可设置的选项及其说明:
left #设置左边框样式,默认为不设置边框(0x00)
right #设置右边框样式,默认为不设置边框(0x00)
top #设置上边框样式,默认为不设置边框(0x00x00)
bottom #设置下边框样式,默认为不设置边框(0x00)
diag #设置对角线样式,要先设置显示对角线才能设置,默认为不设置对角线(0x00)
left_colour #设置左边框颜色,默认为64
right_colour #设置右边框颜色,默认为64
top_colour #设置上边框颜色,默认为64
bottom_colour #设置下边框颜色,默认为64
diag_colour #设置对角线颜色,要先设置显示对角线才能设置,默认为64
need_diag1 #设置是否显示左上-右下对角线,默认不显(示0:NO_NEED_DIAG1),显示(1:NEED_DIAG1)
need_diag2 #设置是否显示左下-右上对角线,默认不显示(0:NO_NEED_DIAG2),显示(1:NEED_DIAG2)
3.4.3 实例
import xlwt #导入xlwt
wb = xlwt.Workbook() #创建一个新的工作薄
ws = wb.add_sheet('sheet1') #创建一个工作表
# 设置边框样式1
style_1 = xlwt.XFStyle()
cell_border_1 = xlwt.Borders()
cell_border_1.top = 0x00 #上边框样式
cell_border_1.bottom = 0x01 #下边框样式
cell_border_1.left = 0x02 #左边框样式
cell_border_1.right = 0x03 #右边框样式
style_1.borders = cell_border_1
# 设置边框样式2
style_2 = xlwt.XFStyle()
cell_border_2 = xlwt.Borders()
cell_border_2.top = 0x04 #上边框样式
cell_border_2.bottom = 0x05 #下边框样式
cell_border_2.left = 0x06 #左边框样式
cell_border_2.right = 0x07 #右边框样式
style_2.borders = cell_border_2
# 设置边框样式3
style_3 = xlwt.XFStyle()
cell_border_3 = xlwt.Borders()
cell_border_3.top = 0x08 #上边框样式
cell_border_3.bottom = 0x09 #下边框样式
cell_border_3.left = 0x0A #左边框样式
cell_border_3.right = 0x0B #右边框样式
style_3.borders = cell_border_3
# 设置边框样式4
style_4 = xlwt.XFStyle()
cell_border_4 = xlwt.Borders()
cell_border_4.top = 0x0C #上边框样式
cell_border_4.bottom = 0x0C #下边框样式
cell_border_4.left = 0x0D #左边框样式
cell_border_4.right = 0x0D #右边框样式
style_4.borders = cell_border_4
# 设置边框颜色
style_color = xlwt.XFStyle()
cell_border_color = xlwt.Borders()
cell_border_color.left = xlwt.Borders.MEDIUM #上边框样式,MEDIUM也就是0x02
cell_border_color.right = xlwt.Borders.MEDIUM #下边框样式
cell_border_color.top = xlwt.Borders.MEDIUM #左边框样式
cell_border_color.bottom = xlwt.Borders.MEDIUM #右边框样式
cell_border_color.top_colour = 0x10 #上边框颜色
cell_border_color.bottom_colour = 0x10 #下边框颜色
cell_border_color.left_colour = 0x10 #左边框颜色
cell_border_color.right_colour = 0x10 #右边框颜色
style_color.borders = cell_border_color
#设置对角线左上-右下
style_diag1 = xlwt.XFStyle()
cell_border_diag1 = xlwt.Borders()
cell_border_diag1.need_diag1 = 1 #设置显示左上-右下对角线
cell_border_diag1.diag = 0x02 #设置对角线样式
cell_border_diag1.diag_colour = 0x10 #设置对角线颜色
style_diag1.borders = cell_border_diag1
#设置对角线左下-右上
style_diag2 = xlwt.XFStyle()
cell_border_diag2 = xlwt.Borders()
cell_border_diag2.need_diag2 = 1 #设置显示左下-右上对角线
cell_border_diag2.diag = 0x02 #设置对角线样式
cell_border_diag2.diag_colour = 0x10 #设置对角线颜色
style_diag2.borders = cell_border_diag2
#写入表格
ws.write(0, 0, '默认')
ws.write(1, 1, '边框1',style_1)
ws.write(2, 2, '边框2',style_2)
ws.write(3, 3, '边框3',style_3)
ws.write(4, 4, '边框4',style_4)
ws.write(5, 5, '边框颜色',style_color)
ws.write(6, 6, '对角线1',style_diag1)
ws.write(7, 7, '对角线2',style_diag2)
wb.save('边框.xls') #保存excel
结果:
3.4.4 边框样式
山月把所有的边框样式整理了,大家可以保存下~
3.5 填充(Background)
3.5.1 获取填充样式信息
import xlwt
cell_pattern = xlwt.Pattern()
pattern_info = cell_pattern._search_key()
print(pattern_info)
运行结果:
(0, 64, 65)
对应的格式是:
(pattern, pattern_fore_colour, pattern_back_colour)
3.5.2 可设置项
可设置的选项及其说明:
pattern #是否设置填充,默认为不设置(0:NO_PATTERN)。设置:1(SOLID_PATTERN)。
pattern_fore_colour #设置填充的前景色,默认64
pattern_back_colour #设置填充的背景色,默认65
ps:背景色设置的意义不大,一般excel里设置的填充都是设置前景色。
3.5.3 实例
import xlwt #导入xlwt
wb = xlwt.Workbook() #创建一个新的工作薄
ws = wb.add_sheet('sheet1') #创建一个工作表
style = xlwt.XFStyle()
cell_pattern = xlwt.Pattern()
cell_pattern.pattern = 1 #设置填充
cell_pattern.pattern_fore_colour = 0x0D #设置填充前景色
style.pattern = cell_pattern
ws.write(0, 0, '默认')
ws.write(1, 1, '黄色',style)
wb.save('填充.xls') #保存excel
结果:
3.6 保护(Protection)
3.6.1 获取保护样式信息
import xlwt
cell_protection = xlwt.Protection()
pattern_info = cell_protection._search_key()
print(pattern_info)
运行结果:
(1, 0)
对应的格式是:
(cell_locked, formula_hidden)
3.6.2 可设置项
cell_locked #设置单元格是否锁定,默认为锁定:1。不锁定:0
formula_hidden #设置公式是否隐藏,默认为不隐藏0。隐藏:1
注意:保护样式的格式设置必须启用保护工作表才能使用。
启用保护工作表:
import xlwt #导入xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
ws.set_protect(1) #设置文档保护,默认不保护。保护的话文件只能查看不能编辑了,要撤消保护才能编辑
ws.set_password('123456') #设置密码,撤销保护时输入
ws.write(0, 0,'不能更改')
wb.save('保护.xls')
启用保护后,当要编辑单元格时显示:
我们只有撤销了保护才能继续编辑。
3.6.3 实例
下面我们来看看如何在启用保护的情况下使单元格可编辑以及隐藏公式:
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
#设置文档保护
ws.set_protect(1)
ws.set_password('123456')
#设置可编辑单元格
style_edit = xlwt.XFStyle()
cell_protection_edit = xlwt.Protection()
cell_protection_edit.cell_locked = 0 #在保护状态下,使单元格可编辑
style_edit.protection = cell_protection_edit
#设置隐藏公式
style_hide = xlwt.XFStyle()
cell_protection_hide = xlwt.Protection()
cell_protection_hide.formula_hidden = 1 #隐藏公式
style_hide.protection = cell_protection_hide
#写入表格
ws.write(0, 0,'不能更改')
ws.write(1, 0, xlwt.Formula("-(1+1)"))
ws.write(0, 1,'可以改了',style_edit)
ws.write(1, 1, xlwt.Formula("-(1+1)"),style_hide)
wb.save('保护.xls')
这样我们就能在保护工作表的状态下对单元格B1进行编辑,且对于C2的公式被隐藏了:
04
拓展
4.1 列宽和行高设置
1)列宽设置
sheet.col(colx).width = 4000
设置第colx列(从0开始)的列宽为4000。
2)行高设置
row = worksheet.row(rowx)
style = xlwt.easyxf('font:height 400;')
row.set_style(style)
设置第rowx行(从0开始)的行高为400。
3)实例
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
#设置第1列列宽:4000
ws.col(0).width = 4000
# 设置第2行行高:400
row = ws.row(1)
style = xlwt.easyxf('font:height 400;')
row.set_style(style)
# 往表格写入内容
ws.write(0,0, "设置列宽为4000")
ws.write(0,1, "默认")
ws.write(1,0, "行高400")
wb.save('行高与列宽.xls') #保存excel文件
结果:
4.2 单元格写入公式/超链接
在保护样式里提到了xlwt写入公式,我们可以看到是通过Formula来实现的。其实Formula不仅可以写入公式,还可以写入超链接。
我们来看看一个例子:
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
# 往表格写入内容
ws.write(0,0, "写入文本")
ws.write(1, 1, xlwt.Formula("-(1+1)")) #写入一个公式
ws.write(2, 2, xlwt.Formula('HYPERLINK("https://dwz.date/fkyb";"xlrd教程")')) #写入一个超链接,并设置显示的文本为【xlrd教程】
wb.save('写入公式.xls')
结果:
在单元格B2写入了一个公式:=-(1+1)。
在单元格C3写入了一个显示为【xlrd教程】的超链接,如果我们点击这个单元格,会跳转到我们写入的网址。
大家可以把代码复制然后运行一下哦~
另外关于公式,https://github.com/python-excel/xlwt/blob/master/examples/formulas.py里分享了很多公式实例,大家可以去运行看看。
4.3 写入已有文件
我们上面的内容都是说新建一个工作表然后再写入,那如果我们想在已有的表格里进行修改新增,那要怎么办?
我们可以借助xlrd和xlutils来实现,所以大家得事先安装xlrd和xlutils。
xlrd的安装请看:Python自动化办公:xlrd万字教程。
xlutils的安装:pip install xlutils。
我们以之前生成的文件【xlwt例子.xls】来为例。【xlwt例子.xls】表格内容:
代码:
import xlrd #导入xlrd
from xlutils.copy import copy # 从xlutils导入copy
excel_old = xlrd.open_workbook('xlwt例子.xls') # 打开想要更改的excel文件
excel_new = copy(excel_old) # 利用xlutils.copy函数将操作文件对象拷贝,变成可写的workbook对象
ws = excel_new.get_sheet(0) # 通过索引获取第一个工作表的对象
#ws = excel_new.get_sheet('这是工作表1') # 也可以通过工作表名称获取
ws.write(1, 1, '改后的B2') #B2单元格内容修改为:【改后的B2】
ws.write(2, 0, '新增') # C1单元格新增内容:【新增】
excel_new.save('xlwt例子-1.xls') #另存为excel文件
生成了一个新的工作薄【xlwt例子-1.xls】,它的内容如图:
如果原表格里有样式,大家在修改数据后会发现样式没有保留。
面对这种情况,建议大家看一下这篇文章:https://blog.csdn.net/weixin_39804265/article/details/105127786。
4.4 easyxf配置样式
在开始我们说过xlwt有两种方法写入样式,我们上面用的都是常规方法,下面我们来看看另一种:使用easyxf配置样式。
easyxf函数用于创建和配置XFStyle对象,以与worksheet.write()方法一起使用。
1)语法
xlwt.easyxf(strg_to_parse='',num_format_str=None,field_sep=',',line_sep=';', intro_sep=':',esc_char='\\',debug=False)
2)参数
strg_to_parse:描述具体样式以及格式的字符串
num_format_str:在数字样式里说过,其实就是excel里的自定义部分值。
field_sep、line_sep、intro_sep、esc_char、debug等参数定义了字符串样式的描述规则。
比如【field_sep=','】、【line_sep=';'】、【intro_sep=':'】是说一个样式的不同格式用【,】分割,不同样式之间用【;】分割,样式和格式之间用【:】表示。
这些属性一般不需要修改,保持默认即可,除非你想自定义描述规则,就需要修改相应的参数。
3)实例
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
#创建一个样式,其内容为【字体样式:Times New Roman字体,加粗;填充样式:显示填充,前景色为红色】,并且数字样式的格式是【#,##0.00】
style = xlwt.easyxf('font: name Times New Roman, bold True; pattern: pattern 1, pattern_fore_colour red ',num_format_str='#,##0.00')
ws.write(0, 0, 1234.56)
ws.write(1, 1, 1234.56, style) #带样式写入
wb.save('easyxf例子.xls')
结果:
4.5 颜色索引
字体、边框、填充里都有颜色的设置,其实它们的颜色索引都是一样的(比如红色的索引是2)。
山月也把颜色的索引都给大家整理出来了,大家可以保存一下。
ps:索引里的2就是0x02,只是0x02是2的十六进制表达方式。
比如10是0x0A(16进制采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F),33是0x21(2*16+1=33)。
从图中可以看到5和13都是黄色,5对应的16进制是0x05,13对应的16进制是0x0D。
我们来看看例子:
import xlwt
wb = xlwt.Workbook()
ws = wb.add_sheet('sheet1')
style_1 = xlwt.easyxf('font: colour_index 13 ') #字体颜色索引为13
style_2 = xlwt.easyxf('pattern: pattern 1, pattern_fore_colour 0x0D ') #填充颜色索引为16进制的13:0x0D
ws.write(0, 0, '默认')
ws.write(1, 1, '黄色字体', style_1)
ws.write(2, 2, '黄色填充', style_2)
wb.save('例子.xls')
结果:
好啦,关于xlwt带格式写入单元格的教程就到这。希望对大家有所帮助
最后,关于xlwt工作表的一些设置,比如冻结窗口、插入位图、合并单元格等,我们在下一篇再介绍~
为了不迷路,记得关注哦。
已经到底啦~(≧▽≦*)/~
建议收藏:68个Python内置函数详解
2021-12-05
建议收藏:超全的100个Pandas函数汇总
2021-12-16
初识Tkinter:一些必须掌握的基础知识
2021-12-09
这三个宝藏软件,我不允许还有人不知道!
2021-12-15
点击阅读原文,获得更多精彩内容