如何在Python的openpyxl包中使用iter_rows()函数?

17

我正在使用Python(Canopy)中的openpyxl包来使用Excel文件。我们可以在这个链接中找到这个教程:LINK

you can also use the openpyxl.worksheet.Worksheet.iter_rows() method:

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

我们如何在Python中导入openpyxl.worksheet.Worksheet.iter_rows()方法?我使用了以下代码:

import openpyxl as op
ms = op.load_workbook('mtest.xlsx')

ws = ms.active

op.worksheet.Worksheet.iter_rows()

这段代码返回:

type object 'Worksheet' has no attribute 'iter_rows' 

问题是什么?

1个回答

29

教程所示,您需要在工作表实例上调用iter_rows方法,例如(对于openpyxl 2.5.14或更早版本):

>>> for row in ws.iter_rows('A1:C2'):
...        for cell in row:
...            print cell

或者

>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...    for cell in row:
...        print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>

如您所述的错误信息,您正在调用 Worksheet 类型,这是行不通的;它需要在一个对象上调用:
op.worksheet.Worksheet.iter_rows()  # wrong

另请参见另一个答案中的 此示例

对于旧版本的openpyxl,您可能需要确保在加载工作簿时启用迭代器-请参见此线程。对于较新版本,不需要此操作。

这是一个完整的示例,我刚在Python REPL中进行了测试(使用openpyxl 1.8.3):

>>> import openpyxl as op
>>> wb = op.load_workbook('/tmp/test.xlsx', use_iterators=True)
>>> ws = wb.active
>>> for row in ws.iter_rows():
...   for cell in row:
...     print cell
... 
RawCell(row=1, column='A', coordinate='A1', internal_value=1.0, data_type='n', style_id='0', number_format='general')
RawCell(row=1, column='B', coordinate='B1', internal_value=10.0, data_type='n', style_id='0', number_format='general')
...

4
在最近版本中,您不需要启用迭代器;标准工作表也具有 iter_rows() 方法。 - Charlie Clark
谢谢 - 我似乎使用的是相当旧的版本(1.8.3;最新版本是2.2.1)- 我会稍微修改答案。 - DNA
升级通常是非常值得的。我们很快将推出2.2.2版本的修复,但即便如此,2.2版本比1.8更可靠和更快。 - Charlie Clark
6
对于我来说,使用ws.iter_rows('A1:C2')并没有起作用,但是使用ws.iter_rows(min_row=1, max_col=3, max_row=2)可以。第一个语法会报TypeError: 'str' object cannot be interpreted as an integer. - Mike_K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接