Python-openpyxl教程11 - 注释和样式

前文:
Python-openpyxl教程5 - 与Pandas交互
Python-openpyxl教程6 - 图表之面积图和条形图
Python-openpyxl教程7 - 图表之散点图,饼图和环形图
Python-openpyxl教程8 - 图表之雷达图,股价图和曲面图图
Python-openpyxl教程9 - 轴使用之轴限制和比例
Python-openpyxl教程10 - 图表布局,填充图案以及进阶图表


注释

\color {red} {!警告}
openpyxl当前仅支持读和写注释文本。

向单元格添加注释

注释具有text属性和author属性,必须同时设置它们。

from openpyxl import Workbook
from openpyxl.comments import Comment

wb = Workbook()
ws = wb.active

comment = ws['A1'].comment
comment = Comment('This is the comment text', 'Comment Author')
print(comment.text)
print(comment.author)

加载和保存评论

加载时工作薄中存在的注释会自动存储在其相应单元格的注释属性中。格式信息(如字体大小,粗体和斜体)以及注释的容器框的原始尺寸和位置都将丢失。

保存工作薄时保留在工作薄中的注释会自动保存到工作薄文件中

注释尺寸可以指定为只写。评论尺寸以像素为单位。

from openpyxl import Workbook
from openpyxl.comments import Comment
from openpyxl.utils import units

wb = Workbook()
ws = wb.active

comment = Comment('Text', 'Author')
comment.width = 300
comment.height = 50

ws['A1'].comment = comment

wb.save('SampleCommentedBook.xlsx')
SampleCommentBook

如果需要, openpyxl.utils.units包含用于从其他度量单位(例如mm或点)转换为像素的辅助函数:

from openpyxl import Workbook
from openpyxl.comments import Comment
from openpyxl.utils import units

wb = Workbook()
ws = wb.active

comment = Comment('Text', 'Author')
comment.width = units.points_to_pixels(300)
comment.height = units.points_to_pixels(50)

ws['A1'].comment = comment

使用样式

介绍

样式用于屏幕上显示时更改数据的外观。他们还用于确定数字的格式。

样式可以应用于以下方面:
- 用于设置字体大小,颜色,下划线等的字体
- 填充以设置图案或颜色渐变
- border可以设置单元格的边框
- 单元格对齐
- 保护

以下是默认值:

from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

# 字体
font = Font(
    name='Calibri',  # 字体名称
    size=11,  # 字体大小
    bold=False,  # 字体加粗
    italic=False,  # 字体斜体
    vertAlign=None,  # 垂直对齐:'superscript', 'subscript', 'baseline'
    underline='none',  # 下划线
    strike=False,  # 删除线
    color='FF000000'  # 字体颜色
)

# 填充
fill = PatternFill(
    fill_type=None,
    # 填充类型:'mediumGray', 'lightDown', 'gray0625', 'lightGray', 'lightVertical', 'darkGray', 'darkVertical', 'gray125', 'darkDown', 'lightUp', 'darkHorizontal', 'solid', 'darkGrid', 'lightTrellis', 'lightGrid', 'darkTrellis', 'lightHorizontal', 'darkUp'
    start_color='FFFFFFFF',
    end_color='FF000000'
)

# 边框
border = Border(
    left=Side(border_style=None, color='FF000000'),
    # 线条边框样式:'dashed', 'thick', 'hair', 'thin', 'dashDotDot', 'mediumDashDot', 'medium', 'double', 'dotted', 'dashDot', 'mediumDashed', 'slantDashDot', 'mediumDashDotDot'
    right=Side(border_style=None, color='FF000000'),
    top=Side(border_style=None, color='FF000000'),
    bottom=Side(border_style=None, color='FF000000'),
    diagonal=Side(border_style=None, color='FF000000'),
    diagonal_direction=0,
    outline=Side(border_style=None, color='FF000000'),
    vertical=Side(border_style=None, color='FF000000'),
    horizontal=Side(border_style=None, color='FF000000')
)

# 对齐
alignment = Alignment(
    horizontal='general',
    # 水平对齐:'left', 'centerContinuous', 'fill', 'center', 'justify', 'distributed', 'right', 'general'
    textRotation=0,  # 文本旋转
    wrap_text=False,  # 文本环绕
    shrinkToFit=False,  # 缩小字体填充
    indent=0  # 文本缩进
)

# 数字格式,暂未找到使用方法
number_format = 'General'

# 保护
protection = Protection(locked=True, hidden=False)

单元格样式和命名样式

有两种类型的样式:单元样式和命名样式,也成为样式模板

单元格样式

单元格样式在对象之间共享,并且一旦分配了它们就无法更改。这样可以避免不必要的副作用,例如,仅更改一个单元格时就可以更改许多单元格的样式。

from openpyxl.styles import colors, Font, Color
from openpyxl import Workbook

wb = Workbook()
ws = wb.active

a1 = ws.cell(row=1, column=1)
d4 = ws.cell(row=4, column=4)
ft = Font(color='FF0000')
a1.font = ft
d4.font = ft

a1.font.italic = True

a1.font = Font(color='FF0000', italic=True)

复制样式

样式也可以复制

from openpyxl.styles import Font
from copy import copy

ft1 = Font(name='Arial', size=14)
ft2 = copy(ft1)
ft2.name = 'Tahoma'

print(ft1.name)  # Arial
print(ft2.name)  # Tahoma
print(ft1.size)  # 14.0
print(ft2.size)  # 14.0

