繁体   English   中英

通过MS Excel获取Excel行号

[英]Get Excel row number via MS Excel

我有下面的代码,它用于查找匹配的单元格值并返回匹配的单元格值的行,例如在单元格D57(第58行)上查找值是“ LogiGear”,它将返回第58行。我想对此进行改进代码,仅查找D列。 我不知道为什么它返回错误“无效的类字符串”。

有什么建议吗?

'''
get excell row number via MS
'''

def GetExcellRowNumberViaMS(strFile, strSheet, text):
    try:
        bFound = False
        #Create an instance of Excel.Application        
        xlApp = win32com.client.Dispatch("Excel.Application")
                    lnRowNumber=0;
                    i = 1
                    lastrow = xlSheet.UsedRange.Rows.Count
                    lastcol = xlSheet.UsedRange.Columns.Count
                    while(i<65000 and bFound ==False):
                        if(i == lastrow+1):
                            break
                        j = 1
                        while(j<256):
                            if(j == lastcol+1):
                                break
                            value = str(xlSheet.Cells(i,j).Text)
                            if(value.strip() == str(text).strip()):
                                lnRowNumber = i
                                bFound = True
                                break
                            j = j + 1
                        i = i + 1     
                    return lnRowNumber
    except Exception:
        return 0

提出问题时,包括一个预期输入和输出的小示例会很有帮助。 (对于以后的问题,您应该这样做。)

这是我在Excel中编写的一个示例。 我们要查找的是Vegetable行。

在此处输入图片说明

您最初发布的代码将搜索所有行和列。 当简化并以“ pythonic”样式编写时,它看起来像:

import win32com.client

excel = win32com.client.Dispatch("Excel.Application")
worksheet = excel.ActiveSheet # The currently open worksheet, in the currently open file.

# This version searches all rows and columns.
for row_num in range(worksheet.UsedRange.Rows.Count):
    for col_num in range(worksheet.UsedRange.Columns.Count):
        # Note Python's range() counts from 0 and Excel counts from 1
        value = worksheet.Cells(row_num + 1, col_num + 1).Value
        print ("Value at row %i, column %i is `%s`" % (row_num, col_num, value))
        if value == "Vegetable":
            print "Hooray! Row %i is a vegetable!" % row_num

输出如下:

...
Value at row 4, column 0 is `5.0`
Value at row 4, column 1 is `Eggplant`
Value at row 4, column 2 is `Vegetable`
Hooray! Row 4 is a vegetable!
Value at row 5, column 0 is `6.0`
...

上面的代码遍历所有列号。 通过将col_num固定为某个数字,可以告诉它仅查看一列。

for row_num in range(worksheet.UsedRange.Rows.Count):
    col_num = 2 # Fixed to look at column 2 only
    # Note Python's range() counts from 0 and Excel counts from 1
    value = worksheet.Cells(row_num + 1, col_num + 1).Value
    print ("Value at row %i, column %i is `%s`" % (row_num, col_num, value))
    if value == "Vegetable":
        print "Hooray! Row %i is a vegetable!" % row_num

现在的输出如下所示:

Value at row 0, column 2 is `Fruit`
Value at row 1, column 2 is `Fruit`
Value at row 2, column 2 is `Fruit`
Value at row 3, column 2 is `Fruit`
Value at row 4, column 2 is `Vegetable`
Hooray! Row 4 is a vegetable!
Value at row 5, column 2 is `Fruit`

请注意,只有一行代码被更改。


最后,

except Exception:
    return 0

捕获所有异常是可怕的做法。 它可以防止您看到错误。 如果看不到错误,则无法调试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM