#python #xlwings
#python #xlwings
Вопрос:
Я ищу способ найти первый пустой столбец и строку. В рамках моего варианта использования я пытаюсь выяснить H3
(чтобы добавить текущую дату), а затем H4
и H5
(чтобы добавить мои ежедневные показатели) [скриншот прилагается]. Я пробовал ниже с xlwings.
import xlwings as xw
from xlwings import Range, constants
wb = xw.Book(r"path to xlsx")
sht1 = wb.sheets['Sheet1']
sht1.range('G3').value = current_date
sht1.range('G4').value = 5678
sht1.range('G5').value = 1234
wb.save(r"path to xlsx")
Проблема в том, что я жестко запрограммировал ссылки на столбцы и строки в скрипте. Я хочу H3
, H4
и H5
динамически узнавать через xlwings и обновлять метрики программно. Может кто-нибудь помочь мне в этом?
Ответ №1:
Вы можете сделать это, найдя последний столбец используемых данных. Вот два варианта получения этих данных:
- Использование
SpecialCells(11)
, которое представляет собой функцию VBA, доступ к которой осуществляется через.api
, информацию об этом можно найти здесь . - Использование
.end("right")
, эквивалентctrl right
в Excel.
Вариант 1 будет хорошо работать, если в электронной таблице нет других данных, поэтому последняя ячейка на листе будет правильным столбцом. Это удобно и не требует знания начальной ячейки (в данном случае B3).
Вариант 2 предпочтительнее для электронных таблиц, где на листе могут быть другие данные, поэтому последняя ячейка не обязательно будет находиться в последнем столбце ваших желаемых данных. Однако этот параметр не требует пропущенных столбцов, поскольку перемещение последней крайней правой ячейки в группе ячеек, следовательно, не будет строго последним столбцом данных.
Альтернативой может быть импорт всех данных в Python как a pd.DataFrame
, затем добавление дополнительного столбца и возврат. Если вам нужно добавить много столбцов данных, это, вероятно, будет более эффективным (особенно, если у вас уже есть DataFrame данных, которые вы вставляете в Excel).
Это last_col
целое число, так как им легче всего манипулировать (например, увеличивать на 1). Поэтому диапазон также был изменен, чтобы использовать это, вместо использования стиля A1 (например range("A1")
) используется кортеж формата (row_num, col_num)
(например range((row_num, col_num))
).
import xlwings as xw
import datetime as dt
current_date = dt.date.today().strftime("%d-%b-%y")
wb = xw.Book(r"path to xlsx")
sht1 = wb.sheets['Sheet1']
# options 1: last column in the sheet through SpecialCells
last_col = sht1.range("A1").api.SpecialCells(11).Column
# option 2: starting at cell B3, the first in the date headers, move to the right (like ctrl right in Excel)
last_col = sht1.range("B3").end("right").column
# paste new values
sht1.range((3, last_col 1)).value = current_date
sht1.range((4, last_col 1)).value = 5678
sht1.range((5, last_col 1)).value = 1234
wb.save(r"path to xlsx")