0%

Python操作xlsx表格完全指南

Python操作xlsx表格完全指南

在日常工作和数据分析中,Excel表格是最常用的数据存储和展示工具之一。Python提供了多种库来操作Excel文件,特别是xlsx格式的文件。本文将详细介绍如何使用Python操作xlsx表格,包括常用库的使用方法、代码示例、常见错误及解决方案等。

一、依赖的库

Python操作xlsx表格主要依赖以下几个库:

1. openpyxl

openpyxl是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库,是目前最流行的Excel操作库之一。

安装方法

1
pip install openpyxl

版本要求

  • 推荐使用最新稳定版本
  • 目前稳定版本:v3.1.5(截至2026年1月)

2. pandas

pandas是一个强大的数据分析库,也提供了方便的Excel文件读写功能,适合处理大量数据。

安装方法

1
pip install pandas

版本要求

  • 推荐版本:v2.2.4或更高

3. xlsxwriter

xlsxwriter是一个用于创建Excel xlsx文件的Python库,支持写入文本、数字、公式和超链接,以及创建图表等功能。

安装方法

1
pip install xlsxwriter

版本要求

  • 推荐版本:v3.2.0或更高

4. xlrd(可选)

xlrd用于读取旧版Excel(.xls)文件,对于xlsx文件,pandas 1.2.0+版本已经不再依赖xlrd,而是使用openpyxl。

安装方法

1
pip install xlrd

版本要求

  • 推荐版本:v2.0.1或更高

二、openpyxl库使用

1. 工作簿操作

创建工作簿

1
2
3
4
5
6
7
from openpyxl import Workbook

# 创建一个新的工作簿
wb = Workbook()

# 保存工作簿
wb.save('example.xlsx')

打开现有工作簿

1
2
3
4
5
6
7
from openpyxl import load_workbook

# 打开现有工作簿
wb = load_workbook('example.xlsx')

# 获取工作簿中所有工作表名称
print(wb.sheetnames)

2. 工作表操作

创建工作表

1
2
3
4
5
6
7
8
# 创建一个新的工作表,默认在最后
ws1 = wb.create_sheet("Sheet1")

# 创建一个新的工作表,放在最前面
ws2 = wb.create_sheet("Sheet2", 0)

# 创建一个新的工作表,放在指定位置
ws3 = wb.create_sheet("Sheet3", 1)

选择工作表

1
2
3
4
5
# 通过名称选择工作表
ws = wb["Sheet1"]

# 获取活动工作表
ws = wb.active

重命名工作表

1
2
# 重命名工作表
ws.title = "新工作表名称"

删除工作表

1
2
3
4
5
# 删除工作表
wb.remove(ws)

# 或者使用del关键字
# del wb["Sheet1"]

3. 单元格操作

访问单元格

1
2
3
4
5
# 直接通过单元格地址访问
cell = ws["A1"]

# 通过行和列访问(行号从1开始)
cell = ws.cell(row=1, column=1)

设置单元格值

1
2
3
4
5
# 设置单元格值
ws["A1"] = "Hello, World!"

# 或者使用cell对象
ws.cell(row=1, column=2, value="Python")

获取单元格值

1
2
3
4
5
6
7
# 获取单元格值
value = ws["A1"].value
print(value)

# 或者使用cell对象
value = ws.cell(row=1, column=2).value
print(value)

访问多个单元格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 访问一行
for cell in ws["A1:C1"]:
for c in cell:
print(c.value)

# 访问一列
for cell in ws["A1:A5"]:
for c in cell:
print(c.value)

# 访问一个区域
for row in ws["A1:C5"]:
for cell in row:
print(cell.value, end=" ")
print()

# 访问所有行
for row in ws.iter_rows(min_row=1, max_col=3, max_row=5):
for cell in row:
print(cell.value, end=" ")
print()

# 访问所有列
for col in ws.iter_cols(min_row=1, max_col=3, max_row=5):
for cell in col:
print(cell.value, end=" ")
print()

4. 数据读写

写入多行数据

1
2
3
4
5
6
7
8
9
10
11
12
# 准备数据
data = [
["姓名", "年龄", "城市"],
["Alice", 25, "New York"],
["Bob", 30, "London"],
["Charlie", 35, "Paris"],
["David", 40, "Tokyo"]
]

# 写入数据
for row in data:
ws.append(row)

读取所有数据

1
2
3
# 读取所有数据
for row in ws.iter_rows(values_only=True):
print(row)

