前面几个章节,简单介绍了openpyxl模块及使用该模块对Excel文件进行简单操作,并通过一个实战项目(人口数据统计)展示了使用openpyxl模块处理Excel文件的优势。今天,我们主要梳理通过openpyxl如何对Excel文件的单元格样式进行编辑。也许有人要问对于Excel文件中的单元格直接利用鼠标键盘进行编辑设置是很方便的,为什么要使用openpyxl进行设置呢?试想,如果Excel文件足够大,比如几M或者更大,某些低配电脑打开这些大文件都是很不方便的(大部分办公电脑配置都不高哦),别提利用鼠标对个别单元格样式进行设置了,查找就很不方便的……这次我们利用上节课实战中得到的人口统计表对表格中的样式进行设置,看看使用openpyxl设置单元格样式的方便之处。
一、单元格样式简介
openpyxl处理Excel文件中单元格样式,总共有六个属性类。分别是:font(字体类,可设置字号、字体颜色、下划线等)、fill(填充类,可设置单元格填充颜色等)、border(边框类,可以设置单元格各种类型的边框)、alignment(位置类、可以设置单元格内数据各种对齐方式)、number_format(格式类,可以设置单元格内各种类型的数据格式)、protection(保护类,可以设置单元格写保护等)。
二、单元格样式设置实例
我们使用官方文档的例子进行梳理。
(一)基本用法
>>> fromopenpyxl.stylesimportPatternFill, Border, Side, Alignment, Protection, Font
>>> font = Font(name=Calibri,
... size=11,
... bold=False,
... italic=False,
... vertAlign=None,
... underline= one,
... strike=False,
... color=FF000000)
>>> fill = PatternFill(fill_type=None,
... start_color=FFFFFFFF,
... end_color=FF000000)
>>> 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=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,
... vertical=ottom,
... text_rotation=0,
... wrap_text=False,
... shrink_to_fit=False,
... indent=0)
>>> number_format = General
>>> protection = Protection(locked=True,
... hidden=False)
上述官网介绍的几种属性,通过字面意思很容易了解样式的具体设置,但是,需要强调的是以上几种样式(字体、填充、边框、位置、格式和保护)实例一旦被创建,实例的属性是不可修改的,要想修改属性,只能重新定义一种新的样式实例。
如:fill = PatternFill(fill_type=None,
... start_color=FFFFFFFF,
... end_color=FF000000)
如果你想将fill的start_color和end_color的颜色值互换,使用fill.end_color=FFFFFFFF;fill.start_color=FF000000是不可以的,只能重新定义一个fill实例。
(二)样式可以被复制
>>> from openpyxl.styles import Font
>>> from copy import copy
>>> ft1 = Font(name=Arial, size=14)
>>> ft2 = copy(ft1)
>>> ft2.name = "Tahoma"
>>> ft1.name
>>> ft2.name
Tahoma
>>> ft2.size
14.0
(三)定义字体颜色
字体颜色既可以使用颜色常量,也可以按照索引创建颜色实例。
>>> from openpyxl.styles import Font
>>> from openpyxl.styles.colors import RED
>>> font = Font(color=RED)
>>> font = Font(color="FFBB00")
>>> from openpyxl.styles.colors import Color
>>> c = Color(indexed=32)
>>> c = Color(theme=6, tint=0.5)
(四)如何应用样式
可以直接应用到具体单元格,还可以整行整列应用样式,但整行整列应用时单元格必须是已经创建好的单元格。
>>> from openpyxl.workbook import Workbook
>>> from openpyxl.styles import Font, Fill
>>> wb = Workbook()
>>> ws = wb.active
>>> c = ws[A1]
>>> c.font = Font(size=12)
>>> col = ws.column_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[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("styled.xlsx")
三、综合实例
将上节课中的“population.xlsx”中的样式进行设置,样式如下:
除标题行外有内容的单元格居中显示,加边框;
(1)标题行A1:D1合并居中,更改标题为“20XX年X国人口统计表”,设置宋体加粗居中,大小24,颜色默认;
(2)行标题字体’黑体’,大小16,红色,加粗显示,背景色蓝色
(3)正文字体’宋体’,大小14,蓝色,不加粗,背景色黄色。
不赘述,直接上代码:
import openpyxl
from openpyxl.styles import PatternFill,
Border, Side, Alignment, Font
from openpyxl.styles.colors import RED,
YELLOW, BLUE, BLACK
alignment=Alignment(horizontal=center,
vertical=center)
thin = Side(border_style="thin",
color=BLACK)
border = Border(top=thin, left=thin, right=thin, bottom=thin)
row_title_font = Font(name=黑体, size=16, bold=True, color=RED)
row_title_fill = PatternFill(fill_type=solid,fgColor=BLUE)
content_font = Font(name=宋体, size=14, bold=False,color=BLUE)
content_fill = PatternFill(fill_type=solid,fgColor=YELLOW)
title_font = Font(name="宋体", bold=True, size=24)
# 打开并编辑
wb = openpyxl.load_workbook("population.xlsx")
ws = wb.get_sheet_by_name("20XX年X国人口统计")
# 标题合并居中
ws.merge_cells("A1:D1")
top_left_cell = ws[A1]
top_left_cell.value = "20XX年X国人口统计表"
top_left_cell.font = title_font
for row in ws.rows:
for cell in row:
cell.alignment = alignment
if cell.row == 1:
continue
elif cell.row == 2:
cell.border = border
cell.font = row_title_font
cell.fill = row_title_fill
else:
cell.border = border
cell.font = content_font
cell.fill = content_fill
# 保存结果
wb.save("population.xlsx")
程序运行后,Excel表格变成了这个样子,可以发挥自己的想象自定义样式,整个表格样式处理时间1分钟左右,别诟病这个时间,要知道这个表格大小是2M多,有7万多条数据的。
四、程序展望
虽然处理样式在openpyxl处理Excel的过程中是个“鸡肋”功能。但是,如果有一天老板让你把几万行数据样式都处理的漂亮一点(亲身经历),当你面对这几万行数据的时候,你就会后悔当初没多学一点……所以,书到用时方恨少,能多学就多学点吧!
样式处理只要记住style的6个大类,程序应用中提前定义好样式内容,然后在cell中赋予响应的样式内容即可,处理过程非常简单,多练习就会融会贯通!
用程序处理样式应用场景自己总结主要有两个地方:一是数据量非常庞大时;二是对大数据表格间断的某几行进行格式化定制时。这两个场景使用openpyxl处理会达到事半功倍的效果。
未完待续
如果觉得《Python利用openpyxl处理Excel文件(单元格样式设置)》对你有帮助,请点赞、收藏,并留下你的观点哦!