XlDirectionDown并使用Python选择填充单元格

XlDirectionDown并使用Python选择填充单元格,python,win32com,Python,Win32com,我已经问了这个根本问题,但我想我可以看看是否能得到更多的帮助。我正在尝试使用XlDirectionDown来选择Excel电子表格中最后一个填充的单元格 最后,我想使用Python从A到AE选择此工作表中的所有填充单元格。它将被复制到一个文本文件并附加到SQL Server中…所以我不想要任何空白 到目前为止,我所拥有的: import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Applicatio

我已经问了这个根本问题,但我想我可以看看是否能得到更多的帮助。我正在尝试使用XlDirectionDown来选择Excel电子表格中最后一个填充的单元格

最后,我想使用Python从A到AE选择此工作表中的所有填充单元格。它将被复制到一个文本文件并附加到SQL Server中…所以我不想要任何空白

到目前为止,我所拥有的:

import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = 1;

excel.Workbooks.Open('G:/working.xlsx')

XlDirectionDown = 4

last = excel.Range("A:A").End(XlDirectionDown)
excel.Range("A1:A"+str(last)).Select()
首先,XlDirectionDown似乎不起作用。Excel中的光标保留在第一个单元格上。
其次,我得到了代码最后一行的一个异常(与范围有关)。有人知道这个代码是怎么回事吗?另外,有关于Win32 COM或Pywin32的文档吗??我找不到任何指导!一如既往地感谢大家。

我开始使用win32com和Excel

在您的代码中,
excel.Range(“A:A”).End(XlDirectionDown)
返回什么?测试一下。您可能需要添加
.Select()
,然后使用
excel.Selection.Address
获取最后一个单元格。在交互模式下测试,更容易看到那里发生了什么

作为替代方案,您可以使用while循环遍历单元格。此代码循环行,直到出现空单元格:

excel.Range("A1").Select()
while excel.ActiveCell.Value:
    val = excel.ActiveCell.Value
    print(val)
    excel.ActiveCell.Offset(2,1).Select()  # Move a row down

最后一行有点滑稽;在VBA中,您应该写入
偏移量(1,0)
以向下移动一行。然而,在Python中,您必须在行和列中都添加一个。可能是因为索引?

我使用了一个特定的单元格,而不是单元格范围作为起点。替换

last = excel.Range("A:A").End(XlDirectionDown)

但是,如果有任何空白单元格,这将在它之前停止。您可能想改用
UsedRange()
。根据Excel,这将是包含所有单元格的最小范围:您可能会发现(正如我所看到的)结果范围比AE(末尾包含空白列)宽,并且在底部包含许多完全空白的行。但是,由于您希望以任何方式过滤掉空白单元格,因此在过滤过程中将跳过这些单元格

至于最后一行代码上的异常,这是因为End返回一个Range对象,并且不能将Range转换为字符串,或者如果可以,那么
str(last)
是一个Range,那么
“A1:a”+str(last)
将是一个无效的Range

至于过滤空白单元格,我不确定这意味着什么:当你把数据复制到文本文件时,你会为空白单元格放什么?如果你有“一个空白的C”,你会写“一个C”吗?C将在数据库的错误列中结束。无论如何,这只是引起我注意的事情


win32com的文档没有一个单独的位置,尽管《Windows上的Python》一书中有很多信息,而且google会为您提供非常有用的结果,包括SO点击。每当我使用Excel COM(这不是python的win32com特有的)时,有一件事总是让我感到困惑,那就是工作簿中的所有内容都是一个范围,你不能有一个单独的单元格,即使某些方法或属性可能会让你认为你得到的是一个单元格,而实际上你得到的是一个范围,它通常需要额外考虑如何到达所需的细胞

感谢Scholli和Olav的回复。我快到了。我怎样才能准确地使用变量作为Range()值?很抱歉提出了这么多愚蠢的问题。我会和UsedRange一起去。ws.UsedRange.Select()工作得很好。非常感谢。谢谢,奥拉夫。我有last=excel.Range(“A1:A1”).End(XlDirectionDown);但是我需要选择从顶部到最后一个单元格的所有单元格。如何使用变量作为Range()的值?
last = excel.Range("A1:A1").End(XlDirectionDown)