Pywin32 работает непосредственно со столбцами и строками, как это было бы сделано в VBA

#python #excel #win32com

#python #excel #win32com

Вопрос:

Я начинаю переносить часть своего кода VBA в Python, потому что это дает мне больше ресурсов. Однако у меня возникают проблемы с аналогичной работой.

Я хотел очистить некоторые столбцы, однако я не могу работать напрямую со столбцами атрибутов рабочего листа. И я должен выполнять такие обходные действия (полный код):

 import win32com.client as win32

xl = win32.gencache.EnsureDispatch('Excel.Application')
xl.Visible = True

wb = xl.Workbooks.Open(r'Test.xlsx')
sh = wb.ActiveSheet

xl.ScreenUpdating = True
last_col = sh.UsedRange.Columns.Count
last_row = sh.UsedRange.Rows.Count
my_range = sh.Range(sh.Cells(1, 1), sh.Cells(last_row, 4))
my_range.Select()
xl.Selection.ClearContents()
 

Итак, то, что я хотел бы сделать, похоже на VBA:

 Columns("A:D").Clear
 

Есть ли какой-либо способ работать со строками и столбцами с помощью Python, а не только с диапазонами?

Ответ №1:

Просто запустите: sh.Columns("A:D").Clear . Следует отметить, что вы не переводите код VBA на Python. Оба языка делают то же самое, создавая COM-интерфейс для библиотеки объектов Excel. Поскольку приложения Office поставляются с VBA, часто считается, что VBA — это язык для этих программ, и язык изначально встроен, но на самом деле VBA является компонентом. В разделе Инструменты / Ссылки в IDE вы увидите, что VBA является первым отмеченным элементом.

Итак, с помощью компонентной объектной модели Windows (COM) любой язык общего назначения, включая Python, PHP, R, Java, C # и т.д., может подключаться к библиотеке объектов Excel и выполнять вызовы объектов и методов рабочей книги. Вам просто нужно придерживаться синтаксиса языков. В качестве примера:

Python (модуль win32com)

 sh.Columns("A:D").Clear()
 

PHP (COM-класс)

 sh->Columns("A:D")->Clear()
 

R (модуль RDCOMClient)

 sh$Columns("A:D")$Clear()
 

Кроме того, рассмотрите возможность запуска вашего кода в try...except...finally блоках, чтобы перехватывать исключения и правильно неинициализировать COM-объекты, независимо от того, выдает ли ваш код ошибки или нет. В противном случае Excel.exe процесс продолжит выполняться в фоновом режиме.

 import win32com.client as win32

try:
    xl = win32.gencache.EnsureDispatch('Excel.Application')
    xl.Visible = True

    wb = xl.Workbooks.Open(r'C:PathToTest.xlsx')
    sh = wb.ActiveSheet

    xl.ScreenUpdating = True
    sh.Columns("A:D").Clear()

except Exception as e:
    print(e)

finally:
    sh = None
    wb = None
    xl = None
 

Комментарии:

1. Спасибо, это помогло. Я собираюсь принять во внимание ваш совет по блокировке try … за исключением.