Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python xlwings函数查找包含数据的最后一行_Python_Python 2.7_Xlwings - Fatal编程技术网

Python xlwings函数查找包含数据的最后一行

Python xlwings函数查找包含数据的最后一行,python,python-2.7,xlwings,Python,Python 2.7,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')) import xlwings workbook_all = xlwings.Book(r'p

我正在尝试查找包含数据的列中的最后一行。要替换vba函数,请执行以下操作:
LastRow=sht.Cells(sht.Rows.Count,“A”).End(xlUp).Row

我正在尝试这一点,但这会拉入Excel中的所有行。我怎么才能坐到最后一排呢

from xlwings import Workbook, Range
wb = Workbook()
print len(Range('A:A'))
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)
试试这个:

import xlwings as xw

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

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

print len(cellsDown)

print len(cellsRight)

您可以尝试使用
方向
,从最底部开始,然后向上移动:

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)

这与crazymachu的答案非常相似,只是被一个函数所包围。从xlwings的0.9.0版开始,您可以执行以下操作:

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

直观地说,函数从查找工作簿中最右下角的单元格开始。然后,它移动到所选列,然后向上移动,直到它到达第一个非空单元格。

可以使用通过api属性公开的VBA查找函数(使用它查找任何带星号的内容,并从第一个单元格开始搜索)

例如:

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))
这里列出的其他方法似乎不需要数据之间有空的行/列


来源:

综合以上答案,您可以在一行中完成:

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

我们可以使用范围对象查找最后一行和/或最后一列:

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)

python 3.6、XL0.11

溶质1 要查找包含数据的最后一行,您应该在水平和垂直方向上进行一些工作。您必须遍历每一列以确定哪一行是最后一行

from xlwings import Workbook, Range
wb = Workbook()
print len(Range('A:A'))
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\u all.selection.rows.count

另一种方式:
当您隐约知道数据右下角单元格的位置时,比如AAA10000,只需调用
objectiveSheet.range('A1:'+'AAA10000').current\u region.rows.count

,目前还没有现成的实现。但你总是可以按照解释来解决问题。另外,请看Hi,在代码中添加一些解释,因为这有助于理解您的代码。只有代码的答案是不受欢迎的。最简单和最好的解决方案-thx