5. 样式设置

设置字体样式

1
2
3
4
5
6
7
8
9
10
from openpyxl.styles import Font, Color

# 设置单元格字体
ws["A1"].font = Font(
name="Arial",
size=14,
bold=True,
italic=False,
color="FF0000" # 红色
)

设置对齐方式

1
2
3
4
5
6
7
8
from openpyxl.styles import Alignment

# 设置单元格对齐方式
ws["A1"].alignment = Alignment(
horizontal="center", # 水平居中
vertical="center", # 垂直居中
wrap_text=True # 自动换行
)

设置边框

1
2
3
4
5
6
7
8
9
10
11
12
from openpyxl.styles import Border, Side

# 创建边框样式
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)

# 设置单元格边框
ws["A1"].border = thin_border

设置填充颜色

1
2
3
4
5
6
7
8
from openpyxl.styles import PatternFill

# 设置单元格填充颜色
ws["A1"].fill = PatternFill(
start_color="FFFF00", # 黄色
end_color="FFFF00",
fill_type="solid"
)

设置列宽和行高

1
2
3
4
5
6
# 设置列宽
ws.column_dimensions["A"].width = 20
ws.column_dimensions["B"].width = 15

# 设置行高
ws.row_dimensions[1].height = 30

三、pandas库操作Excel

1. 读取Excel文件

基本读取

1
2
3
4
5
import pandas as pd

# 读取Excel文件
df = pd.read_excel('example.xlsx')
print(df)

读取指定工作表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 读取指定工作表
df = pd.read_excel('example.xlsx', sheet_name='Sheet1')
print(df)

# 读取多个工作表
dfs = pd.read_excel('example.xlsx', sheet_name=['Sheet1', 'Sheet2'])
print(dfs['Sheet1'])
print(dfs['Sheet2'])

# 读取所有工作表
dfs = pd.read_excel('example.xlsx', sheet_name=None)
for sheet_name, df in dfs.items():
print(f"工作表名: {sheet_name}")
print(df)
print()

读取指定区域

1
2
3
4
5
6
7
# 读取指定区域
df = pd.read_excel('example.xlsx', usecols='A:C', nrows=5)
print(df)

# 读取指定行和列
df = pd.read_excel('example.xlsx', skiprows=1, usecols=[0, 1, 2])
print(df)

2. 写入Excel文件

基本写入

1
2
3
4
5
6
7
8
9
10
11
# 准备数据
data = {
'姓名': ['Alice', 'Bob', 'Charlie', 'David'],
'年龄': [25, 30, 35, 40],
'城市': ['New York', 'London', 'Paris', 'Tokyo']
}

df = pd.DataFrame(data)

# 写入Excel文件
df.to_excel('output.xlsx', index=False)

写入多个工作表

1
2
3
4
5
6
# 创建ExcelWriter对象
with pd.ExcelWriter('output.xlsx') as writer:
# 写入第一个工作表
df1.to_excel(writer, sheet_name='Sheet1', index=False)
# 写入第二个工作表
df2.to_excel(writer, sheet_name='Sheet2', index=False)

写入指定位置

1
2
# 写入指定位置
df.to_excel('output.xlsx', sheet_name='Sheet1', startrow=1, startcol=2, index=False)

3. 高级操作

设置列宽

1
2
3
4
5
6
7
8
9
10
with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)

# 获取工作表对象
worksheet = writer.sheets['Sheet1']

# 设置列宽
worksheet.set_column('A:A', 20)
worksheet.set_column('B:B', 15)
worksheet.set_column('C:C', 25)

