我认为我在这里做了一些根本错误的事情。我想在不使用循环的情况下获取给定单元格区域中的值(使用循环获取/设置大量数据的值似乎非常慢,所以我想我一次尝试抓取大块数据)。
作为一个小例子,假设我有一个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”),但不一定是连续的行。
希望这是有道理的。如果没有,我可以澄清一下。谢谢你的帮助! :)
答案 0 :(得分: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]