xlwings выводит в итеративный диапазон ячеек

У меня есть большой набор данных, к которому у меня нет прямого доступа, и я пытаюсь преобразовать заголовки данных в заголовки столбцов с помощью Python, а затем вернуть его обратно в Excel.

Я создал функцию для этого, и она работает, но я наткнулся на загвоздку. Я хочу, чтобы Excel VBA выполнял цикл вниз по диапазону, и если значение ячейки соответствует критериям, вызовите функцию Python и верните результирующие элементы списка в столбцах, перемещающихся от исходной ячейки. Например:

A1 содержит строку для форматирования, функции возвращают B1, C1, D1 и так далее. Я могу заставить это работать, только если я жестко запрограммирую B1, C1, D1 и т. Д.

Есть ли способ сделать это с помощью метода get_address() range? Думаю, тогда я смогу использовать метод offset(), но не уверен.


person nathanjw    schedule 22.02.2015    source источник
comment
Если я вас правильно понял, вы сможете прокручивать свой диапазон, используя индексную нотацию: Range((i,j)). Обратите внимание, что будет более эффективно читать весь диапазон в Python сразу, а затем выполнять всю логику и сразу записывать массив результатов, а не выполнять цикл по каждой ячейке.   -  person Felix Zumstein    schedule 23.02.2015
comment
@FelixZumstein привет, Феликс. Вы, наверное, правы, за исключением того, что я не умею читать весь диапазон, обрабатывать его на Python и возвращать обратно в Excel. Я думал об этом сначала, но отправил его в файл CSV, но тоже не знал, как это сделать :)   -  person nathanjw    schedule 23.02.2015


Ответы (2)


Да, вы можете использовать метод смещения и сделать что-то вроде следующего:

for x in range(1, 11): #loop through a range
if Range('A' + str(x)).value == 5: #to match your own criterion
    Range('A' + str(x)).offset(0, 1).value = ['apple', 'banana', 'pear'] #the returns of your own function
person DanEng    schedule 23.02.2015
comment
Спасибо @DanEng, что помог мне сдвинуться с мертвой точки. Мой цикл теперь возвращает правильную информацию только для каждой строки, а не только для той, которая соответствует условию. Я попытался вставить код, но комментарий стал слишком большим. - person nathanjw; 23.02.2015

Спасибо за вашу помощь. Сейчас у меня это работает, и я очень взволнован будущими возможностями Python, xlwings и Excel.

Моя проблема была простой, когда я получил цикл по отсортированному диапазону (который, кстати, был легко импортирован как каждая строка для каждого элемента, а не каждая ячейка). Я объявил свой список вне функции, поэтому не сбрасывался каждый раз, когда выполнялось истинное условие. Было очень неприятно наблюдать, как мои ячейки раз за разом наполнялись одними и теми же значениями. Просто, если знаешь как :)

person nathanjw    schedule 23.02.2015