python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python openpyxl处理Excel文件

Python使用openpyxl处理Excel文件的操作指南

作者:唤笙(SYL)

openpyxl是用于读写.xlsx格式Excel文件的的Python第三方库,支持操作工作表、单元格、设置样式、插入图表和处理大文件等功能,本文通过7个示例演示了openpyxl的基本用写、读取、样式设置、数据处理和文件生成等功能,帮助读者快速上握openpyxl的使用法

什么是 openpyxl?

openpyxl 是 Python 中用于读写 Excel 文件(.xlsx 格式)的第三方库。它能让您用 Python 程序自动处理 Excel 文件,比如:

主要功能

应用场景

基本概念

在开始示例之前,先了解几个重要概念:

1. 工作簿和工作表

2. 单元格定位

3. 常用方法参数

方法/参数说明示例
load_workbook()打开已存在的文件wb = load_workbook('file.xlsx')
Workbook()创建新工作簿wb = Workbook()
active获取当前活动工作表ws = wb.active
cell(row, column)通过坐标访问单元格ws.cell(1, 1)
['A1']通过 A1 表示法访问ws['A1']
.value获取/设置单元格值cell.value = 'Hello'
save()保存文件wb.save('output.xlsx')

4. 样式相关

入门示例

示例 1:创建第一个 Excel 文件

目标:创建一个新的 Excel 文件,并写入一些数据。

提示:这是最基础的例子。首先需要安装 openpyxl(pip install openpyxl),然后创建 Workbook 对象,获取工作表,写入数据,最后保存。

from openpyxl import Workbook

# 第 1 步:创建新工作簿
wb = Workbook()

# 第 2 步:获取活动工作表(默认创建的第一个工作表)
ws = wb.active

# 第 3 步:设置工作表名称
ws.title = "我的数据"

# 第 4 步:写入数据(使用 A1 表示法)
ws['A1'] = '姓名'
ws['B1'] = '年龄'
ws['A2'] = '张三'
ws['B2'] = 25

# 第 5 步:保存文件
wb.save('示例.xlsx')
print("文件已创建!")

运行效果

关键要点

示例 2:读取现有文件

目标:打开一个已存在的 Excel 文件,读取其中的数据。

提示:使用 load_workbook() 打开文件。注意文件路径要正确,如果文件不存在会报错。

from openpyxl import load_workbook

# 打开已存在的文件
wb = load_workbook('示例.xlsx')

# 获取工作表(通过名称)
ws = wb['我的数据']

# 读取单元格值
name = ws['A1'].value
age = ws['B1'].value

print(f"A1 的值:{name}")
print(f"B1 的值:{age}")

# 读取 A2 和 B2
print(f"姓名:{ws['A2'].value}, 年龄:{ws['B2'].value}")

运行效果

A1 的值:姓名
B1 的值:年龄
姓名:张三, 年龄:25

关键要点

示例 3:使用坐标方式访问单元格

目标:学习用行列数字(坐标)的方式访问单元格,这在循环中更方便。

提示cell(row, column) 方法用数字定位,row 和 column 都从 1 开始。这种方式在批量操作时比 A1 表示法更方便。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 写入表头
ws.cell(1, 1, '产品')  # 第1行第1列
ws.cell(1, 2, '价格')  # 第1行第2列
ws.cell(1, 3, '数量')  # 第1行第3列

# 写入数据
ws.cell(2, 1, '苹果')
ws.cell(2, 2, 5.5)
ws.cell(2, 3, 10)

ws.cell(3, 1, '香蕉')
ws.cell(3, 2, 3.2)
ws.cell(3, 3, 20)

wb.save('商品清单.xlsx')
print("文件已创建!")

运行效果

关键要点

示例 4:批量写入数据

目标:使用循环批量写入多行数据,这是实际应用中最常见的场景。

提示:结合 Python 的循环和列表,可以高效地批量写入数据。注意行号从 1 开始,通常第 1 行是表头。

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 表头
headers = ['姓名', '部门', '工资']
for col, header in enumerate(headers, start=1):
    ws.cell(1, col, header)

# 数据列表
employees = [
    ['张三', '技术部', 8000],
    ['李四', '销售部', 6000],
    ['王五', '人事部', 5500],
    ['赵六', '技术部', 9000],
]

# 批量写入数据
for row, employee in enumerate(employees, start=2):  # 从第2行开始
    for col, value in enumerate(employee, start=1):
        ws.cell(row, col, value)

wb.save('员工信息.xlsx')
print(f"已写入 {len(employees)} 条员工数据")

运行效果

关键要点

示例 5:读取整个表格

目标:读取 Excel 文件中的所有数据,并打印出来。

