首页 文章

使用xlwings计算Python中excel表中的行数

提问于
浏览
0

我有一个Python脚本,它使用xlwings打开一个Excel文件,并逐行读取和处理某列的值 . 这是for语句:

for row in range(2, rownum):

我想在工作表中实际包含某些内容的每一行上重复此功能 . 它从2开始,到'rownum'结束 . 我的问题是如何自动计算行数并将该值传递给'rownum' . 我确定xlwings有办法做到这一点,但我无法弄明白 - 也许是Autofit工具?

谢谢您的帮助!

6 回答

  • 2

    除非我在阅读他们的API documentation时遗漏了某些东西,否则它似乎不可能 . 您可能需要使用其他库,例如 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
    
  • 0

    这都是API Documentation

    如果您只查找行数,则可以使用范围的 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'
    

    但正如其他答案中所提到的,这会使app之间的调用倍增,这将会相当慢 . 更好地导入范围,修改它并将其导出回Excel .

  • 5

    使用xlwings,您将首先读取Range,然后迭代它:

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

    然后在结束时,将结果写回:

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

    这样可以最大限度地减少缓慢的跨应用程序调用 .

    您可能还想使用Range.table .

  • 0

    如果没有空白行,您可以使用:

    len(Range('A1').vertical)
    
  • 0

    我不得不制作一个柜台,因为我自动化了一大堆从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
    
  • 0

    您不需要知道工作表中有多少行 .

    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列中的所有数据 .

相关问题