Я пытаюсь понять, как передать несколько выбранных ячеек из Excel в Python через xlwings в macOS. Я нашел код, который передает обозначение ячеек, но не все значения.
Например: на моем листе я выбрал ячейки D8, D12, D18 и D21 со значениями ячейка1, ячейка2, ячейка3, ячейка4.
Код:
wb = xw.Book.caller()
dbg = wb.sheets['debug']
selected_range = wb.selection
Print results in my debug worksheet
dbg.range((1, 1)).value = selected_range.address
Вот что печатается: $D$8,$D$12,$D$18,$D$21.
Я ищу фактические значения ячеек.
Я попробовал другой пример:
cellRange = wb.app.selection
rowNum = cellRange.row
colNum = cellRange.column
dbg.range((2, 1)).value = len(cellRange), rowNum, colNum
Вот что напечатало $D$8,$D$12,$D$18,$D$21 1, 8, 4
1, 8, 4 соответствуют
cellRange = 1
rowNum = 8
colNum = 4
Здесь говорится, что $D$8,$D$12,$D$18,$D$21 — это один объект, а rowNum/colNum указывает на первую ячейку из четырех, которые я выбрал.
Что мне не хватает? Я хочу вернуть значения в свой код, чтобы действовать дальше.
Спасибо Дэн
Пройти через что? Все координаты ячеек возвращаются в виде одной строки, а не списка. Я, конечно, мог бы использовать координаты для создания кода для доступа к значениям, но я надеялся, что xlwings предоставит более простое решение.
Пролистайте cellRange.Areas
cellRange = wb.app.selection x=0 for item in cellRange.Area: dbg.range((x, 1)).value = item x+=1.
AttributeError: объект «Диапазон» не имеет атрибута «Области».
Не уверен о чем ты. Можете ли вы доказать пример кода? Спасибо
Виноват. Доступ к Areas
будет осуществляться через базовый pywin32
собственный объект. Если вы используете macOS, это будет собственный объект appscript
, с которым я не знаком.
ты пробовал .value
вместо .address
? selected_range.value
? См. документацию для Range.value
Как было предложено, вам понадобится зациклить адреса или что-то подобное.
Итак, вы выбираете ячейки D8, D12, D18, and D21
, затем код Python разделяет адрес диапазона и получает значение для каждой.
def main():
wb = xw.Book.caller()
dbg = wb.sheets['debug']
selected_range = wb.selection
# Values list
cell_values = [dbg[cell].value for cell in selected_range.address.split(',')]
# Print results in my debug worksheet
dbg.range((1, 1)).value = cell_values
Одна опечатка, но все сработало, как и ожидалось. Большое спасибо. Опечатка для моего варианта использования «dbg[cell].value» должна быть «ws[cell].value», но это работает!
Вам придется зацикливаться. В противном случае вы не сможете получить значения диапазона из нескольких областей.