Ячейки Excel только для чтения со значениями python win32com

У меня есть документ Excel, подобный следующему

num value1 value2

1       A      100
2       B      
3       c      300

Я хочу выполнить итерацию по value2 для чего-то со значением более 200, и если оно найдет значение более 200, напечатать value1. Большая проблема, с которой у меня возникла проблема, - это остановить цикл for, как только он достигнет конца ячеек с текстом в нем.

Мой цикл в идеале был бы примерно таким:

while columnA is not empty:
     if value2 > 200:
           print (value1)

несколько замечаний: я использую win32com. ColumnA никогда не будет пустым в моем наборе данных. Заранее благодарим вас за любую помощь, которую вы можете предоставить!

Изменить: у меня не всегда будет одинаковое количество строк для каждого документа. Мне нужно, чтобы он автоматически останавливался. Извините, что не яснее


person nico    schedule 15.12.2016    source источник
comment
Вы анализируете xls, xlsx или смесь форматов?   -  person Steve Barnes    schedule 15.12.2016
comment
Не могли бы вы использовать библиотеку pandas?   -  person zipa    schedule 15.12.2016
comment
к сожалению, мне приходится использовать библиотеку win32com. Я буду использовать только xlsx   -  person nico    schedule 16.12.2016
comment
Пожалуйста, опубликуйте фактический код, который вы tr   -  person Oliver    schedule 16.12.2016


Ответы (2)


Рассмотрите возможность использования библиотеки объектов Excel, в частности ее Range Object или Свойство Worksheet.Cells. Кроме того, обычно в Excel VBA вы просматриваете рабочий лист, чтобы найти последнюю строку, а затем выполняете цикл, пока не дойдете до нее:

Таблица Excel

Рабочий лист Excel

COM-код Python (используя try/except/finally, чтобы всегда освобождать ресурсы независимо от ошибки)

import win32com.client as win32

try:
    f = "myWorkbook.xlsx"
    xl = win32.gencache.EnsureDispatch('Excel.Application')
    wb = xl.Workbooks.Open(f)
    ws = wb.Worksheets(1)

    xlUp = -4162
    lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1

    for i in range(2,lastrow):
        # LOOP RANGE OBJ
        if ws.Range("C" + str(i)).Value is not None and ws.Range("C" + str(i)).Value > 200:
            print(ws.Range("B" + str(i)).Value)

        # LOOP CELLS OBJ
        if ws.Cells(i,3).Value is not None and ws.Cells(i,3).Value > 200:
            print(ws.Cells(i,2).Value)

    wb.Close(False)
    xl.Quit

except Exception as e:
    print(e)

finally:
    ws = None
    wb = None
    xl = None

Вывод

c
c
person Parfait    schedule 16.12.2016
comment
Благодарю вас! Это мне значительно помогло. Код последней строки был именно тем, что я искал. - person nico; 16.12.2016
comment
Кто-нибудь может объяснить магическое число xlUp = -4162? Тем не менее, это тоже помогло мне, +1. - person Emilio M Bumachar; 13.08.2019
comment
@EmilioMBumachar, см. константы Excel для XlDirection перечисление. - person Parfait; 13.08.2019

Я не уверен, как вы анализируете файл excel, но если вы используете модуль xlrd, я думаю, что что-то вроде этого может сработать.

    workbook = xlrd.open_workbook('read_file.xlsx')

    worksheet = workbook.sheet_by_index(0)

    for i in range(1,4):
        if worksheet.cell(i, 2).value > 200:
            print worksheet.cell(i,1)

для диапазона цикла, я думаю, вы можете указать количество строк, но я не помню этого прямо сейчас.

person Mirjeta    schedule 15.12.2016
comment
но не означает ли это, что мне всегда нужно знать количество строк? - person nico; 16.12.2016