1

我认为我在这里做的事情根本上是错误的。我想在不使用循环的情况下获取给定单元格范围内的值(使用循环获取/设置大量数据的值似乎非常慢,所以我想我会尝试一次获取大块数据)。

作为一个小例子,假设我有一个 Excel 电子表格,其中包含单元格 A1、A3 和 A5 中的值。我想将这些值拉到一个列表中。但不幸的是,当我执行下面的代码时,我只得到了 A1 的值。不是其他任何人。

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

wb = excel.Workbooks.Add()
ws = wb.Worksheets("Sheet1")

val = wb.ActiveSheet.Range('A1,A3,A5').Value
print val

如果我要说,想要一个连续的值列表,下面的行可以做到这一点:

val = wb.ActiveSheet.Range('A1:A5').Value

它给了我一个清单。但由于我想要的值可能不是连续的,所以这种方法行不通。这些值将始终来自同一列(在此示例中为“A”),但不一定是连续的行。

希望这是有道理的。如果不是,我可以澄清一下。感谢您的任何帮助!:)

4

1 回答 1

0

我不确定它是否应该工作......

在 VBA 中,如果您尝试类似

values = wkstest.Range("A3,A5,A7").Value

我仍然只返回 A3 的值。

虽然

values = wkstest.Range("A3,A5,A7").Select

是否选择 3 个单元格。

我认为这是 Excel COM 接口而不是语言的限制。

不可能提取一个连续的范围,然后从列表中提取你想要的 python 位吗?这仍然是一次读取每个单元格的巨大速度提升,即使我正在阅读“太多”并在之后对变量进行更多操作。

我假设在您的完整 python 代码中,您正在组合值以创建文本字符串“A1,A3,A5”,而不是对其进行硬编码。如果您有一个行号列表,例如 rows=[1,3,5] 那么您可以执行以下操作:

rows=[1,3,5]
val = wb.ActiveSheet.Range('A1:A5').Value 
vals = {} #create a dictionary
for i in xrange(0,len(rows)):
    vals[rows[i]]=val[rows[i]-1] 
于 2013-08-28T09:19:48.957 回答