Извлечение первого пустого столбца и строки с помощью xlwings

#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:

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

  1. Использование SpecialCells(11) , которое представляет собой функцию VBA, доступ к которой осуществляется через .api , информацию об этом можно найти здесь .
  2. Использование .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")