Подсчет строк в листе Excel в Python с помощью xlwings

У меня есть скрипт на Python, который использует xlwings для открытия файла Excel, чтения и обработки значений определенного столбца построчно. Вот инструкция for:

for row in range(2, rownum):

Я хотел бы повторить эту функцию для каждой строки на листе, которая действительно что-то содержит. Он начинается с 2 и заканчивается на «rownum». Мой вопрос заключается в том, как автоматически подсчитать количество строк и передать это значение в «rownum». Я уверен, что у xlwings есть способ сделать это, но я не могу понять - возможно, инструмент Autofit?

Спасибо за помощь!


person cars0245    schedule 27.07.2015    source источник


Ответы (6)


Если я что-то не пропустил при чтении их документации по API, это кажется невозможным. Возможно, вам придется использовать другие библиотеки, например pandas:

import pandas as pd

df = pd.read_excel(excel_file_path, sheetname="Sheet1")
print len(df)

Если вы не хотите использовать другую библиотеку только для этого, вы можете сделать это сложным и уродливым способом:

last_row = 0
while True:
    if cell_value is not None:  # replace cell_value with however 
                                # xlwings accesses a cell's value
       last_row += 1
    else:
        break

print last_row
person DeepSpace    schedule 27.07.2015
comment
Это должно быть имя_листа, а не имя_листа. Параметр имя_листа устарел, а затем заменен на имя_листа в 2018 году. - person zeeks; 04.09.2020

Это вся документация по API.

Если вы ищете только количество строк, вы можете получить общее количество строк в вашем массиве/таблице, используя свойство current_region вашего диапазона, а затем получив адрес последней ячейки этого диапазона: (это работает только если ваш диапазон непрерывен - внутри него нет пустых строк/столбцов)

rownum = Range('A1').current_region.last_cell.row

В качестве альтернативы вы можете использовать table вместо current_region, просто диапазон будет немного другим.

Получив это, вы можете просто перебирать строки:

for i in range(1, rownum + 1): # The indexing starts at 1
    Range((i, 1)) = ...    # Will select cell 'Ai'

Но, как упоминалось в других ответах, это увеличивает количество вызовов между приложениями, что будет значительно медленнее. Лучше импортируйте диапазон, измените его и экспортируйте обратно в Excel.

person ursan    schedule 13.08.2015

С xlwings вы должны сначала прочитать диапазон, а затем перебрать его:

rng = Range((startrow, startcol), (rownum, colnum)).value
for row in rng:
    ...

Затем в конце запишите результат обратно:

Range((startrow, startcol)).value = result_rng

Таким образом вы минимизируете медленные вызовы между приложениями.

Вы также можете использовать Range.table.

person Felix Zumstein    schedule 27.07.2015

Мне пришлось сделать счетчик, потому что я автоматизирую кучу вещей, которые берут из excel и заливают на разные сайты. Это всего лишь «прототип», который я придумал, чтобы убедиться, что я смогу это сделать.

wb = xw.Book(r'C:\Users\dd\Desktop\Testbook.xlsm') 
Dudsht = wb.sheets['Dud']

lastcell = Dudsht.range(1,1).end('down').row #this just does ctrl+shift+down
print(lastcell) #just so you know how many rows you have. Mine was 30.

x = 2
for i in range(x, lastcell+1):               #range of 2 to 30
        Dudsht.cells(i,2).value = 'y'        #enters 'y' triggering formulas
        if Dudsht.cells(i,1).value == 'ERROR':  
            Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 2
            continue          #if there is an error it will hightlight and skip an item
        time.sleep(.5)            #this was just so I could see visually
        Dudsht.cells(i,2).value = 'x'  
        print('Item' + str(i) + ' Complete')  #Item1 Complete
        time.sleep(.5)
        Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 3  #highlights completed item
person Noctsol    schedule 09.03.2018

Если нет пустой строки, вы можете просто использовать это:

len(Range('A1').vertical)
person HongChu Liu    schedule 23.02.2016

Вам не нужно знать, сколько строк в листе.

import xlwings as xw

wb = xw.Book('20180301.xlsm')
sh = wb.sheets['RowData']

rownum = 2
while (sh.range('A'+str(rownum)).value != None):
    value = sh.range('A'+str(rownum)).value
    print(str(value))
    rownum += 1

Это распечатает все данные в столбце A.

person Leonard Chung    schedule 27.04.2018