openpyxl(二)

35 阅读3分钟

一、介绍

在第一篇关于 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) # 隶书

八、创建一个命名样式

以上内容是针对单元格的样式操作,如果我们想给某个单元格设置 FontBorder 那么就需要给单元格分别赋值两次,如: 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')