web-dev-qa-db-fra.com

Afficher les valeurs de ligne dans openpyxl

Dans le module csv en python, il y a une fonction appelée csv.reader qui vous permet d'itérer sur une ligne, renvoie un objet lecteur et peut être conservé dans un conteneur comme une liste.

Ainsi, lorsque la liste attribuée à une variable et est imprimée, c'est-à-dire:

csv_rows = list(csv.reader(csvfile, delimiter=',', quotechar='|'))
print (csv_rows)
>
>
>
[['First Name', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'] # I gave an example of the function outputting a header row

Jusqu'à présent, je ne vois pas de fonction similaire comme celle-ci dans l'openpyxl. Je peux me tromper, alors je me demande si l'un d'entre vous peut m'aider.

Mise à jour

@alecxe, votre solution fonctionne parfaitement (sauf sa conversion de ma date de naissance en format datetime au lieu d'une chaîne régulière).

def iter_rows(ws):
for row in ws.iter_rows():
    yield [cell.value for cell in row]
>
>
>>> pprint(list(iter_rows(ws)))
[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex'], ['John', 'Smith', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']]

Depuis que je suis débutant, je voulais savoir comment cela fonctionnerait si j'utilisais une boucle for au lieu d'une compréhension de liste.

J'ai donc utilisé ceci:

def iter_rows(ws):
result=[]
for row in ws.iter_rows()
    for cell in row:
        result.append(cell.value)
yield result

Il presque me donne exactement la même sortie, à la place, il me donne ceci: Comme vous pouvez le voir, il me donne essentiellement une liste gigantesque au lieu d'une liste imbriquée dans le résultat que tu m'as donné.

>>>print(list(iter_rows(ws)))

[['First Nam', 'Last Name', 'Zodicac', 'Date of birth', 'Sex', 'David', 'Yao', 'Snake', datetime.datetime(1989, 9, 4, 0, 0), 'M']]
11
dyao

iter_rows() a probablement un sens similaire:

Renvoie une plage au carré basée sur le paramètre range_string, à l'aide de générateurs. Si aucune plage n'est transmise, itérera sur toutes les cellules de la feuille de calcul

>>> from openpyxl import load_workbook
>>> 
>>> wb = load_workbook('test.xlsx')
>>> ws = wb.get_sheet_by_name('Sheet1')
>>> 
>>> pprint(list(ws.iter_rows()))
[(<Cell Sheet1.A1>,
  <Cell Sheet1.B1>,
  <Cell Sheet1.C1>,
  <Cell Sheet1.D1>,
  <Cell Sheet1.E1>),
 (<Cell Sheet1.A2>,
  <Cell Sheet1.B2>,
  <Cell Sheet1.C2>,
  <Cell Sheet1.D2>,
  <Cell Sheet1.E2>),
 (<Cell Sheet1.A3>,
  <Cell Sheet1.B3>,
  <Cell Sheet1.C3>,
  <Cell Sheet1.D3>,
  <Cell Sheet1.E3>)]

Vous pouvez le modifier un peu pour produire une liste de valeurs de ligne, par exemple:

def iter_rows(ws):
    for row in ws.iter_rows():
        yield [cell.value for cell in row]

Démo:

>>> pprint(list(iter_rows(ws)))
[[1.0, 1.0, 1.0, None, None],
 [2.0, 2.0, 2.0, None, None],
 [3.0, 3.0, 3.0, None, None]]
12
alecxe

Je l'ai fait fonctionner en utilisant cette méthode:

all_rows = []

for row in worksheet:
    current_row = []
    for cell in row:
        current_row.append(cell.value)
    all_rows.append(current_row)

Essentiellement, j'ai créé une liste pour toutes les données. Ensuite, j'ai parcouru chaque ligne de la feuille de calcul. Chaque cell.value dans une ligne a été ajouté à une liste à court terme (ligne actuelle). Une fois que tous les cell.values dans la ligne sont ajoutés à la liste à court terme, la liste à court terme est ajoutée à la liste à long terme.

2
Joseph Zullo