openpyxl - 操作Excel文件

操作Excel文件

新建工作簿

新建工作簿不需要再系统中创建新文件,在内存中操作即可。

from openpyxl import Workbook

# 工作簿实例化
wb = Workbook()

工作簿创建后,工作簿至少有一个工作表,可以用openpyxl.workbook.Workbook.active()方法激活并获取。

# 激活获取工作表,此方法调用 _active_sheet_index方法,默认索引为0,即第一个工作表
ws = wb.active

也可以用openpyxl.workbook.Workbook.create_sheet()方法创建工作表。

# 默认在最后添加工作表
ws1 = wb.create_sheet()

# 在指定位置添加工作表,位置0,即第一个
ws2 = wb.create_sheet(0)

工作表会按照创建顺序自动命名:(Sheet, Sheet1, Sheet2, …)。也可手动命名:

ws.title = "New Title"

工作表标签颜色可以设置RGB颜色,默认为白色。效果如图所示。

ws.sheet_properties.tabColor = "1072BA"

这里写图片描述

可以通过工作表名称获取工作表,以下两种方式效果相同。

ws3 = wb["New Title"]
ws4 = wb.get_sheet_by_name("New Title")

可以通过openpyxl.workbook.Workbook.get_sheet_names()获取工作簿所有工作表的名称,返回值为list类型。

>>> print(wb.get_sheet_names())
['Sheet2', 'New Title', 'Sheet1']

处理数据

获取一个单元格

获取一个工作表后,可以直接利用坐标获取单元格,若单元格不存在,则被创建。

c = ws['A4']

可以对单元格的值直接赋值。

ws['A4'] = 4

也可以通过以下两种方式获取单元格,效果相同。

c = ws.cell('A4')

# 指定行和列获取,从1开始,不从0开始。
d = ws.cell(row = 4, column = 1)

注意:每次实例化工作表时,工作表为空,不包含单元格,只有获取单元格,即单元格被实例化之后,单元格才被创建。这样也减小了内存的占用。所以当以任何方式实例化单元格、获取单元格时,单元格都会被创建。例如下面的遍历会创建100*100的单元格。

>>> for i in range(1,101):
...     for j in range(1,101):
...         ws.cell(row = i, column = j)

获取多个单元格

利用切片可以获取指定区域的单元格。

cell_range = ws['A1':'C2']

也可以使用openpyxl.worksheet.Worksheet.iter_rows()实现:

>>> tuple(ws.iter_rows('A1:C2'))
((<Cell Sheet1.A1>, <Cell Sheet1.B1>, <Cell Sheet1.C1>),
 (<Cell Sheet1.A2>, <Cell Sheet1.B2>, <Cell Sheet1.C2>))

>>> for row in ws.iter_rows('A1:C2'):
...     for cell in row:
...         print cell
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>

如果需要迭代工作表中所有行和列可以使用属性:openpyxl.worksheet.Worksheet.rows()openpyxl.worksheet.Worksheet.columns(), 返回值类型为tuple

>>> ws = wb.create_sheet() # 实例化工作表,此时工作表为空 
>>> ws.rows()
()
>>> ws.columns()
()
>>> ws['C9'] = 'hello world' # 实例化C9单元格,此时A1到C9单元格都会被创建
>>> ws.rows
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
>>> ws.columns
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))

写数据

获取单元格后,可对其写数据:

>>> c.value = 'hello, world'
>>> print(c.value)
'hello, world'

>>> d.value = 3.14
>>> print(d.value)
3.14

Excel还会保留python的格式和类型。

>>> wb = Workbook(guess_types=True)
>>> c.value = '12%'
>>> print(c.value)
0.12

>>> import datetime
>>> d.value = datetime.datetime.now()
>>> print d.value
datetime.datetime(2010, 9, 10, 22, 25, 18)

>>> c.value = '31.50'
>>> print(c.value)
31.5

保存

直接对实例化的工作簿调用openpyxl.workbook.Workbook.save()方法即可:

wb.save('sample.xlsx')

注意: 这种用法会覆盖同名文件,并且没有提示。保存的文件后缀没有强制要求为xlsx或者xlsm等,但若后缀不正确可能会打不开。由于excel文件本身就是zip压缩文件,所以后缀可以直接设为zip。

可以指定参数 as_template=True将文件保存为模板文件:

wb.save('document_template.xltx', as_template=True)

也可指定参数as_template=False(默认参数)将模板文件或普通文件保存为普通文件:

>>> wb = load_workbook('document_template.xltx')
>>> wb.save('document.xlsx', as_template=False)
>>> wb = load_workbook('document.xlsx')
>>> wb.save('new_document.xlsx', as_template=False)

当打开或保存excel文件时,必须指定正确的后缀和必要的参数,否则将打开或保存失败。如以下操作均会失败:

>>> wb = load_workbook('document.xlsx')
>>> # 如果直接保存xlsx文件时,需指定xlsx后缀,否则保存的文件打不开
>>> wb.save('new_document.xlsm')
>>>
>>> # 启用宏的xlsm格式文件需指定参数:keep_vba=True, 否则保存的文件打不开
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # 若果要保存为模板文件需指定后缀为xltm,并且指定参数as_template=True,否则保存的文件打不开
>>> wb.save('new_document.xlsm', as_template=True)

编辑文件

可以利用openpyxl.load_workbook()方法编辑已有文件:

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值