一、介绍
在第一篇关于 openpyxl 的文章中主要介绍了 openpyxl 的基本使用方法,这篇文章主要介绍 openpyxl 如何操作 excel 样式,样式用于改变表格数据呈现在屏幕上的样子。
样式可以应用在以下几个层面
- 设置字体大小、颜色、下划线等
- 填充图案或者颜色渐变
- 设置单元格的边框
- 单元格的排列方式
- 保护
二、设置单元格字体样式
import openpyxl
from openpyxl.styles import Font
wb = openpyxl.load_workbook('yourFile.xlsx')
ws = wb.active
font = Font(name='隶书', # 字体类型
size=11, # 字体大小
bold=False, ## 是否粗体
italic=False, # 是否斜体
vertAlign=None, # 对齐方式,取值有:subscript | baseline | superscript
underline=None, # 添加下划线,取值有:doubleAccounting | single | singleAccounting | double
strike=False, # 是否添加删除线
color='FF000000') # 字体样色
cell = ws.cell(row=1, column=1, value='zjl')
cell.font = font
wb.save('yourFile.xlsx')
二、设置单元格填充样式
import openpyxl
from openpyxl.styles import PatternFill
wb = openpyxl.load_workbook('test.xlsx')
ws = wb.active
'''
1.fill_type: 填充模式
取值有:'lightTrellis', 'darkTrellis', 'darkHorizontal', 'darkVertical', 'gray0625',
'darkDown', 'lightGray', 'lightGrid', 'lightVertical', 'darkGray',
'solid', 'darkGrid', 'mediumGray', 'gray125', 'lightUp', 'lightDown', 'darkUp', 'lightHorizontal'
2.start_color:起始颜色
3.end_color:结束颜色
'''
fill = PatternFill(fill_type=None,
start_color='FFFFFFFF',
end_color='faa755')
cell = ws.cell(row=1, column=1, value='zjl')
cell.fill = fill
wb.save('copy_test.xlsx')
三、设置边框
from openpyxl.styles import Border, Side
'''
1. border_style 可选值:'dotted', 'slantDashDot', 'dashDotDot', 'dashDot', 'hair', 'thin', 'mediumDashed',
'double', 'thick', 'mediumDashDot', 'dashed', 'mediumDashDotDot', 'medium'
'''
border = Border(left=Side(border_style=None, color='FF000000'), # 左边框类型、颜色
right=Side(border_style=None, color='FF000000'), # 右边框类型、颜色
top=Side(border_style=None, color='FF000000'), # 上边框类型、颜色
bottom=Side(border_style=None, color='FF000000'), # 下边框类型、颜色
diagonal_direction=1, # 单元格对角线的方向
diagonal=Side(border_style='mediumDashDot', color='7a1723'), # 单元格对角线的样式
outline=Side(border_style='thin', color='1d953f'), # 外边框
vertical=Side(border_style='thin', color='11264f'), # 垂直方向边框样式
horizontal=Side(border_style='thin',color='11264f') # 水平方向边框样式
)
cell = ws.cell(row=3, column=4, value='zjl')
cell.border = border
我尝试设置了:diagonal_direction、diagonal、outline、vertical、horizontal 这几个参数,但都没有效果,不知道是不是 wps 版本的问题还是 openpyxl 版本的问题。
四、设置对齐
from openpyxl.styles import Alignment
'''
horizontal取值:'right', 'center', 'fill', 'justify', 'distributed', 'general', 'centerContinuous', 'left'
vertical取值:'top', 'justify', 'center', 'bottom', 'distributed'
'''
alignment=Alignment(horizontal='left', # 单元格文字水平对齐方式
vertical='bottom', # 单元格文字垂直方向对齐方式
text_rotation=0, # 文本旋转角度
wrap_text=False, # 长度超过单元格时文本是否换行
shrink_to_fit=True, # 文本是否自适应 文字太多时会自动缩小文本字体大小
indent=2) # 文本缩进
cell = ws.cell(row=3, column=4, value='zjl')
cell.alignment = alignment
五、设置单元格数字内容格式
cell = ws.cell(row=3, column=4, value='zjl')
cell.number_format = 'General'
六、单元格保护模式
from openpyxl.styles import Protection
cell = ws.cell(row=3, column=4, value='zjl')
cell.protection = Protection(
locked=True, # 是否锁定单元格
hidden=False # 是否隐藏单元格
)
注意:只有保护工作表 (在“审阅”选项卡中,点击“保护工作表”按钮)后,锁定单元格或隐藏公式才有效。
七、样式复制
from openpyxl.styles import Font
from copy import copy
font = Font(name='宋体')
font2 = copy(font)
font2.name = '隶书'
print(font.name) # 宋体
print(font2.name) # 隶书
八、创建一个命名样式
以上内容是针对单元格的样式操作,如果我们想给某个单元格设置 Font 和 Border 那么就需要给单元格分别赋值两次,如: cell.font = font cell.border = border 上面的操作会略显麻烦,比如想设置多个样式那就要赋值多次,那么有没有只需赋值一次的方法。 恰好 openpyxl 提供了另一个方式那就是新建一个命名样式。
from openpyxl import Workbook
from openpyxl.styles import NamedStyle, Font, Border, Side
wb = Workbook()
ws = wb.active
named_style = NamedStyle(name='namestyle')
named_style.font = Font(bold=True, size=20)
bd = Side(style='thick', color='f173ac')
named_style.border = Border(top=bd, right=bd, bottom=bd, left=bd)
# 一旦赋值该命名样式后,该样式在该工作簿中会被自动注册,下次给单元格设置样式时可以直接通过名称设置
ws['A1'].style = named_style
# 第二种手动注册方式(注意不能和上面同时存在,因为一个样式不能注册两次,会报错)两种方法选一种即可。
# wb.add_named_style(named_style)
ws['C3'].style = 'namestyle'
wb.save('nameStyle.xlsx')