Python 读写 Excel:openpyxl - (3)单元格样式设置

在数据分析、报表生成以及自动化办公等领域,Excel 文件是非常常用的一种数据存储格式。Python 的 openpyxl 库可以帮助我们轻松地读写 Excel 文件,并对单元格的样式进行灵活的设置,以满足不同的需求。本篇文章将详细介绍如何使用 openpyxl 设置单元格的样式,并通过案例与实例进行说明。

1. 简介

openpyxl 是一个用于读取和写入 Excel 文件(.xlsx 格式)的 Python 库。它不仅支持基本的读写操作,还允许用户对单元格的样式进行细致的控制,包括字体、颜色、边框、填充等。

1.1 安装 openpyxl

在开始之前,需要确保已安装 openpyxl 库。可以使用 pip 来安装:

bashCopy Code
pip install openpyxl

2. 基础知识

在使用 openpyxl 设置单元格样式之前,先了解一些基础概念。

2.1 工作簿和工作表

  • 工作簿(Workbook): 一个 Excel 文件,一个工作簿可以包含多个工作表。
  • 工作表(Worksheet): 每个工作簿中的一张表格,用于存放数据。

2.2 单元格(Cell)

单元格是工作表中的最小数据容器,每个单元格都有一个地址,如 A1、B2 等。

3. 单元格样式设置

openpyxl 提供了多种样式设置功能,包括字体、颜色、边框、填充等。以下是几种常见的样式设置及其示例。

3.1 字体样式

可以设置字体的大小、颜色、粗体、斜体等属性。

示例代码:

pythonCopy Code
from 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 Code
from 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 Code
from 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 Code
from 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 Code
from 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 Code
from 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 Code
from 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 Code
from 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 自动化处理上越来越得心应手。