颜色

字体,背景,边框等的颜色都可以通过三种方式设置:索引,aRGB或主题。 索引颜色是旧版实现,颜色本身取决于工作薄或应用程序默认提供的索引。主题颜色可用于互补色,但也取决于工作薄中存在的主题,因此,建议使用RGB颜色。

aRGB颜色

RGB颜色使用红色,绿色和蓝色的十六进制值设置

from openpyxl.styles import Font
font = Font(color='FF0000')

理论上,alpha值是指颜色的透明度,但这与单元格样式无关。默认值00将加在任何简单的RGB值之前:

from openpyxl.styles import Font

font = Font(color='00FF00')
print(font.color.rgb)

还支持传统索引颜色以及主题和色彩。

from openpyxl.styles.colors import Color

c = Color(indexed=32)
c = Color(theme=6, tint=0.5)

索引颜色

索引64和65不能设置,并且分别留给系统前景色和背景色


索引颜色

应用样式

样式直接应用于单元格

from openpyxl.workbook import Workbook
from openpyxl.styles import Font, fill

wb = Workbook()
ws = wb.active
cell1 = ws.cell(row=1, column=1)
cell1.font = Font(size=12)

样式也可以应用于行和列,但是请注意,这仅适用于关闭文件后再Excel中创建的单元格。如果要将样式应用于整个行和列,则必须自己将样式应用于每个单元格。这是文件格式的限制:

from openpyxl.workbook import Workbook
from openpyxl.styles import Font, fill

col = ws.cloumn_dimensions['A']
col.font = Font(bold=True)
row = ws.row_dimensions[1]
row.font = Font(underline='single')

样式化合并的单元格

合并的单元格的行为与其他单元格对象相似。其值和格式在其左上角的单元格中定义。为了更改整个合并单元格的边框。请更改其左上角单元格的边框。格式化是出于编写目的而生成的。

from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
from openpyxl import Workbook

wb = Workbook()
ws = wb.active

ws.merge_cells('B2:F4')

top_left_cell = ws.cell(row=2, column=2)  # ws['B2']
top_left_cell.value = 'My Cell'

thin = Side(border_style='thin', color='000000')
double = Side(border_style='double', color='FF0000')

top_left_cell.border = Border(top=double, left=thin, right=thin, bottom=double)
top_left_cell.fill = PatternFill('solid', fgColor='DDDDDD')
top_left_cell.fill = fill = GradientFill(stop=('000000', 'FFFFFF'))
top_left_cell.font = Font(b=True, color='FF0000')
top_left_cell.alignment = Alignment(horizontal='center', vertical='center')

wb.save('SampleStyled.xlsx')

编辑页面设置

from openpyxl.workbook import Workbook

wb = Workbook()
ws = wb.active

ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE  # 纸张方向
ws.page_setup.paperSize = ws.PAPERSIZE_A4  # 纸张大小
ws.page_setup.fitToHeight = 0
ws.page_setup.fitToWidth = 1

命名样式

与单元格样式相反,命名样式是可变的。当您想一次将格式应用于许多不同的单元格时,它们很有意义。注意:将命名样式分配给单元格之后,对样式的其他更改将不会影响该单元格。

一旦将命名样式注册到工作薄中,就可以简单的通过名称来引用它。

创建命名样式

from openpyxl.styles import NamedStyle, Font, Border, Side

highlight = NamedStyle(name='highlight')
highlight.Font = Font(bold=True, size=20)
bd = Side(style='thick', color='000000')
highlight.border = Border(left=bd, top=bd, right=bd, bottom=bd)

创建命名样式后,可以将其注册到工作薄中:
wb.add_name_style(highlight)

但是,命名样式在首次分配给单元时也将自动注册:
ws['A1'].style = highlight

注册后,仅使用名称分配样式:
ws['D5'].style = 'highlight'

使用内置样式

该规范包括一些内置样式,也可以使用,不幸的是,这些样式的名称以本地化形式存储。
openpyxl仅会识别英文名称,并且只能与此处的文字完全一样。如下:

  • Normal # 和没有样式一样

Number formats

  • Comma
  • Comma[0]
  • Currency
  • Currency[0]
  • Percent

Informative

  • Calculation
  • Total
  • Note
  • Warning Text
  • Explanatory Text

Text Styles

  • Title
  • Headline 1
  • Headline 2
  • Headline 3
  • Headline 4
  • Hyperlink
  • Followed Hyperlink
  • Linked Cell

Comparisons

  • Input
  • Output
  • Check Cell
  • Good
  • Bad
  • Neutral

Highlights

  • Accent1
  • 20 % - Accent1
  • 40 % - Accent1
  • 60 % - Accent1
  • Accent2
  • 20 % - Accent2
  • 40 %-Accent2
  • 60 % - Accent2
  • Accent3
  • 20 % - Accent3
  • 40 % - Accent3
  • 60 % - Accent3
  • Accent4
  • 20 % - Accent4
  • 40 % - Accent4
  • 60 % - Accent4
  • Accent5
  • 20 % - Accent5
  • 40 % - Accent5
  • 60 % - Accent5
  • Accent6
  • 20 % - Accent6
  • 40 % - Accent6
  • 60 % - Accent6
  • Pandas

来源:
https://openpyxl.readthedocs.io/en/stable/comments.html
https://openpyxl.readthedocs.io/en/stable/styles.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,548评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,182评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 123,978评论 2 7