openpyxl 是一个用于读取/写入 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库
Excel 文件这里介绍下一些基本定义:Excel 电子表格文档称为工作簿。单个工作簿保存在扩展名为 .xlsx 的文件中。每个工作簿可以包含多个工作表。
安装 openpyxl 模块openpyxl 是一个第三方模块,当要用于处理 Excel 文件时,须先安装。使用以下的命令进行安装
$ pip install openpyxl
创建工作簿
可以通过导入 openpyxl 的 Workbook 类来创建工作簿(workbook)。例如:
>>> from openpyxl import Workbook
>>> wb = Workbook()
创建工作簿后,至少有一个工作表(worksheet)。可以使用 Workbook.active 属性来获取:
>>> ws = wb.active
默认情况下,这个方法获取的是第一个工作表
创建新的工作表 ,可以使用 Workbook.create_sheet()
方法:
>>> ws1 = wb.create_sheet('Mysheet')
>>> ws2 = wb.create_sheet('Mysheet', 0)
>>> ws3 = wb.create_sheet('Mysheet', -1)
创建新工作表的时候,会自动赋予一个名字。会按照(Sheet,Sheet1,Sheet2)这样的顺序依次赋值 。不过能够通过 Worksheet.title
属性来修改这个名称。
ws.title = "New Title"
如果想要查看一个工作簿中所有工作表的名称,可以通过 Workbook.sheetname
属性来进行查看:
>>> wb.sheetnames
['Mysheet1', 'New Title', 'Mysheet2', 'Mysheet']
当然也可以用循环遍历的方式:
>>> for sheet in wb:
... print(sheet)
...
处理数据
当创建完工作簿以及工作表后,现在就可以考虑修改单元格的内容。单元格能够作为工作表的键直接访问:
>>> c = ws['A1']
这个时候,将会返回 A1 处单元格,如果不存在的话,则创建一个。这个时候,可以直接赋值:
>>> ws['A1'] = 3
除了用这种大写字母(表示列)加数字(表示行)的形式来访问单元格。
还可以通过 Worksheet.cell()
方法直接使用行和列的表示法来访问单元格:
>>> a = ws.cell(row=3, column=1, value=8)
访问多个单元格
当需要访问多个单元格的时候,可以使用切片的方法。当访问一个区域可以参考如下写法:
>>> cell_range = ws['A1':'D3']
当访问多行或多列时,可以使用如下的方法:
>>> col_c = ws['C']
>>> col_range = ws['C':'D']
>>> row_10 = ws[10]
>>> row_range = ws[5:10]
除了使用上面切片的方法。同样可以使用 Worksheet.iter_rows()
方法访问,这个方法将逐行返回:
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=
2):
... for cell in row:
... print(cell)
...
同样的,还有 Worksheet.iter_cols()
方法,这个方法将逐列返回:
>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=
2):
... for cell in col:
... print(cell)
...
这里有需要注意的地方,Worksheet.iter_cols
方法在只读模式下不可用。
如果需要遍历的是文件中所有的行或列,则可以考虑 Worksheet.rows
属性:
>>> ws = wb.active
>>> ws['C4'] = 'Hello World!'
>>> tuple(ws.rows)
((, , ),
(, , ),
(, , ),
(, , ))
或者 Worksheet.columns
属性:
>>> tuple(ws.columns)
((,
,
,
),
(,
,
,
),
(,
,
,
))
返回单元格的值
如果只是需要返回工作表中单元格的值,可以使用 Worksheet.values
属性。
该方法将遍历工作表中所有行,但仅返回单元格中的值。
>>> for row in ws.values:
... for value in row:
... print(value)
...
None
None
None
None
None
None
None
None
None
Hello World!
None
Hello World!
保存数据到文件中
保存工作簿,可以使用 Workbook
对象的 Workbook.save()
方法:
>>> wb.save('temp.xlsx')
打开保存的文件,可以看到,下面的工作表名,正是上面创建的表名。
以及上面使用方法插入表格中的内容。
加载文件当加载文件,可以使用 openpyxl.load_workbook()
方法来打开一个本地存在的文件:
>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('temp.xlsx')
>>> wb2.sheetnames
['Mysheet1', 'New Title', 'Mysheet2', 'Mysheet']
补充
插入时间
>>> import datetime
>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('temp.xlsx')
>>> ws = wb2.active
>>> ws.title
'Mysheet1'
>>> ws['A1'] = datetime.datetime.now()
>>> ws['A1'].value
datetime.datetime(2020, 3, 29, 16, 29, 21, 786731)
>>> ws['A1'].number_format
'yyyy-mm-dd h:mm:ss'
使用公式
可以直接将 Excel 的公式,用字符串的格式赋值给某个单元格,如下:
>>> ws['A2'] = '=SUM(1,1)'
>>> ws['A2'].value
'=SUM(1,1)'
合并/拆分单元格
当需要合并和拆分单元格时,可以使用 worksheet.merge_cells()
方法以及 worksheet.unmerge_cells()
方法:
>>> ws.merge_cells('A2:B2')
>>> # 先将 A3:B3 合并,再尝试拆分
... ws.merge_cells('A3:B3')
>>> ws.unmerge_cells('A3:B3')
加载图像
这一步依赖 Pillow 库,所以使用之前需要先安装 Pillow 库。
>>> from openpyxl.drawing.image import Image
>>> img = Image('k.jpg')
>>> ws.add_image(img, 'A5')
>>> wb.save('temp_1.xlsx')
以上用法结果展示
在这张图片可以看到,A1 插入的时间已经生效。
A2 显示的结果是 2,红色标记的部分,表示这个结果是用这个公式得到的结果,也就说明公式插入也是生效的。
同时可以看到,A2:B2 单元格已经合并。
最后是插入图片,可以看到在 A5 单元格,成功插入了一张图片。
以上内容就是关于 openpyxl 库对 Excel 文件进行处理的简单用法。
欢迎关注微信公众号《书所集录》