obtention des numéros de ligne et de colonne à partir de la valeur de coordonnées dans openpyxl

j'essaie de cacher une valeur de coordonnées dans excel à un numéro de ligne et de colonne dans openpyxl.

par exemple si ma coordonnée de cellule est D4 je veux trouver les numéros de ligne et de colonne correspondants à utiliser pour les opérations futures, dans le cas Ligne = 3, colonne = 3. Je peux obtenir le numéro de la rangée facilement à l'aide de ws.cell('D4').row qui renvoie 4 ensuite, c'est juste une question de soustraire 1. Mais un argument similaire ws.cell('D4').column retourne D et je ne sais pas comment le mettre en forme facilement pour la suite des opérations. Alors je me tourne vers vous, les sages de stackoverflow. Pouvez-vous m'aider?

23
demandé sur A Alstone 2012-10-15 23:26:23

4 réponses

Ce que vous voulez, c'est openpyxl.utils.coordinate_from_string() et openpyxl.utils.column_index_from_string()

from openpyxl.utils import coordinate_from_string, column_index_from_string
xy = coordinate_from_string('A4') # returns ('A',4)
col = column_index_from_string(xy[0]) # returns 1
row = xy[1]
32
répondu Adam Morris 2016-11-10 23:17:03

openpyxl a une fonction appelée get_column_letter qui convertit un nombre en lettre de colonne.

from openpyxl.utils import get_column_letter
print(get_column_letter(1))

1 -->

50 --> AX

1234-- AUL

j'ai été en utilisant comme:

from openpyxl import Workbook
from openpyxl.utils import get_column_letter

#create excel type item
wb = Workbook()
# select the active worksheet
ws = wb.active

counter = 0
for column in range(1,6):
    column_letter = get_column_letter(column)
    for row in range(1,11):
        counter = counter +1
        ws[column_letter + str(row)] = counter

wb.save("sample.xlsx")

enter image description here

26
répondu Ohm 2017-08-03 05:02:59

Ceci est construit à partir de la réponse de Nathan. Fondamentalement, sa réponse ne fonctionne pas correctement lorsque la ligne et/ou colonne est plus que d'un caractère large. Désolé, je suis allé un peu par-dessus bord. Voici le script complet:

def main():
    from sys import argv, stderr

    cells = None

    if len(argv) == 1:
        cells = ['Ab102', 'C10', 'AFHE3920']
    else:
        cells = argv[1:]

    from re import match as rematch

    for cell in cells:
        cell = cell.lower()

        # generate matched object via regex (groups grouped by parentheses)
        m = rematch('([a-z]+)([0-9]+)', cell)

        if m is None:
            from sys import stderr
            print('Invalid cell: {}'.format(cell), file=stderr)
        else:
            row = 0
            for ch in m.group(1):
                # ord('a') == 97, so ord(ch) - 96 == 1
                row += ord(ch) - 96
            col = int(m.group(2))

            print('Cell: [{},{}] '.format(row, col))

if __name__ == '__main__':
    main()

Tl;dr avec un tas de commentaires...

# make cells with multiple characters in length for row/column
# feel free to change these values
cells = ['Ab102', 'C10', 'AFHE3920']

# import regex
from re import match as rematch

# run through all the cells we made
for cell in cells:
    # make sure the cells are lower-case ... just easier
    cell = cell.lower()

    # generate matched object via regex (groups grouped by parentheses)
    ############################################################################
    # [a-z] matches a character that is a lower-case letter
    # [0-9] matches a character that is a number
    # The + means there must be at least one and repeats for the character it matches
    # the parentheses group the objects (useful with .group())
    m = rematch('([a-z]+)([0-9]+)', cell)

    # if m is None, then there was no match
    if m is None:
        # let's tell the user that there was no match because it was an invalid cell
        from sys import stderr
        print('Invalid cell: {}'.format(cell), file=stderr)
    else:
        # we have a valid cell!
        # let's grab the row and column from it

        row = 0

        # run through all of the characters in m.group(1) (the letter part)
        for ch in m.group(1):
            # ord('a') == 97, so ord(ch) - 96 == 1
            row += ord(ch) - 96
        col = int(m.group(2))

        # phew! that was a lot of work for one cell ;)
        print('Cell: [{},{}] '.format(row, col))

print('I hope that helps :) ... of course, you could have just used Adam\'s answer,\
but that isn\'t as fun, now is it? ;)')
2
répondu dylnmc 2015-10-26 20:46:27

Vous pouvez simplement utiliser pur Python:

cell = "D4"
col = ord(cell[0]) - 65
row = int(cell[1:]) - 1

ceci utilise le ord fonction qui prend un caractère et renvoie son code ASCII. En ASCII la lettre A 65 ans, B 66 et ainsi de suite.

-3
répondu Nathan Villaescusa 2012-10-15 19:29:16