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

时间:2014-02-25 16:45:05

标签: python win32com

我已经问了根问题,但我想我可能会看到我是否可以获得更多帮助。我正在尝试使用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中的光标保留在第一个单元格上。 其次,我得到了此代码中最后一行的异常(与Range有关)。有人知道这段代码发生了什么吗?另外,有没有关于win32com或Pywin32的文档?我找不到任何方法!谢谢大家。

2 个答案:

答案 0 :(得分:2)

我使用了特定的细胞而不是细胞范围作为起点。替换

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

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

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

关于最后一行代码的异常,这是因为End返回一个Range对象,你不能将一个范围转换为一个字符串,或者你可以str(last)是一个范围所以{{ 1}}将是无效范围。

关于过滤空白单元格,我不确定这意味着什么:当您将数据复制到文本文件时,您会为空白单元格添加什么?如果你有“空白C”你会放“A C”吗? C将最终出现在数据库的错误列中。无论如何只是引起我注意的东西。

win32com的文档没有单一的地方,虽然Windows上的Python书有很多信息,谷歌让你的结果非常有用,包括SO点击。每当我使用Excel COM(这不是特定于python的win32com)时,一直让我绊倒的是,工作簿中的所有内容都是一个Range,你不能拥有单独的单元格,即使某些方法或属性可能会引导你我认为你正在获得一个实际获得范围的细胞,它通常需要一些额外的思考如何去达到所需的细胞。

答案 1 :(得分:0)

我开始使用win32com和Excel here

在您的代码中,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中,您应该写Offset(1,0)以向下排一行。但是在Python中,您必须在行和列中添加一个。也许是因为索引?