openpyxl 是一个非常强大和流行的 Python 库,它允许你读取、写入、修改 Excel 2010 及更高版本的 .xlsx 文件。

目录
- 准备工作:安装
openpyxl - 核心概念:
Workbook,Worksheet,Cell - 实战操作
- 创建新 Excel 文件并写入数据
- 读取现有 Excel 文件
- 修改现有 Excel 文件
- 样式设置(字体、颜色、边框等)
- 合并和拆分单元格
- 使用公式
- 调整行高和列宽
- 高级技巧
- 使用图表
- 处理大文件(只读模式)
- 总结与最佳实践
准备工作:安装 openpyxl
在使用之前,你需要先安装这个库,打开你的终端或命令行,运行以下命令:
pip install openpyxl
核心概念
理解 openpyxl 的三个核心对象至关重要:
Workbook(工作簿): 一个 Excel 文件就是一个Workbook对象,你可以把它想象成一个完整的 Excel 文件。Worksheet(工作表): 一个Workbook可以包含多个Worksheet(Sheet1, Sheet2),你可以通过名称或索引来访问它们。Cell(单元格):Worksheet中的每一个格子就是一个Cell对象,它包含值、样式等信息。
实战操作
1 创建新 Excel 文件并写入数据
这是最常见的操作,从零开始创建一个 Excel 表格。
from openpyxl import Workbook
# 1. 创建一个新的工作簿
wb = Workbook()
# 2. 获取活动工作表(默认创建的第一个工作表)
ws = wb.active
# 3. 给工作表命名= "销售数据"
# 4. 写入数据到单元格
# 直接通过赋值写入
ws['A1'] = '产品名称'
ws['B1'] = '销量'
ws['C1'] = '单价'
ws['D1'] = '总收入'
# 使用 append() 方法向工作表追加一行(非常方便)
ws.append(['苹果', 150, 8.5, 0])
ws.append(['香蕉', 200, 6.0, 0])
ws.append(['橙子', 120, 7.5, 0])
# 5. 保存工作簿
# 注意:文件名后缀必须是 .xlsx
wb.save("sales_report.xlsx")
print("新文件 'sales_report.xlsx' 已创建。")
2 读取现有 Excel 文件
现在我们来读取刚刚创建的 sales_report.xlsx 文件。

