web-dev-qa-db-fra.com

Comment utiliser le nom de champ ou l'en-tête de colonne dans openpyxl?

Voir mon code ci-dessous. Ce code fonctionne très bien, mais je voudrais faire deux choses. Une chose est que j'ai fait si déclaration avec ou beaucoup plus courte que réelle par exemple. J'ai beaucoup de colonnes comme celle-ci, pas toutes côte à côte. Je voudrais que ce soit plus court. De plus, parfois, je ne connais pas la lettre exacte de la colonne.

Je veux donc savoir s’il existe un moyen de connaître le nom de la colonne ou l’en-tête. Comme les valeurs qui seraient dans la rangée très supérieure. Je peux donc tester pour voir si l'une de ces valeurs permet de toujours exécuter la fonction sur cette cellule si elle se trouve dans la colonne spécifiée. Je ne trouve pas la fonction openpyxl permettant de nommer la colonne. Je ne sais pas s'il comprend que la première ligne est différente du reste. Je pense que peut-être, sinon, je peux essayer de faire un test en première ligne, mais je ne comprends pas comment faire cela.

Alors, y a-t-il un moyen d'appeler le nom de la colonne? ou s'il n'y a aucun moyen d'appeler le nom de la colonne à tester, quelqu'un peut-il m'aider à vérifier la première ligne pour voir si elle a une valeur? alors est-ce que je change sur la bonne ligne? Est-ce que ça a du sens.

Donc, au lieu de dire:

if cellObj.column == 'H' or ...

Il dirait:

if cellObj.column_header == 'NameOfField or ...

Ou si ce n'est pas possible, alors:

if this cell has column where first row value is 'NameOfField' ...

S'il vous plaît aider avec le meilleur moyen de le faire. J'ai regardé sur stackoverflow et sur le site book and blog, mais cela ne semble pas être un moyen d'appeler le nom de la colonne (pas la lettre de la colonne).

for row in sheet.iter_rows():
 for cellObj in row:
    if cellObj.column == 'H' or cellObj.column == 'I' or cellObj.column == 'L' or cellObj.column == 'M':
        print(cellObj.value),
        if cellObj.value.upper() == 'OldValue1':
            cellObj.value = 1
            print(cellObj.value)
        Elif cellObj.value.upper() == 'OldValue2':
            cellObj.value = 2
            print(cellObj.value)
7
stahna

MODIFIER

En supposant qu'il s'agisse des noms d'en-tête que vous recherchez:

colnames = ['Header1', 'Header2', 'Header3']

Trouvez les index pour ces colonnes:

col_indices = {n for n, cell in enumerate(sheet.rows[0]) if cell.value in colnames}

Maintenant, parcourez les lignes restantes:

for row in sheet.rows[1:]:
    for index, cell in enumerate(row):
         if index in col_indices:
             if cell.value.upper() == 'OldValue1':
                  cell.value = 1
                  print(cell.value)
             Elif cell.value.upper() == 'OldValue2':
                 cell.value = 2
                 print(cell.value)

Utilisez un dictionnaire au lieu d'un ensemble pour conserver les noms de colonne autour de:

col_indices = {n: cell.value for n, cell in enumerate(sheet.rows[0]) 
               if cell.value in colnames}

for row in sheet.rows[1:]:
    for index, cell in enumerate(row):
        if index in col_indices:
            print('col: {}, row: {}, content: {}'.format(
                   col_indices[index], index, cell.value))
            if cell.value.upper() == 'OldValue1':
                 cell.value = 1
            Elif cell.value.upper() == 'OldValue2':
                 cell.value = 2

Ancienne réponse

Cela raccourcit votre déclaration if:

if cellObj.column in 'HILM':
    print(cellObj.value),

Pour les coordonnées de colonne multi-lettres, vous devez utiliser une liste:

if cellObj.column in ['H', 'AA', 'AB', 'AD']:
    print(cellObj.value),
5
Mike Müller

Vous pouvez accéder aux cellules de la première ligne et de la colonne à l'aide de la syntaxe sheet.cell (row = #, column = #). Par exemple:

for row in enumerate(sheet.iter_rows()):
    for j, cellObj in enumerate(row):
        header_cell = sheet.cell(row=1, column=j)

        if cellObj.column in ['H', 'I', 'L', 'M', 'AA', 'AB']:
            print(cellObj.value),
            if cellObj.value.upper() == 'OldValue1':
                cellObj.value = 1
                print(cellObj.value)
            Elif cellObj.value.upper() == 'OldValue2':
                cellObj.value = 2
                print(cellObj.value)
1
tornesi