Python使用openpyxl处理Excel文件的完整指南

Luna
Luna
发布时间:2026-10-14 | 4人浏览过
原创

本文详细介绍如何使用Python的openpyxl库处理.xlsx格式文件。内容涵盖安装配置、读取单元格与区域数据、写入数据及公式、处理行列维度、设置字体对齐样式,以及合并拆分单元格等核心功能,帮助开发者高效实现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的名称
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)

通过cell对象可以获取列字母(column)、行号(row)以及单元格的值(value)。例如,对于单元格b4,b4.column返回B,b4.row返回4。此外,cell对象还有一个coordinate属性,直接返回单元格的坐标字符串,如B4。

获取工作表的最大行数和最大列数。

获取具体的行和列数据。

sheet.rows是一个生成器,遍历它可获得每一行的数据,每一行数据被封装在一个元组中。

sheet.columns的作用类似,但其内部的元组包含的是每一列的单元格对象。


# 因为按行,所以返回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(sheet.rows)[2]即可获取第二行的元组对象。


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']返回一个元组,该元组内部嵌套了元组,每个内部元组由对应行的单元格构成。


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函数添加数据。

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函数仅支持按行写入,若需按列写入数据,该如何操作?可以通过矩阵转置的方式利用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函数。zip函数从各个列表中依次提取第1个值组合成一个元组,再提取第2个值组合成另一个元组,直到最短列表的值全部提取完毕。更长列表中剩余的值将被舍弃。因此,最终生成的元组个数由原参数(可迭代对象)中最短的长度决定。例如,若删除一个值导致最短列表长度为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函数可以方便地实现按列写入数据的需求。

单元格样式与格式设置

设置单元格字体样式。


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')

实例代码扩展:


# coding=utf-8

import xlrd

# 打开文件
data = xlrd.open_workbook('file/demo.xlsx')

# 查看工作表
data.sheet_names()
print("sheets:" + str(data.sheet_names()))

# 通过文件名获得工作表,获取工作表1
table = data.sheet_by_name('工作表1')

# 打印data.sheet_names()可发现,返回的值为一个列表,通过对列表索引操作获得工作表1
# table = data.sheet_by_index(0)

# 获取行数和列数
# 行数:table.nrows
# 列数:table.ncols
print("总行数:" + str(table.nrows))
print("总列数:" + str(table.ncols))

# 获取整行的值 和整列的值,返回的结果为数组
# 整行值:table.row_values(start,end)
# 整列值:table.col_values(start,end)
# 参数 start 为从第几个开始打印,
# end为打印到那个位置结束,默认为none
print("整行值:" + str(table.row_values(0)))
print("整列值:" + str(table.col_values(1)))

# 获取某个单元格的值,例如获取B3单元格值
cel_B3 = table.cell(3,2).value
print("第三行第二列的值:" + cel_B3)

到此这篇关于如何用python处理excel表格的文章就介绍到这了,更多相关python处理excel表格详解内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表