设置单元格格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
with pd.ExcelWriter('output.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='Sheet1', index=False)

# 获取工作簿和工作表对象
workbook = writer.book
worksheet = writer.sheets['Sheet1']

# 创建格式对象
bold_format = workbook.add_format({'bold': True, 'font_color': 'red'})

# 设置单元格格式
worksheet.write('A1', '姓名', bold_format)
worksheet.write('B1', '年龄', bold_format)
worksheet.write('C1', '城市', bold_format)

四、xlsxwriter库使用

1. 创建工作簿和工作表

创建工作簿

1
2
3
4
5
6
7
8
9
10
import xlsxwriter

# 创建工作簿
workbook = xlsxwriter.Workbook('example.xlsx')

# 创建工作表
worksheet = workbook.add_worksheet()

# 关闭工作簿
workbook.close()

创建命名工作表

1
2
3
4
# 创建命名工作表
worksheet1 = workbook.add_worksheet() # 默认名称:Sheet1
worksheet2 = workbook.add_worksheet('Data') # 名称:Data
worksheet3 = workbook.add_worksheet('Report') # 名称:Report

2. 写入数据

写入文本和数字

1
2
3
4
5
6
7
8
9
# 写入文本
worksheet.write('A1', 'Hello')
worksheet.write('B1', 'World')

# 写入数字
worksheet.write(0, 2, 123)
worksheet.write(1, 0, 456)
worksheet.write(1, 1, 789)
worksheet.write(1, 2, 10.5)

写入公式

1
2
3
# 写入公式
worksheet.write('D2', '=SUM(A2:C2)')
worksheet.write('A4', '=AVERAGE(A2:A3)')

写入日期和时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import datetime

# 写入日期
worksheet.write('A1', datetime.datetime(2026, 1, 24))

# 写入时间
worksheet.write('B1', datetime.datetime(2026, 1, 24, 10, 30, 0))

# 设置日期格式
date_format = workbook.add_format({'num_format': 'yyyy-mm-dd'})
worksheet.write('A2', datetime.datetime(2026, 1, 24), date_format)

# 设置时间格式
time_format = workbook.add_format({'num_format': 'hh:mm:ss'})
worksheet.write('B2', datetime.datetime(2026, 1, 24, 10, 30, 0), time_format)

写入超链接

1
2
3
# 写入超链接
worksheet.write_url('A1', 'https://www.example.com', string='Example Website')
worksheet.write_url('A2', 'mailto:example@example.com', string='Send Email')

3. 创建图表

创建柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 准备数据
worksheet.write('A1', '产品')
worksheet.write('B1', '销量')
worksheet.write('A2', '产品A')
worksheet.write('B2', 100)
worksheet.write('A3', '产品B')
worksheet.write('B3', 200)
worksheet.write('A4', '产品C')
worksheet.write('B4', 150)

# 创建柱状图
chart = workbook.add_chart({'type': 'column'})

# 添加数据系列
chart.add_series({
'name': '=Sheet1!$B$1',
'categories': '=Sheet1!$A$2:$A$4',
'values': '=Sheet1!$B$2:$B$4',
})

# 设置图表标题
chart.set_title({'name': '产品销量'})

# 设置x轴标题
chart.set_x_axis({'name': '产品'})

# 设置y轴标题
chart.set_y_axis({'name': '销量'})

# 插入图表到工作表
worksheet.insert_chart('D2', chart)

创建折线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建折线图
chart = workbook.add_chart({'type': 'line'})

# 添加数据系列
chart.add_series({
'name': '=Sheet1!$B$1',
'categories': '=Sheet1!$A$2:$A$4',
'values': '=Sheet1!$B$2:$B$4',
})

# 设置图表标题
chart.set_title({'name': '产品销量趋势'})

# 插入图表到工作表
worksheet.insert_chart('D2', chart)

创建饼图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建饼图
chart = workbook.add_chart({'type': 'pie'})

# 添加数据系列
chart.add_series({
'name': '=Sheet1!$B$1',
'categories': '=Sheet1!$A$2:$A$4',
'values': '=Sheet1!$B$2:$B$4',
'data_labels': {'value': True},
})

# 设置图表标题
chart.set_title({'name': '产品销量占比'})

# 插入图表到工作表
worksheet.insert_chart('D2', chart)

五、完整代码示例

1. 示例1:使用openpyxl读写Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side

# 创建工作簿
wb = Workbook()
ws = wb.active
ws.title = "员工信息"

# 设置表头
headers = ["姓名", "年龄", "部门", "工资"]
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
# 设置表头样式
cell.font = Font(bold=True, color="FFFFFF")
cell.fill = PatternFill(start_color="4F81BD", end_color="4F81BD", fill_type="solid")
cell.alignment = Alignment(horizontal="center", vertical="center")
cell.border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)

# 准备数据
data = [
["张三", 28, "技术部", 8000],
["李四", 32, "销售部", 12000],
["王五", 25, "市场部", 7500],
["赵六", 35, "财务部", 9000],
["孙七", 29, "技术部", 8500]
]

# 写入数据
for row, row_data in enumerate(data, 2):
for col, value in enumerate(row_data, 1):
cell = ws.cell(row=row, column=col, value=value)
cell.alignment = Alignment(horizontal="center", vertical="center")
cell.border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)

