Как получить номер столбца по значению ячейки в Python, используя openpyxl - PullRequest
0 голосов
/ 26 июня 2019

Я совершенно новичок в openpyxl и python, и мне трудно справиться с этой проблемой, и мне нужна ваша помощь.

JAN FEB MAR MAR YTD 2019 YTD
25   9  57     23           7
61  41  29     5           57
54  34  58    10            7
13  13  63    26           45
31  71  40    40           40
24  38  63    63           47
31  50  43    2            61
68  33  13    9            63
28  1   30    39           71

У меня есть отчет Excel с данными выше. Я хотел бы найти ячейки для тех, которые содержат определенную строку (т.е. YTD) и получить номер столбца для столбца YTD. Я хочу использовать номер столбца для извлечения данных для этого столбца. Я не хочу использовать ссылки на строки и ячейки, поскольку файл Excel регулярно обновляется, поэтому столбец d всегда будет перемещаться.

def t_PM(ff_sheet1,start_row):
    wb = openpyxl.load_workbook(filename='report')  # open report
    report_sheet1 = wb.get_sheet_by_name('sheet 1')

    col = -1
    for j, keyword in enumerate(report_sheet1.values(0)):
        if keyword=='YTD':
            col = j
            break      
    ff_sheet1.cell(row=insert_col + start_row, column= header['YTD_OT'], value=report_sheet1.cell(row=i + 7, column=col).value) 

Но затем я получаю сообщение об ошибке "объект генератора не вызывается". Как я могу это исправить?

1 Ответ

1 голос
/ 26 июня 2019

Ваша проблема в том, что report_sheet1.values является генератором, поэтому вы не можете вызвать его с помощью (0).По вашему коду я предполагаю, что вы не хотите полагаться, что «YTD» появится в первой строке, поэтому вы перебираете все ячейки.Сделайте это:

def find_YTD():
    wb = openpyxl.load_workbook(filename='report')  # open report
    report_sheet1 = wb.get_sheet_by_name('sheet 1')

    for col in report_sheet1.iter_cols(values_only=True):
        for value in col:
            if isinstance(value, str) and 'YTD' in value:
                return col

Если вы , предполагая, что эти данные будут в первом ряду, просто сделайте:

for cell in report_sheet1[1]:
    if isinstance(value, str) and 'YTD' in cell.value:
        return cell.column
  • openpyxl использует индексирование строк на основе 1

Чтение документов - доступ ко многим ячейкам

...