Python Excel处理库openpyxl使用详解
本文详细介绍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')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









