Python Excel处理库openpyxl使用详解

Leo
Leo
发布时间:2026-10-13| 6人浏览过
原创

本文详细介绍Python第三方库openpyxl的使用,涵盖xlsx文件的读写、工作表与单元格操作、数据写入技巧(包括公式与append)、单元格样式设置(字体、对齐、行列高)以及合并拆分单元格功能,帮助开发者高效处理Excel数据。

openpyxl简介与安装

openpyxl是一个用于处理xlsx格式Excel文件的Python第三方库,可通过pip install openpyxl命令进行安装。

读取Excel文件

读取Excel文件

使用前需导入相关函数。


from openpyxl import load_workbook
# 默认可读写,若有需要可以指定write_only和read_only为True
wb = load_workbook('pythontab.xlsx')

默认打开的文件处于可读写状态,若只需读取,可指定参数read_only为True。

获取工作表--Sheet


# 获得所有sheet的名称
print(wb.get_sheet_names())
# 根据sheet名字获得sheet
a_sheet = wb.get_sheet_by_name('Sheet1')
# 获得sheet名
print(a_sheet.title)
# 获得当前正在显示的sheet, 也可以用wb.get_active_sheet()
sheet = wb.active

获取单元格


# 获取某个单元格的值,观察excel发现也是先字母再数字的顺序,即先列再行
b4 = sheet['B4']
# 分别返回
print(f'({b4.column}, {b4.row}) is {b4.value}') # 返回的数字就是int型
# 除了用下标的方式获得,还可以用cell函数, 换成数字,这个表示B2
b4_too = sheet.cell(row=4, column=2)
print(b4_too.value)

通过b4.column可返回列字母B,b4.row返回行号4,value属性获取单元格值。此外,cell对象还有coordinate属性,如b4单元格的坐标为B4。

获得最大行和最大列


# 获得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)

获取行和列

sheet.rows是一个生成器,包含每一行的数据,每行数据由一个tuple包裹。

sheet.columns类似,但其tuple中包含的是每一列的单元格。


# 因为按行,所以返回A1, B1, C1这样的顺序
for row in sheet.rows:
 for cell in row:
  print(cell.value)
# A1, A2, A3这样的顺序
for column in sheet.columns:
 for cell in column:
  print(cell.value)

上述代码可获取所有单元格数据。若需获取特定行数据,由于sheet.rows是生成器类型,无法直接索引,需先转换为list,例如通过list(sheet.rows)[2]获取第二行的tuple对象。


for cell in list(sheet.rows)[2]:
 print(cell.value)

如何获得任意区间的单元格?

可使用range函数,如下写法获取以A1为左上角、B3为右下角矩形区域内的所有单元格。注意range从1开始,因为openpyxl为与Excel表达一致,不采用编程语言中0表示第一个值的习惯。


for i in range(1, 4):
 for j in range(1, 3):
  print(sheet.cell(row=i, column=j))
   
# out
<Cell pythontab.A1>
<Cell pythontab.B1>
<Cell pythontab.A2>
<Cell pythontab.B2>
<Cell pythontab.A3>
<Cell pythontab.B3>

也可像使用切片那样操作,sheet['A1':'B3']返回一个tuple,该元组内部仍为元组,由每行的单元格构成。


for row_cell in sheet['A1':'B3']:
 for cell in row_cell:
  print(cell)
   
for cell in sheet['A1':'B3']:
 print(cell)
# out
(<Cell pythontab.A1>, <Cell pythontab.B1>)
(<Cell pythontab.A2>, <Cell pythontab.B2>)
(<Cell pythontab.A3>, <Cell pythontab.B3>)

根据字母获得列号,根据列号返回字母

需导入,这两个函数存在于openpyxl.utils模块中。


from openpyxl.utils import get_column_letter, column_index_from_string
# 根据列的数字返回字母
print(get_column_letter(2)) # B
# 根据字母返回列的数字
print(column_index_from_string('D')) # 4

写入Excel数据

将数据写入Excel

工作表相关

需导入WorkBook。


from openpyxl import Workbook
wb = Workbook()

