我有一个Excel文件,我使用python Win32com对它进行操作。
如何检查最后一行是否在特定列中具有值?
当我尝试时,nrows是28,而不是23(最后一行的值不是空的)
used = sht1.UsedRange
nrows = used.Row + used.Rows.Count - 1
答案 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()