Вернуть несколько выбранных ячеек из Excel в Python через xlwings

Я пытаюсь понять, как передать несколько выбранных ячеек из 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 указывает на первую ячейку из четырех, которые я выбрал.

Что мне не хватает? Я хочу вернуть значения в свой код, чтобы действовать дальше.

Спасибо Дэн

Вам придется зацикливаться. В противном случае вы не сможете получить значения диапазона из нескольких областей.

BigBen 08.07.2024 21:13

Пройти через что? Все координаты ячеек возвращаются в виде одной строки, а не списка. Я, конечно, мог бы использовать координаты для создания кода для доступа к значениям, но я надеялся, что xlwings предоставит более простое решение.

user26262113 08.07.2024 22:00

Пролистайте cellRange.Areas

BigBen 08.07.2024 22:02
cellRange = wb.app.selection x=0 for item in cellRange.Area: dbg.range((x, 1)).value = item x+=1. AttributeError: объект «Диапазон» не имеет атрибута «Области».
user26262113 08.07.2024 22:27

Не уверен о чем ты. Можете ли вы доказать пример кода? Спасибо

user26262113 08.07.2024 22:31

Виноват. Доступ к Areas будет осуществляться через базовый pywin32 собственный объект. Если вы используете macOS, это будет собственный объект appscript, с которым я не знаком.

BigBen 09.07.2024 00:10

ты пробовал .value вместо .address? selected_range.value? См. документацию для Range.value

furas 09.07.2024 02:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как было предложено, вам понадобится зациклить адреса или что-то подобное.

Итак, вы выбираете ячейки 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», но это работает!

user26262113 09.07.2024 17:21

Другие вопросы по теме