from openpyxl import load_workbook
# 1. 加载现有的工作簿
# data_only=True 表示读取单元格的值(而不是公式本身)
wb = load_workbook(filename='sales_report.xlsx', data_only=True)
# 2. 获取特定工作表
# 通过名称获取
ws = wb["销售数据"]
# 或者通过索引获取 (0-based)
# ws = wb.worksheets[0]
# 3. 读取单个单元格的值
product_name = ws['A1'].value
print(f"A1 单元格的值是: {product_name}")
# 4. 读取一行或一列的数据
# 读取第一行(标题行)
header_row = ws[1]
print("标题行:", [cell.value for cell in header_row])
# 读取 A 列的所有产品名称
product_column = ws['A']
# 跳过第一行的标题
products = [cell.value for cell in product_column[1:]]
print("所有产品:", products)
# 5. 遍历整个工作表
print("\n遍历整个工作表:")
for row in ws.iter_rows(min_row=2, max_row=4, min_col=1, max_col=4):
for cell in row:
print(f"单元格 {cell.coordinate} 的值是 {cell.value}", end="\t")
print() # 换行
# 6. 关闭工作簿(好习惯)
wb.close()
3 修改现有 Excel 文件
修改文件与创建类似,但第一步是 load_workbook 而不是 Workbook()。
from openpyxl import load_workbook
# 1. 加载文件
wb = load_workbook('sales_report.xlsx')
ws = wb["销售数据"]
# 2. 修改特定单元格的值
# 修改苹果的销量
ws['B2'] = 180
# 3. 计算并写入总收入
# 假设我们在 D2, D3, D4 单元格使用公式
ws['D2'] = '=B2*C2'
ws['D3'] = '=B3*C3'
ws['D4'] = '=B4*C4'
# 4. 添加新行
ws.append(['葡萄', 90, 12.0, '=B5*C5'])
# 5. 保存修改(会覆盖原文件,建议先备份!)
# 如果想另存为新文件,可以使用 wb.save("new_filename.xlsx")
wb.save('sales_report_modified.xlsx')
print("文件已修改并保存为 'sales_report_modified.xlsx'。")
wb.close()
4 样式设置
openpyxl 提供了丰富的样式功能。
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
wb = Workbook()
ws = wb.active= "样式示例"
# 1. 设置字体
# 创建一个加粗、大小为 16、颜色为红色的字体对象
bold_font = Font(name='Arial', size=16, bold=True, color="FF0000")
ws['A1'] = "标题"
ws['A1'].font = bold_font
# 2. 设置填充颜色(背景色)
# 创建一个黄色的填充对象
yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
ws['B1'] = "高亮"
ws['B1'].fill = yellow_fill
# 3. 设置边框
# 创建一个细线边框
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
ws['C1'] = "带边框"
ws['C1'].border = thin_border
# 4. 设置对齐方式
# 水平和垂直居中
center_alignment = Alignment(horizontal="center", vertical="center")
ws['D1'] = "居中"
ws['D1'].alignment = center_alignment
# 5. 应用样式到整个区域
# 给 A2:D5 区域添加边框
for row in ws['A2:D5']:
for cell in row:
cell.border = thin_border
wb.save("styled_example.xlsx")
wb.close()
5 合并和拆分单元格
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 在 A1 到 C1 区域写入一个标题
ws.merge_cells('A1:C1')
ws['A1'] = "合并后的标题"
# 在 A2 到 B2 区域写入内容
ws.merge_cells('A2:B2')
ws['A2'] = "合并的单元格"
# 拆分单元格
# 注意:拆分时,只有左上角的单元格会保留内容
ws.unmerge_cells('A1:C1')
ws['A1'] = "A1"
ws['B1'] = "B1"
ws['C1'] = "C1"
wb.save("merge_example.xlsx")
wb.close()
6 使用公式
在 openpyxl 中,你只需将公式字符串写入单元格即可,它会自动识别。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A1'] = '10'
ws['B1'] = '20'
ws['C1'] = '=A1+B1' # 直接写入公式字符串
wb.save("formula_example.xlsx")
wb.close()
7 调整行高和列宽
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws['A1'] = "这是一个很长的文本,用来测试列宽是否能够自动调整。"
# 设置列宽(单位是字符宽度)
# 设置 A 列宽度为 30 个字符
ws.column_dimensions['A'].width = 30
# 设置行高(单位是点,1点约等于1/72英寸)
# 设置第一行高度为 20 点
ws.row_dimensions[1].height = 20
wb.save("dimension_example.xlsx")
wb.close()
高级技巧
1 使用图表
openpyxl 可以在 Excel 中创建各种图表。

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
wb = Workbook()
ws = wb.active
# 准备数据
ws.append(['产品', '销量'])
ws.append(['苹果', 50])
ws.append(['香蕉', 80])
ws.append(['橙子', 30])
# 1. 创建一个柱状图对象
chart = BarChart()
# 2. 设置图表标题和坐标轴标题
chart.title = "产品销量图"
chart.y_axis.title = '销量'
chart.x_axis.title = '产品'
# 3. 定义数据范围
# 数据范围是 B2:B4 (销量)
data = Reference(ws, min_col=2, min_row=2, max_row=4)
# 类别标签范围是 A2:A4 (产品名)
cats = Reference(ws, min_col=1, min_row=2, max_row=4)
# 4. 添加数据
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
# 5. 将图表添加到工作表的指定位置
# 从 E1 单元格开始放置
ws.add_chart(chart, "E1")
wb.save("chart_example.xlsx")
wb.close()
2 处理大文件(只读模式)
处理非常大的 Excel 文件时,openpyxl 的默认模式会消耗大量内存,这时可以使用 read_only=True 模式。
注意: 在 read_only 模式下,你不能修改或写入文件。
from openpyxl import load_workbook
# 使用 read_only=True 模式打开
wb = load_workbook(filename='very_large_file.xlsx', read_only=True)
ws = wb.active
# 可以正常读取数据
for row in ws.iter_rows(values_only=True): # values_only=True 更高效
print(row)
# 关闭工作簿非常重要,尤其是在只读模式下
wb.close()
总结与最佳实践
- 明确操作: 先想清楚你是要创建新文件还是修改旧文件,这决定了你是用
Workbook()还是load_workbook()。 - 备份文件:
wb.save()会直接覆盖原文件,在修改重要文件前,务必备份一份。 - 善用循环: 使用
for row in ws.iter_rows(...)是遍历数据的最高效方式。 - 关闭工作簿: 虽然在脚本结束时 Python 会自动回收资源,但显式地调用
wb.close()是一个好习惯,尤其是在read_only模式下。 - 样式复用: 如果你需要应用相同的样式到多个单元格,先创建样式对象(如
Font(...)),然后赋值给各个单元格,而不是重复创建。
openpyxl 功能非常强大,以上只是冰山一角,你可以查阅其官方文档来探索更多高级功能,比如图片插入、条件格式等,希望这份指南对你有帮助!