这样便新建了一个新工作表(尚未保存)。

若需指定只写模式,可指定参数write_only=True。一般默认的可读写模式即可满足需求。


print(wb.get_sheet_names()) # 提供一个默认名叫Sheet的表,office2016下新建提供默认Sheet1
# 直接赋值就可以改工作表的名称
sheet.title = 'Sheet1'
# 新建一个工作表,可以指定索引,适当安排其在工作簿中的位置
wb.create_sheet('Data', index=1) # 被安排到第二个工作表,index=0就是第一个位置
# 删除某个工作表
wb.remove(sheet)
del wb[sheet]

写入单元格

还可使用公式。


# 直接给单元格赋值就行
sheet['A1'] = 'good'
# B9处写入平均值
sheet['B9'] = '=AVERAGE(B2:B8)'

但在读取时,若需获取公式计算结果而非公式本身,需加上data_only=True,此时读取B9返回的是数字;若不添加此参数,返回的将是公式本身'=AVERAGE(B2:B8)'。

append函数

可一次添加多行数据,从第一行空白行开始(后续均为空白行)写入。


# 添加一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)
# 添加多行
rows = [
 ['Number', 'data1', 'data2'],
 [2, 40, 30],
 [3, 40, 25],
 [4, 50, 30],
 [5, 30, 10],
 [6, 25, 5],
 [7, 50, 10],
]

由于append函数仅支持按行写入,若需按列写入,可通过矩阵转置实现。使用zip()函数可完成此操作,虽然内部列表变为元组,但均为可迭代对象,不影响使用。


list(zip(*rows))
# out
[('Number', 2, 3, 4, 5, 6, 7),
 ('data1', 40, 40, 50, 30, 25, 50),
 ('data2', 30, 25, 30, 10, 5, 10)]

解释list(zip(*rows)):首先*rows将列表打散,相当于传入若干参数;zip从各列表中依次提取第1个值组合成tuple,再提取第2个值组合成tuple,直至最短列表的最后一个值提取完毕,更长列表的后续值被舍弃。换言之,最终元组个数由原参数(可迭代对象)的最短长度决定。例如,若删除一个值使最短列表长度为2,则data2那一列(竖着看)的值全部被舍弃。


rows = [
 ['Number', 'data1', 'data2'],
 [2, 40],
 [3, 40, 25],
 [4, 50, 30],
 [5, 30, 10],
 [6, 25, 5],
 [7, 50, 10],
]
# out
[('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50)]

最后zip返回的是zip对象,无法直接查看数据,使用list转换即可。利用zip可方便实现数据按列写入。

保存文件

所有操作结束后,务必保存文件,指定路径和文件名,后缀名为xlsx。


wb.save(r'D:\example.xlsx')

设置单元格样式

设置单元格风格--Style

先导入所需的类。


from openpyxl.styles import Font, colors, Alignment

可分别指定字体、颜色和对齐方式。

字体


bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True)
sheet['A1'].font = bold_itatic_24_font

上述代码指定了等线24号、加粗、斜体及红色字体。直接通过cell的font属性,将Font对象赋值给它即可。

对齐方式

同样直接通过cell的alignment属性,此处指定垂直居中和水平居中。除center外,还可使用right、left等参数。


# 设置B1中的数据垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

设置行高和列宽

有时数据过长显示不全,需拉长或拉高单元格。


# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列宽
sheet.column_dimensions['C'].width = 30

合并和拆分单元格

合并单元格即以合并区域左上角的单元格为基准,覆盖其他单元格,使其成为一个大单元格。

相反,拆分单元格后,该大单元格的值将返回到原来的左上角位置。


# 合并单元格, 往左上角写入数据即可
sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格

合并后,仅可向左上角写入数据,即区间中冒号左边的坐标。

若待合并的单元格均有数据,仅保留左上角的数据,其余丢弃。换言之,若合并前未在左上角写入数据,合并后单元格中将无数据。

以下是拆分单元格的代码。拆分后,值回到A1位置。


sheet.unmerge_cells('A1:C3')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。