Python openpyxl --读写Excel文件

openpyxl 是一个Python第三方库,可实现对Excel文件的读写和修改,只能处理 xlsx 文件,不能处理 xls 文件

系列

Excel基本概念

Excel有两种专门保存文件的格式

Excel2003版本的文件格式是xls
Excel2007及之后的版本的文件格式就是xlsx

Excel文档的基本概念

一个Excel文档也称为一个工作簿(workbook)
每个工作簿里可以有多个工作表(worksheet)
当前打开的工作表又叫活动表
每个工作表里有行和列
特定的行与列相交的方格称为单元格(cell),比如B9

9

环境

操作系统 : windows10
开发工具 : VSCode
python版本 : 3.8.6
openpyxl版本 : 3.0.3

安装

使用 pipenv 安装

1
pipenv install openpyxl

使用pip3安装

1
python3 -m pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

写入

获取工作簿对象

1
2
3
4
from openpyxl import Workbook

# 创建一个新的工作簿,此时活动表是 Sheet
wb = Workbook()

创建工作表

工作簿对象.create_sheet(name,int)

name : 工作表名
int : 决定工作表位置的一个整数

未给出参数默认按顺序命名Sheet1 Sheet2…

1
2
wb.create_sheet()
wb.create_sheet()

给出参数按顺序命名aa bb

1
2
wb.create_sheet('aa')
wb.create_sheet('bb')

给出数字参数决定工作表位置

1
2
3
wb.create_sheet('bb', 0)    # 第一个
wb.create_sheet('cc', 1) # 第二个
wb.create_sheet('dd', -1) # 倒数第二个

删除工作表

del 工作簿对象['工作表名']
1
2
# 删除工作簿中名为 Sheet 的工作表
del wb['Sheet']

查看所有工作表

工作簿对象.sheetnames
1
2
# 以列表返回所有工作表的名字
ws_name = wb.sheetnames

获取工作表对象

活动表是指已打开的工作表

1
2
3
4
5
# 通过活动表获取,通常是第一个位置的工作表
ws = wb.active

# 通过工作表名获取
ws = wb['雨园']

重命名活动表

工作表对象.title = '值'
1
ws.title = '雨园'

写入单元格

工作表对象['单元格'] = '值'
工作表对象['单元格'].value = '值'
1
2
3
4
5
6
7
8
9
# 向 A1 B1 C1 单元格写入内容
ws['A1'] = '雨园'
ws['B1'] = '博客'
ws['C1'] = '雨园博客'

# 向 A2 B2 C2 单元格写入内容
ws['A2'].value = '雨园'
ws['B2'].value = '博客'
ws['C2'].value = '雨园博客'

行列

写入一行

工作表对象.append(列表)

从最后一个非空行的后一行开始写入

1
2
list = ['雨园', '博客', '雨园博客']
ws.append(list)

删除某行

工作表对象.delete_rows(行号)
1
2
# 删除第一行
ws.delete_rows(1)

删除某列

工作表对象.delete_rows(列号)
1
2
# 删除第一列
ws.delete_cols(1)

写入多行

从最后一个非空行的后一行开始写入

1
2
3
4
5
6
7
8
9
# 大列表嵌套小列表
list = [
['夜雨寄北', '李商隐'],
['君问归期未有期', '巴山夜雨涨秋池'],
['何当共剪西窗烛', '却话巴山夜雨时']
]

for row in list:
ws.append(row)

行高

工作表对象.row_dimensions[行号].height = 数字
1
2
3
4
# 第一行行高为20
ws.row_dimensions[1].height = 20
# 第二行行高为20
ws.row_dimensions[2].height = 20

列宽

工作表对象.column_dimensions['列名'].width = 数字
1
2
3
4
# A列宽度为10
ws.column_dimensions['A'].width = 10
# B列宽度为20
ws.column_dimensions['B'].width = 20

保存写入工作簿

工作簿对象.save('保存路径')

只是修改文件名相当于 重命名
修改了文件路径相当于 另存为

1
2
# 在当前目录下保存工作簿并命名为 雨园
wb.save('./雨园.xlsx')

读取

获取工作簿对象

1
2
3
4
from openpyxl import load_workbook

# 打开指定路径下的工作簿
wb = load_workbook('./雨园.xlsx')

查看所有工作表

工作簿对象.sheetnames
1
2
# 以列表返回所有工作表的名字
ws_name = wb.sheetnames

获取工作表对象

活动表是指已打开的工作表

1
2
3
4
5
# 通过活动表获取,通常是第一个位置的工作表
ws = wb.active

# 通过工作表名获取
ws = wb['雨园']

读取单元格

获取单元格对象

工作表对象['单元格']
1
2
# 获取A1单元格对象
cell = ws['A1']

获取单元格的值

单元格对象.value
1
value = cell.value

读取行列

最大行

工作表对象.max_row
1
2
# 以整数返回最大非空行
row = ws.max_row

最大列

工作表对象.max_column
1
2
# 以整数返回最大非空列
row = ws.max_column

读取某行

工作表对象[行号]
1
2
3
4
5
# 读取第一行,返回以单元格对象为项的元组,单元格的值为空返回None
row = ws[1]
for cell in row:
# 读取单元格的值
value = cell.value

读取某列

工作表对象['字母列']
1
2
3
4
5
# 读取A列,返回以单元格对象为项的元组,单元格的值为空返回None
col = ws['A']
for cell in col:
# 读取单元格的值
value = cell.value

读取某区域行

工作表对象.iter_rows(min_row, max_row, min_col, max_col, values_only)

min_row : 起始行,默认第一行
max_row : 终止行
min_col : 起始列,默认第一列
max_col : 终止列
values_only : 为True则返回单元格的值,用于只读数据,为False则返回单元格对象,用于写入数据

获取第一行至五行,第一列(A列)至第三列(C列)范围的所有数据,值不存在返回

1
2
3
4
5
6
# 返回一个生成器对象
generator = ws.iter_rows(min_row=1, max_row=5, min_col=1, max_col=3,values_only=True)
# 读取每一行
for row in generator:
# 返回以单元格的值为项的元组,单元格的值为空则项返回None
print(row)

读取所有行

工作表对象.values
1
2
3
4
5
6
# 读取所有行,返回一个生成器对象
generator = ws.values
# 读取每一行
for row in generator:
# 返回以单元格的值为项的元组,单元格的值为空则项返回None
print(row)

保存读取工作簿

工作簿对象.save('保存路径')

只是修改文件名相当于 重命名
修改了文件路径相当于 另存为

如果只是读取工作簿,这一步可以不写

1
2
# 在当前目录下保存工作簿并命名为 雨园
wb.save('./雨园.xlsx')

来源

openpyxl官方文档