xlwings, чтобы найти последнюю строку с данными

Я пытаюсь найти последнюю строку в столбце с данными. заменить функцию vba: LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

Я пытаюсь это сделать, но это вытягивает все строки в Excel. Как я могу просто получить последнюю строку.

from xlwings import Workbook, Range
wb = Workbook()
print len(Range('A:A'))

person user2242044    schedule 29.10.2015    source источник
comment
На данный момент ничего готового не реализовано. Но вы всегда можете обойти проблему, как описано здесь. Также посмотрите это   -  person Felix Zumstein    schedule 30.10.2015


Ответы (7)


Объединив ответы выше, можно сделать это в одну строку:

wb.sheet.range(column + last cell value).Get End of section going up[non blank assuming the last cell is blank].row

Пример кода:

import xlwings as xw
from xlwings import Range, constants

wb = xw.Book(r'path.xlsx')
wb.sheets[0].range('A' + str(wb.sheets[0].cells.last_cell.row)).end('up').row
person Cody    schedule 01.11.2018

Это очень похоже на ответ Crazymachu, просто заключенный в функцию. Начиная с версии 0.9.0 xlwings вы можете сделать это:

import xlwings as xw

def lastRow(idx, workbook, col=1):
    """ Find the last row in the worksheet that contains data.

    idx: Specifies the worksheet to select. Starts counting from zero.

    workbook: Specifies the workbook

    col: The column in which to look for the last cell containing data.
    """

    ws = workbook.sheets[idx]

    lwr_r_cell = ws.cells.last_cell      # lower right cell
    lwr_row = lwr_r_cell.row             # row of the lower right cell
    lwr_cell = ws.range((lwr_row, col))  # change to your specified column

    if lwr_cell.value is None:
        lwr_cell = lwr_cell.end('up')    # go up untill you hit a non-empty cell

    return lwr_cell.row

Интуитивно понятно, что функция начинается с поиска самой крайней правой нижней ячейки в рабочей книге. Затем он перемещается к выбранному вами столбцу, а затем вверх, пока не достигнет первой непустой ячейки.

person Stefan    schedule 14.09.2016

Можно использовать функцию поиска VBA, которая предоставляется через свойство API (используйте ее, чтобы найти что-нибудь со звездочкой и начать поиск с первой ячейки).

Пример:

row_cell = s.api.Cells.Find(What="*",
                   After=s.api.Cells(1, 1),
                   LookAt=xlwings.constants.LookAt.xlPart,
                   LookIn=xlwings.constants.FindLookIn.xlFormulas,
                   SearchOrder=xlwings.constants.SearchOrder.xlByRows,
                SearchDirection=xlwings.constants.SearchDirection.xlPrevious,
                       MatchCase=False)

column_cell = s.api.Cells.Find(What="*",
                      After=s.api.Cells(1, 1),
                      LookAt=xlwings.constants.LookAt.xlPart,
                      LookIn=xlwings.constants.FindLookIn.xlFormulas,
                      SearchOrder=xlwings.constants.SearchOrder.xlByColumns,
                      SearchDirection=xlwings.constants.SearchDirection.xlPrevious,
                      MatchCase=False)

print((row_cell.Row, column_cell.Column))

Другие описанные здесь методы не требуют пустых строк/столбцов между данными.

источник: https://gist.github.com/Elijas/2430813d3ad71aebcc0c83dd1f130e33

person Elijas Dapšauskas    schedule 08.10.2017

Вы можете попробовать использовать Direction, начав с самого низа, а затем двигаясь вверх:

import xlwings
from xlwings.constants import Direction
wb = xlwings.Workbook(r'data.xlsx')
print(wb.active_sheet.xl_sheet.Cells(65536, 1).End(Direction.xlUp).Row)
person crazymachu    schedule 18.03.2016

Мы можем использовать объект Range, чтобы найти последнюю строку и/или последний столбец:

import xlwings as xw

# open raw data file
filename_read = 'data_raw.csv'
wb = xw.Book(filename_read)
sht = wb.sheets[0]

# find the numbers of columns and rows in the sheet
num_col = sht.range('A1').end('right').column
num_row = sht.range('A1').end('down').row

# collect data
content_list = sht.range((1,1),(num_row,num_col)).value
print(content_list)
person Sung Eun Jo    schedule 31.10.2019
comment
самое простое и лучшее решение - спасибо - person DrWhat; 23.04.2021

Попробуй это:

import xlwings as xw

cellsDown = xw.Range('A1').vertical.value

cellsRight = xw.Range('A1').horizontal.value

print len(cellsDown)

print len(cellsRight)
person user1579506    schedule 14.03.2016
comment
Привет, добавьте немного объяснений вместе с кодом, так как это помогает понять ваш код. Ответы только на код не одобряются. - person Bhargav Rao; 15.03.2016

питон 3.6, xlwings 0.11

Раствор 1

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

import xlwings
workbook_all = xlwings.Book(r'path.xlsx')
objectiveSheet = workbook_all .sheets['some_sheet']
# lastCellContainData(), inspired of Stefan's answer.
def lastCellContainData(objectiveSheet,lastRow=None,lastColumn=None):
    lastRow = objectiveSheet.cells.last_cell.row if lastRow==None else lastRow
    lastColumn = objectiveSheet.cells.last_cell.column if lastColumn==None else lastColumn
    lastRows,lastColumns = [],[]
    for col in range(1,lastColumn):
        lastRows.append(objectiveSheet.range((lastRow, col)).end('up').row)
        # extract last row of every column, then max(). Or you can compare the next 
        # column's last row number to the last column's last row number. Here you get
        # the last row with data, you can also go further get the last column with data:
    for row in range(1,lastRow):
        lastColumns.append(objectiveSheet.range((row, lastColumn)).end('left').column)
    return max(lastRows),max(lastColumns)
    
lastCellContainData(objectiveSheet,lastRow=5000,lastColumn=300)

Я добавил lastRow и lastColumn. Чтобы сделать программу более эффективной, вы можете установить эти параметры в соответствии с приблизительной формой данных, с которыми вы имеете дело.

Решение 2

xlwings удостоен чести быть оболочкой pywin32. Я не знаю, позволяет ли ваша ситуация использовать клавиатуру или мышь. Если да, то сначала вы ctrl+tab переключаетесь на рабочую книгу, затем ctrl+a выбираете область, содержащую данные, затем вызываете workbook_all.selection.rows.count.

другой способ: когда вы знаете, где находится правая нижняя ячейка ваших данных, скажем, AAA10000, просто позвоните objectiveSheet.range('A1:'+'AAA10000').current_region.rows.count

person Steven    schedule 10.02.2021