# 设置列宽
ws.column_dimensions["A"].width = 15
ws.column_dimensions["B"].width = 10
ws.column_dimensions["C"].width = 15
ws.column_dimensions["D"].width = 15

# 保存工作簿
wb.save("员工信息表.xlsx")
print("员工信息表已创建成功!")

# 读取工作簿
from openpyxl import load_workbook

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

print("\n读取员工信息表:")
for row in ws.iter_rows(values_only=True):
print(row)

2. 示例2:使用pandas处理Excel数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import pandas as pd

# 准备数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '孙七'],
'年龄': [28, 32, 25, 35, 29],
'部门': ['技术部', '销售部', '市场部', '财务部', '技术部'],
'工资': [8000, 12000, 7500, 9000, 8500]
}

df = pd.DataFrame(data)

# 写入Excel文件
with pd.ExcelWriter('员工信息_pandas.xlsx', engine='xlsxwriter') as writer:
df.to_excel(writer, sheet_name='员工信息', index=False)

# 获取工作簿和工作表对象
workbook = writer.book
worksheet = writer.sheets['员工信息']

# 设置列宽
worksheet.set_column('A:A', 15)
worksheet.set_column('B:B', 10)
worksheet.set_column('C:C', 15)
worksheet.set_column('D:D', 15)

# 设置表头格式
header_format = workbook.add_format({
'bold': True,
'text_wrap': True,
'valign': 'top',
'fg_color': '#4F81BD',
'bg_color': '#4F81BD',
'font_color': '#FFFFFF',
'border': 1
})

# 设置表头
for col_num, value in enumerate(df.columns.values):
worksheet.write(0, col_num, value, header_format)

# 创建工资数据的柱状图
chart = workbook.add_chart({'type': 'column'})
chart.add_series({
'name': '=员工信息!$D$1',
'categories': '=员工信息!$A$2:$A$6',
'values': '=员工信息!$D$2:$D$6',
})

chart.set_title({'name': '员工工资'})
chart.set_x_axis({'name': '姓名'})
chart.set_y_axis({'name': '工资'})

# 插入图表
worksheet.insert_chart('F2', chart)

print("使用pandas创建的员工信息表已保存成功!")

# 读取Excel文件并进行数据分析
print("\n读取Excel文件并进行数据分析:")
df_read = pd.read_excel('员工信息_pandas.xlsx')
print("数据基本信息:")
print(df_read.info())
print("\n数据统计描述:")
print(df_read.describe())
print("\n各部门平均工资:")
print(df_read.groupby('部门')['工资'].mean())
print("\n工资最高的员工:")
print(df_read[df_read['工资'] == df_read['工资'].max()])

3. 示例3:使用xlsxwriter创建带图表的Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import xlsxwriter

# 创建工作簿
workbook = xlsxwriter.Workbook('销售报表.xlsx')

# 创建工作表
worksheet = workbook.add_worksheet('月度销售')

# 设置标题
worksheet.write('A1', '2026年销售报表')

# 设置标题格式
title_format = workbook.add_format({
'bold': True,
'font_size': 18,
'align': 'center',
'valign': 'vcenter',
'fg_color': '#FFD700',
'border': 1
})
worksheet.merge_range('A1:D1', '2026年销售报表', title_format)

# 设置表头
headers = ['月份', '产品A', '产品B', '产品C']
header_format = workbook.add_format({
'bold': True,
'bg_color': '#4F81BD',
'font_color': '#FFFFFF',
'align': 'center',
'valign': 'vcenter',
'border': 1
})

for col, header in enumerate(headers):
worksheet.write(2, col, header, header_format)

# 准备销售数据
months = ['1月', '2月', '3月', '4月', '5月', '6月']
product_a = [100, 120, 150, 130, 160, 180]
product_b = [80, 90, 100, 110, 120, 130]
product_c = [150, 160, 170, 180, 190, 200]

# 写入数据
data_format = workbook.add_format({
'align': 'center',
'valign': 'vcenter',
'border': 1
})

for row in range(6):
worksheet.write(row + 3, 0, months[row], data_format)
worksheet.write(row + 3, 1, product_a[row], data_format)
worksheet.write(row + 3, 2, product_b[row], data_format)
worksheet.write(row + 3, 3, product_c[row], data_format)

# 设置列宽
worksheet.set_column('A:A', 10)
worksheet.set_column('B:D', 15)

# 创建折线图
chart = workbook.add_chart({'type': 'line'})