提示:使用 max_rowmax_column 获取工作表的行列范围,然后循环读取所有单元格。这是读取整个表格的标准方法。

from openpyxl import load_workbook

wb = load_workbook('员工信息.xlsx')
ws = wb.active

# 获取表格的最大行数和列数
max_row = ws.max_row
max_column = ws.max_column

print(f"表格大小:{max_row} 行 × {max_column} 列\n")

# 读取所有数据
for row in range(1, max_row + 1):
    row_data = []
    for col in range(1, max_column + 1):
        cell_value = ws.cell(row, col).value
        row_data.append(cell_value)
    print(row_data)

运行效果

表格大小:5 行 × 3 列

['姓名', '部门', '工资']
['张三', '技术部', 8000]
['李四', '销售部', 6000]
['王五', '人事部', 5500]
['赵六', '技术部', 9000]

关键要点

示例 6:设置单元格样式

目标:给表格添加样式,让表头更醒目(加粗、背景色)。

提示:openpyxl 的样式功能很强大。需要导入 Font(字体)和 PatternFill(填充)。样式需要赋值给单元格的 fontfill 属性。

from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment

wb = Workbook()
ws = wb.active

# 写入表头
headers = ['姓名', '分数', '等级']
for col, header in enumerate(headers, start=1):
    cell = ws.cell(1, col, header)
    
    # 设置字体:加粗、白色、14号
    cell.font = Font(bold=True, color='FFFFFF', size=14)
    
    # 设置背景色:蓝色
    cell.fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
    
    # 设置对齐:居中
    cell.alignment = Alignment(horizontal='center', vertical='center')

# 写入数据
data = [
    ['张三', 95, '优秀'],
    ['李四', 78, '良好'],
    ['王五', 65, '及格'],
]

for row, row_data in enumerate(data, start=2):
    for col, value in enumerate(row_data, start=1):
        ws.cell(row, col, value)

# 调整列宽(让内容显示完整)
ws.column_dimensions['A'].width = 12
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 10

wb.save('成绩单.xlsx')
print("带样式的文件已创建!")

运行效果

关键要点

示例 7:实战应用 - 数据统计

目标:读取员工数据,按部门统计平均工资,并生成新的报表。

提示:这是一个综合示例,结合了读取、处理、写入和样式设置。实际项目中的 openpyxl 使用就是这样的结构。

from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill

# 读取原始数据
wb = load_workbook('员工信息.xlsx')
ws = wb.active

# 统计各部门工资
departments = {}
for row in range(2, ws.max_row + 1):  # 跳过表头
    dept = ws.cell(row, 2).value  # 部门在第2列
    salary = ws.cell(row, 3).value  # 工资在第3列
    
    if dept not in departments:
        departments[dept] = []
    departments[dept].append(salary)

# 创建统计报表
wb_new = Workbook()
ws_new = wb_new.active
ws_new.title = "部门统计"

# 写入表头
ws_new['A1'] = '部门'
ws_new['B1'] = '人数'
ws_new['C1'] = '平均工资'

# 设置表头样式
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_font = Font(bold=True, color='FFFFFF')

for col in ['A1', 'B1', 'C1']:
    cell = ws_new[col]
    cell.fill = header_fill
    cell.font = header_font

# 写入统计数据
row = 2
for dept, salaries in departments.items():
    ws_new.cell(row, 1, dept)
    ws_new.cell(row, 2, len(salaries))
    avg_salary = sum(salaries) / len(salaries)
    ws_new.cell(row, 3, round(avg_salary, 2))
    row += 1

wb_new.save('部门统计.xlsx')
print("统计报表已生成!")

运行效果

关键要点

其他选择

xlrd / xlwt - 老式库

用于处理 .xls 格式(旧版 Excel):

import xlrd
wb = xlrd.open_workbook('file.xls')

适用场景:需要处理旧版 Excel 文件(.xls)

pandas - 数据分析

pandas 也可以读写 Excel,更适合数据分析:

import pandas as pd
df = pd.read_excel('file.xlsx')
df.to_excel('output.xlsx')

适用场景:数据分析、处理表格数据

xlsxwriter - 只写模式

只能写入,不能读取,但性能更好:

import xlsxwriter
wb = xlsxwriter.Workbook('file.xlsx')

适用场景:只需要生成 Excel 文件,不需要读取

如何选择?

场景推荐
读写 .xlsx 文件openpyxl
数据分析处理pandas
只生成文件xlsxwriter
处理旧版 .xlsxlrd / xlwt

openpyxl 的优势

总结:openpyxl 是处理 Excel 文件的标准方案。掌握本文的 7 个示例,就能处理绝大多数日常需求。

以上就是Python使用openpyxl处理Excel文件的操作指南的详细内容,更多关于Python openpyxl处理Excel文件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文