在使用Python对Excel的单元格进行操作之前,我们需要确保本地python库中成功安装了openpyxl
类库。若没有安装该类库,则需要在【终端】借助pip工具安装:
# win:
pip install openpyxl
# mac
pip3 install openpyxl
# 若提示下载超时,则用以下的方式安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
在Excel中,可将关注的对象分为:【工作簿】、【工作页】、【行/列】、【单元格】。openpyxl类库如何去获取他们呢:
1、工作簿
1.1、获取工作簿
工作簿即我们平时使用的Excel文档,我们平时需要使用Excel文档时,需要打开指定的Excel文档,或者新建Excel文档并打开。openpyxl打开文档的方式与我们平时的做法一致,也分为打开指定工作簿与新建工作簿并打开两种:
- 打开指定工作簿
from openpyxl import load_workbook # 加载指定工作簿 workbook = load_workbook('./测试文档1.xlsx') print(type(workbook)) # <class 'openpyxl.workbook.workbook.Workbook'>
- 新建工作簿并打开
from openpyxl import load_workbook # 新建工作簿 workbook = Workbook() print(type(workbook)) # <class 'openpyxl.workbook.workbook.Workbook'>
获取到工作簿对象之后,我们就可以对这个工作簿文档进行下一步操作了,但工作簿不能直接操作数据,因为数据并不直接跟工作簿关联,而是跟这个工作簿下的所有工作页有着直接的关联。
1.2、保存工作簿
我们打开一个工作簿的目的,无非就是浏览或者修改,当我们仅用来浏览时,保存工作簿显得毫无意义。而当我们对工作簿中的内容进行修改时,那么我们就希望对修改后的内容进行保存。我们后续的操作,一般都是对工作页或者单元格进行修改,那么这些修改最终都归结与对工作簿的修改。所以我们对工作簿中的任何单元格、工作页之类的修改,最终该保存的对象都是工作簿对象。
在工作簿类(Workbook)中提供了save
方法用于保存工作簿,虽然简单,但是我们还是看一下这个方法的参数:
def save(self, filename):
if self.read_only:
raise TypeError("""Workbook is read-only""")
if self.write_only and not self.worksheets:
self.create_sheet()
save_workbook(self, filename)
参数 | 类型 | 说明 |
---|---|---|
filename | <class ‘str’> | 文件路径 |
首先,从参数上看,这个文件路径必须给定,无论你是以新建的方式打开的工作簿,还是以打开的指定工作簿,最终保存的时候,都需要给定保存文件路径。当最终保存的路径与打开的路径不一致时,其实就是我们常说的“另存为”。其次,从源码中我们可以看到,在保存之前首先判断了该文件的只读或只写情况下的处理方式。 |
🌰 最终,我们可以这样保存工作簿:
# 保存同目录下的 测试文档1.xlsx 文件
workbook.save('./测试文档1.xlsx')
2、工作页
工作页,也就是工作表或Sheet页,是我们平时对数据直接操作的页面。在新建一个Excel文档后,会默认新建一个交Sheet1的工作页并打开,用户也可以通过操作Sheet页栏来进行添加、修改、重命名工作页等操作。
2.1、获取工作页
我们在获取一个工作簿对象后,并不能直接操作工作页中的数据,必须先打开(或称之为激活)一张工作页,才能对工作页中对数据进行操作。Workbook工作簿类提供了两种打开其中工作页的方式:
- 获取工作簿中已打开的工作页,若无工作页打开,则默认获取工作簿中的第一个工作页。
打开的工作页是指这个工作页已经被某种方式激活,如我们已经通过Excel工具打开了一个工作簿,并且打开了指定的工作页,那么这个工作页就会处于“激活”状态,也就是打开状态。worksheet = workbook.active print(type(worksheet)) # <class 'openpyxl.worksheet.worksheet.Worksheet'>
- 获取指定的工作页
sheet1 = workbook['Sheet1'] sheet2 = workbook['Sheet2']
当我们获取到工作页对象后,我们就可以对这个工作页中的数据进行操作了。
2.2、重命名工作页
在获取到工作页对象后,就可以对这个工作页进行操作了,工作页类(Worksheet)提供了title属性,用于管理工作页名称。我们可以通过修改该属性值从而修改工作页的名称。
🌰 修改工作页的名称为测试工作页
worksheet.title = '测试工作页'
3、行 / 列
行与列,即是从水平方向与垂直方向对Excel中单元格进行的划分方式,对于openpyxl中的工作页对象(Worksheet)来说,他只是一个抽象出来的概念,并不存在真正的行与列对象,而是用一个元组代表了工作页中的一行或一列,这个元组中的元素即该行或列中的所有有效单元格对象。我们获取一行或一列的数据,其实就是获取该行或列中所有的单元格,并将这些单元格封装到元组中。
3.1、获取行 / 列
在一个Excel工作簿中,工作页管理着所有的单元格,所以我们希望获取行与列数据,就必须直接操作工作页对象,告诉它我期望如何获取想要的行与列:我们可以根据行号或列号获取指定的行或列,也可以遍历获取指定范围内的所有行与列数据。
-
获取指定的一行 / 列
# 获取第一行 row = worksheet[1] print(type(row)) # <class 'tuple'> # 获取第一列 col = worksheet['A'] print(type(col)) # <class 'tuple'>
-
通过遍历器获取行 / 列
行遍历方法iter_rows
与列遍历iter_cols
在用法上一致,我们查看一下行遍历方法中的参数:def iter_rows(self, min_row=None, max_row=None, min_col=None, max_col=None, values_only=False):
参数 说明 min_row 最小行索引,即开始遍历的行,默认值为None,表示从第一行开始。 max_row 最大索引行,即结束遍历的行,默认值为None,表示数据的最后一行。 min_col 最小索引列,即每行开始遍历的列,默认值为None,表示从第一列开始。 max_col 最大索引列,即每行结束遍历的列,默认值为None,表示数据到最后一列。 values_only 决定是否返回单元格的值,如果为True则返回单元格的值,如果为False则返回单元格对象。单元格对象需要通过cell.value的方式获取单元格的值。 🌰 遍历第2行到第4行中第2列到第4列的值
~~~py
for row in worksheet.iter_rows(min_row=2, max_row=4,
min_col=2, max_col=4, values_only=True):
print(row)
# 输出结果
"""
(1, 38016.14, 45127.2)
(2, 33078.08, 40334.41)
(3, 43791.06, 51433.11)
"""
~~~
3.2、写入一行数据
工作页类(Worksheet)提供了append
方法,用于添加一行数据,我们首先看看它的方法参数:
def append(self, iterable):
参数 | 类型 | 说明 |
---|---|---|
iterable | <class ‘list’>、<class ‘tuple’> | 可遍历的集合,如数组、元组。 |
append方法会在Excel工作页最后一行有效行后新建一行,并将记录以元组或数组中的顺序插入每个单元格中。 | ||
🌰 分别用元组与数组往工作页中插入记录 |
info_tuple = ('200004号项目', '4', '40000.00', '45000.00')
info_list = ['200005号项目', '5', '41000.00', '46000.00']
# 插入元组
worksheet.append(info_tuple)
# 插入列表
worksheet.append(info_list)
4、单元格
4.1、获取单元格
前文说过,单元格构成了行或列数据,其实从宏观的角度去看,单元格构成了整个工作页的数据。所以我们获取单元格,既可以直接通过工作页对象直接获取某个单元格,也可以通过已经获取到的行或列(元组),进一步遍历获取。
- 从工作页中获取指定某个单元格
# 获取第一行第一列单元格 cell = worksheet['A1']
- 通过遍历行 / 列元组方式获取每个单元格
步骤3中提到,获取行 / 列最终都是以元组的方式返回的,我们若想获取其中的单元格,当然可以通过遍历的方式去获取。如:for cell in worksheet.iter_rows(): print(type(cell[0])) # <class 'openpyxl.cell.cell.Cell'>
4.2、写入或修改单元格
写入单元格就很简单了,单元格类(Cell)提供了value
属性,使得我们可以通过为这个单元格赋值,从而达到赋值或修改值的目的。
🌰 写入A1单元格
cell = worksheet['A1']
cell.value = '填入的值'