# 添加系列数据
chart.add_series({
'name': '=月度销售!$B$3',
'categories': '=月度销售!$A$4:$A$9',
'values': '=月度销售!$B$4:$B$9',
'marker': {'type': 'circle', 'size': 8},
'line': {'width': 2},
})

chart.add_series({
'name': '=月度销售!$C$3',
'categories': '=月度销售!$A$4:$A$9',
'values': '=月度销售!$C$4:$C$9',
'marker': {'type': 'square', 'size': 8},
'line': {'width': 2},
})

chart.add_series({
'name': '=月度销售!$D$3',
'categories': '=月度销售!$A$4:$A$9',
'values': '=月度销售!$D$4:$D$9',
'marker': {'type': 'triangle', 'size': 8},
'line': {'width': 2},
})

# 设置图表标题
chart.set_title({'name': '2026年上半年产品销售趋势'})

# 设置x轴和y轴标题
chart.set_x_axis({'name': '月份'})
chart.set_y_axis({'name': '销量'})

# 设置图表样式
chart.set_style(10)

# 插入图表
worksheet.insert_chart('F2', chart, {'x_offset': 20, 'y_offset': 10})

# 关闭工作簿
workbook.close()

print("带图表的销售报表已创建成功!")

六、常见错误及解决方案

1. 文件被占用

错误信息PermissionError: [Errno 13] Permission denied: 'example.xlsx'

解决方案

  • 确保Excel文件没有被其他程序(如Microsoft Excel)打开
  • 检查文件路径是否正确
  • 检查文件权限

2. 库版本不兼容

错误信息ImportError: cannot import name 'XXXX' from 'openpyxl'

解决方案

  • 更新库到最新版本:pip install --upgrade openpyxl pandas xlsxwriter
  • 检查库的版本兼容性
  • 查看官方文档了解API变化

3. 数据类型错误

错误信息TypeError: Invalid cell value type

解决方案

  • 确保写入Excel的数据类型是支持的类型(字符串、数字、日期等)
  • 对于复杂数据类型,先转换为字符串或其他支持的类型
  • 检查数据中是否包含None或NaN值

4. 工作表不存在

错误信息KeyError: "Worksheet named 'Sheet1' not found"

解决方案

  • 检查工作表名称是否正确,注意大小写
  • 使用wb.sheetnames查看所有工作表名称
  • 确保工作表已创建

5. 单元格地址错误

错误信息ValueError: Row or column values must be at least 1

解决方案

  • 确保行号和列号从1开始
  • 检查单元格地址格式是否正确

七、最佳实践

  1. 选择合适的库

    • 对于简单的Excel读写,推荐使用openpyxl
    • 对于数据分析和处理,推荐使用pandas
    • 对于需要创建复杂图表和格式,推荐使用xlsxwriter
  2. 资源管理

    • 使用with语句管理文件资源,确保文件正确关闭
    • 大型文件处理时,考虑分块读取,避免内存不足
  3. 性能优化

    • 批量写入数据比逐个写入更高效
    • 对于大型数据集,考虑使用pandas的向量化操作
    • 避免在循环中频繁访问单元格
  4. 格式设置

    • 合理使用格式,避免过度设置导致文件过大
    • 使用条件格式代替手动设置每个单元格格式
    • 考虑使用Excel模板
  5. 错误处理

    • 添加适当的异常处理,提高程序健壮性
    • 对文件操作添加日志记录
    • 验证输入数据的正确性

八、总结

本文详细介绍了Python操作xlsx表格的三种主要库:openpyxl、pandas和xlsxwriter。通过这些库,我们可以实现Excel文件的创建、读取、修改和格式化,以及创建各种图表。

  • openpyxl:功能全面,支持读写xlsx文件,适合对Excel文件进行精细控制
  • pandas:适合数据分析和处理,提供了高效的数据读写和转换功能
  • xlsxwriter:擅长创建带图表和复杂格式的Excel文件

在实际应用中,我们可以根据具体需求选择合适的库,或者结合使用多个库来完成复杂的任务。通过Python自动化处理Excel文件,可以大大提高工作效率,减少重复劳动。

九、参考资料

  1. openpyxl官方文档
  2. pandas官方文档 - Excel读写
  3. xlsxwriter官方文档
  4. Python Excel教程
  5. Real Python - Working with Excel Files in Python
  6. Python数据分析实战
  7. Excel文件格式规范

欢迎关注我的其它发布渠道