Python 读写 Excel:openpyxl - (3)单元格样式设置
在数据分析、报表生成以及自动化办公等领域,Excel 文件是非常常用的一种数据存储格式。Python 的 openpyxl
库可以帮助我们轻松地读写 Excel 文件,并对单元格的样式进行灵活的设置,以满足不同的需求。本篇文章将详细介绍如何使用 openpyxl
设置单元格的样式,并通过案例与实例进行说明。
1. 简介
openpyxl
是一个用于读取和写入 Excel 文件(.xlsx 格式)的 Python 库。它不仅支持基本的读写操作,还允许用户对单元格的样式进行细致的控制,包括字体、颜色、边框、填充等。
1.1 安装 openpyxl
在开始之前,需要确保已安装 openpyxl
库。可以使用 pip 来安装:
bashCopy Codepip install openpyxl
2. 基础知识
在使用 openpyxl
设置单元格样式之前,先了解一些基础概念。
2.1 工作簿和工作表
- 工作簿(Workbook): 一个 Excel 文件,一个工作簿可以包含多个工作表。
- 工作表(Worksheet): 每个工作簿中的一张表格,用于存放数据。
2.2 单元格(Cell)
单元格是工作表中的最小数据容器,每个单元格都有一个地址,如 A1、B2 等。
3. 单元格样式设置
openpyxl
提供了多种样式设置功能,包括字体、颜色、边框、填充等。以下是几种常见的样式设置及其示例。
3.1 字体样式
可以设置字体的大小、颜色、粗体、斜体等属性。
示例代码:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Font
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置单元格 A1 的字体样式
font = Font(name='Arial', bold=True, italic=True, color='FF0000')
ws['A1'].font = font
ws['A1'] = "Hello, World!"
# 保存文件
wb.save('styled.xlsx')
3.2 背景填充
可以设置单元格的背景颜色。
示例代码:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import PatternFill
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置单元格 A1 的背景填充
fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
ws['A1'].fill = fill
ws['A1'] = "Highlighted Cell"
# 保存文件
wb.save('filled.xlsx')
3.3 边框样式
可以为单元格添加边框样式。
示例代码:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Border, Side
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置边框样式
thin = Side(border_style="thin", color="000000")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
ws['A1'].border = border
ws['A1'] = "Bordered Cell"
# 保存文件
wb.save('bordered.xlsx')
3.4 组合样式
可以同时设置字体、填充、边框等样式。
示例代码:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置字体
font = Font(name='Arial', bold=True, color='FFFFFF')
# 设置填充
fill = PatternFill(start_color='0000FF', end_color='0000FF', fill_type='solid')
# 设置边框
thin = Side(border_style="thin", color="000000")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
# 应用样式到单元格
ws['A1'].font = font
ws['A1'].fill = fill
ws['A1'].border = border
ws['A1'] = "Styled Cell"
# 保存文件
wb.save('combined_styles.xlsx')
4. 实际应用场景
在实际应用中,单元格样式设置可以大大提高 Excel 报表的可读性和美观性。以下是几个具体的应用场景。
4.1 数据报告
在生成数据报告时,可以使用不同的颜色和字体来突出关键数据。例如,将重要的销售数据使用红色字体标记,或者用背景颜色区分不同的类别。
代码示例:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置标题行样式
header_fill = PatternFill(start_color='CCCCCC', end_color='CCCCCC', fill_type='solid')
header_font = Font(bold=True)
headers = ['Product', 'Sales', 'Profit']
ws.append(headers)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
# 添加数据并高亮显示利润大于100的单元格
data = [
['Product A', 300, 150],
['Product B', 450, 90],
['Product C', 200, 120]
]
for row in data:
ws.append(row)
# 检查并设置样式
if row[2] > 100:
ws.cell(row=ws.max_row, column=3).font = Font(color='FF0000')
ws.cell(row=ws.max_row, column=3).fill = PatternFill(start_color='FFFF00', fill_type='solid')
# 保存文件
wb.save('sales_report.xlsx')
4.2 学生成绩单
在生成学生成绩单时,可以使用不同的颜色标记成绩等级,例如及格、不及格的学生。
代码示例:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
# 创建一个工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置标题
ws.append(['Name', 'Score'])
# 设置样式
passing_fill = PatternFill(start_color='C6EFCE', fill_type='solid')
failing_fill = PatternFill(start_color='FFC7CE', fill_type='solid')
# 添加学生成绩
students = [
['Alice', 85],
['Bob', 45],
['Charlie', 70],
]
for student in students:
ws.append(student)
# 检查成绩并设置样式
if student[1] >= 60:
ws.cell(row=ws.max_row, column=2).fill = passing_fill
else:
ws.cell(row=ws.max_row, column=2).fill = failing_fill
# 保存文件
wb.save('grades.xlsx')
5. 进阶技巧
5.1 使用自定义样式类
为了重用样式,可以创建一个自定义样式类,这样在处理大量数据时可以大大简化代码。
代码示例:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side
class Styles:
def __init__(self):
self.header_font = Font(bold=True)
self.header_fill = PatternFill(start_color='CCCCCC', fill_type='solid')
self.pass_fill = PatternFill(start_color='C6EFCE', fill_type='solid')
self.fail_fill = PatternFill(start_color='FFC7CE', fill_type='solid')
styles = Styles()
# 创建工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置标题
ws.append(['Name', 'Score'])
for cell in ws[1]:
cell.font = styles.header_font
cell.fill = styles.header_fill
# 添加成绩
students = [
['Alice', 85],
['Bob', 45],
['Charlie', 70],
]
for student in students:
ws.append(student)
if student[1] >= 60:
ws.cell(row=ws.max_row, column=2).fill = styles.pass_fill
else:
ws.cell(row=ws.max_row, column=2).fill = styles.fail_fill
# 保存文件
wb.save('grades_with_styles.xlsx')
5.2 动态样式设置
根据特定条件动态调整样式,例如根据日期变化设置不同的颜色。
代码示例:
pythonCopy Codefrom openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from datetime import datetime
# 创建工作簿和工作表
wb = Workbook()
ws = wb.active
# 设置标题
ws.append(['Event', 'Date'])
# 添加事件
events = [
['Project Deadline', datetime(2024, 10, 15)],
['Meeting', datetime(2024, 10, 2)],
]
# 动态设置样式
for event in events:
ws.append(event)
if event[1] < datetime.now():
ws.cell(row=ws.max_row, column=2).fill = PatternFill(start_color='FF0000', fill_type='solid') # 过去的事件
elif (event[1] - datetime.now()).days <= 7:
ws.cell(row=ws.max_row, column=2).fill = PatternFill(start_color='FFFF00', fill_type='solid') # 即将到来的事件
# 保存文件
wb.save('dynamic_dates.xlsx')
6. 总结
本文介绍了如何使用 openpyxl
设置 Excel 单元格的样式,包括字体、填充、边框等多种属性,并通过具体的案例展示了如何在实际应用中运用这些样式设置。掌握这些技巧后,可以更高效地生成美观的 Excel 报表。
在数据分析、报告生成和自动化办公等场景中,合理使用单元格样式,将有助于提升工作效率和数据的可读性。希望本文能够帮助你在实际项目中更好地应用 openpyxl
。
7. 参考文献
通过不断练习和应用这些知识,相信你会在 Excel 自动化处理上越来越得心应手。