如何使用Python Win32com查找最后一行是否具有Excel中特定列的值

时间:2014-11-06 05:29:37

标签: python excel win32com

我有一个Excel文件,我使用python Win32com对它进行操作。

如何检查最后一行是否在特定列中具有值?

当我尝试时,nrows是28,而不是23(最后一行的值不是空的)

 used = sht1.UsedRange
 nrows = used.Row + used.Rows.Count - 1

i want to find the position I24

5 个答案:

答案 0 :(得分:3)

当您想要获取任何特定列的最后一行时,UsedRange始终不可靠。您应该使用EndXlUp或EndXlDown函数。

检查以下行:

LastRow = Sheets("Sheet1").Range("A" & Sheets("Sheet1").Rows.Count).End(xlUp).Row

其中, A是获取最后一行的列。

另外,请检查以下网址:Error in finding last used cell in VBA

由于您正在使用python win32 com,Endxlup将无法正常工作。你可以做一件基本的事情。检查以下代码:

ws = wb.Worksheets('Sheet1')
rw = 2
While ws.cells(rw, 1) <> ""
    rw +=1

其中, rw是您想要开始行计数的起始行。 1英寸(rw,1)表示列。 A列代表A。

这背后的逻辑是while循环将运行,直到它没有在A列中得到空白单元格,你将得到变量 rw

的行数

答案 1 :(得分:0)

我用这种愚蠢的方式来做。不确定是否有问题。到目前为止为自己工作

def find_lastrow_oncolumn(worksht, colno):
    used = worksht.UsedRange
    nrows = used.Row + used.Rows.Count - 1
    lastrow_havevalue = 0
    for k in range(nrows):
        if worksht.Cells(nrows-k, colno).Value is not None:
            print worksht.Cells(nrows-k, colno).Value, nrows-k , k
            lastrow_havevalue = nrows-k
            break
    return lastrow_havevalue

答案 2 :(得分:0)

xlUp与预定义的常数相差无几。

所以最简单的方法是在VBE的直接窗口中输入代码

? xlUp

您将看到以下结果。

-4162

将该行添加到您的python代码

xlUp = -4162

完成!

答案 3 :(得分:0)

.End(xlUp).Row替换为.End(3).Row

答案 4 :(得分:0)

我当前正在编写一个Excel包装程序,其中一部分是此函数将所有数据从某个偏移量返回到该列的最后一行。例如,如果我想要从第三行到最后一行的所有内容。这个应该也可以解决您的问题。请注意从中检索常量的位置以及所有方法如何堆叠在一起以获取数据和最后一行。

主要功能:

def get_column_after(self, column, offset):
    for item in self.ws.Range("{0}{1}:{0}{2}".format(column, offset, self.get_last_row_from_column(column))).Value:
        print(item[0])

def get_last_row_from_column(self, column):
    return self.ws.Range("{0}{1}".format(column, self.ws.Rows.Count)).End(win32com.client.constants.xlUp).Row

注意:此代码正在进行中,目前仅支持一个工作表,每个实例一个工作簿。我相信您可以找到一种使它在您的项目中起作用的方法。

import string
import win32com.client

SOURCE_PATH = "C:\ExternData\somefile.xlsx"
WORKSHEET_NAME = "WS_1"

class ExcelInstance():
    def __init__(self, wb=None):
        self.source_path = SOURCE_PATH
        try:
            self.app = win32com.client.gencache.EnsureDispatch('Excel.Application')
        except:
            print("Application could not be opened.")
            return
        try:
            self.open_workbook()
        except:
            print("Workbook could not be opened.")
            return
        try:
            self.ws = self.wb.Worksheets(WORKSHEET_NAME) 
        except:
            print("Worksheet not found.")
            return
        self.app.Visible = True
        self.app.WindowState = win32com.client.constants.xlMaximized

    def open_workbook(self):
        """
        If it doesn't open one way, try another.
        """
        try:        
            self.wb = self.app.Workbooks(self.source_path)            
        except Exception as e:
            try:
                self.wb = self.app.Workbooks.Open(self.source_path)
            except Exception as e:
                print(e)
                self.wb = None   

    def get_column_after(self, column, offset):
        for item in self.ws.Range("{0}{1}:{0}{2}".format(column, offset, self.get_last_row_from_column(column))).Value:
            print(item[0])

    def get_last_row_from_column(self, column):
        return self.ws.Range("{0}{1}".format(column, self.ws.Rows.Count)).End(win32com.client.constants.xlUp).Row


def main():
    f = ExcelInstance()
    f.get_column_after("A", 3)

if __name__ == "__main__":
    main()