2015-04-22 62 views
6

Ich verwende openpyxl Paket in Python(Canopy), um Excel-Dateien zu verwenden. Wir haben dieses Tutorial in diesem Link: LINKWie können wir iter_rows() in Python openpyxl-Paket verwenden?

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> 

Wie wir openpyxl.worksheet.Worksheet.iter_rows() Methode in Python importieren? Ich habe diesen Code:

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

ws = ms.active 

op.worksheet.Worksheet.iter_rows() 

Dieser Code gibt Folgendes zurück:

type object 'Worksheet' has no attribute 'iter_rows' 

Was ist das Problem?

Antwort

6

Wie in den tutorial gezeigt, müssen Sie die iter_rows Methode auf einer Instanz von einem Arbeitsblatt zum Beispiel nennen:

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

oder

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

Wie Ihre Fehlermeldung besagt, Sie sind Rufen Sie es auf WorksheetTyp, die nicht funktionieren wird; muss es auf ein Objekt aufgerufen werden:

op.worksheet.Worksheet.iter_rows() # wrong 

Siehe auch this example in einer anderen Antwort.

Bei älteren Versionen von openpyxl müssen Sie möglicherweise sicherstellen, dass Iteratoren beim Laden Ihrer Arbeitsmappe aktiviert werden - siehe this thread. Dies ist für neuere Versionen nicht erforderlich.

Hier ist ein vollständiges Beispiel, das ich gerade in dem Python REPL getestet (mit 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') 
... 
+0

Sie brauchen keine Iteratoren in der letzten Versionen zu ermöglichen; Standardarbeitsblätter haben auch die 'iter_rows()' Methode. –

+0

Danke - Ich habe anscheinend eine ziemlich alte Version (1.8.3; neueste ist 2.2.1) - wird die Antwort leicht bearbeiten. – DNA

+0

Upgrades lohnt sich in der Regel. Wird bald eine 2.2.2 Bug-Version veröffentlichen, aber 2.2 ist zuverlässiger und schneller als 1.8 –