2013-08-28 4 views
1

Я думаю, что я делаю что-то принципиально неправильное здесь. Я хочу захватить значения в заданном диапазоне ячеек без использования цикла (значения получения/настройки для больших объемов данных кажутся очень медленными с использованием циклов, поэтому я решил, что попытаюсь захватить большие блоки данных за раз).PyWin32 Интеграция Excel - получение значений несмежных ячеек

В качестве небольшого примера предположим, что у меня есть электронная таблица 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

Я не уверен, если он должен работать ...

В VBA, если вы пытаетесь что-то вроде

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

Я до сих пор получить только значение A3 возвращается.

Хотя

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

ли выбрать 3 клетки.

Я думаю, что это ограничение в интерфейсе COM Excel, а не на языке.

Не удалось бы извлечь смежный диапазон, а затем извлечь из списка нужные биты в списке 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] 
Смежные вопросы