Python: открыть книгу Excel с помощью Win32 COM Api
Я использую следующий код для открытия и отображения книги в Excel:
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open('my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
Когда файл 'my_sheet.xlsm' уже открыт, Excel спрашивает меня, хочу ли я открыть его снова без сохранения.
Как я могу заранее проверить, открыта ли рабочая тетрадь, и если это так, просто перенести ее на передний план?
РЕДАКТИРОВАТЬ: выяснил к настоящему времени:
if excel.Workbooks.Count > 0:
for i in range(1, excel.Workbooks.Count+1):
if excel.Workbooks.Item(i).Name is 'my_sheet.xlsm':
wb = excel.Workbooks.Item(i)
break
И еще один вопрос: моя рабочая таблица содержит несколько заголовков, где я включил некоторую фильтрацию. Поэтому, когда фильтры установлены, и когда я открываю книгу из Python, иногда мне нужно ввести уникальное имя для сохранения фильтра. Это почему? Это диалог:
РЕДАКТИРОВАТЬ Хорошо, здесь говорится (на немецком языке), что последняя проблема является известной ошибкой в файлах 2007 и 2010 годов: https://social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff-5c0d83166e73/excel-api-interne-namen и, кажется, существует, если вы открываете Excel-файлы программным способом. Не знаю, есть ли обходной путь.
1 ответ
Пока вы нашли решение, попробуйте использовать блок try/ исключением /finally. В настоящее время ваш код оставит процесс Excel.exe запущенным в фоновом режиме (проверьте диспетчер задач, если вы используете Windows), даже если вы закроете видимый лист. Кроме того, в Python или любом другом языке, таком как VBA, любой внешний API, такой как этот интерфейс COM, всегда должен быть аккуратно освобожден во время кода приложения.
Ниже решение использует определенную функцию, openWorkbook()
пройти два возможных маршрута: 1) сначала пытается перезапустить указанную рабочую книгу, предполагая, что она открыта, и 2) если она еще не открыта, запускает новый объект рабочей книги этого местоположения. Последний вложенный try/except
используется в случае, если Workbooks.Open()
сбой метода, например, неверное имя файла.
import win32com.client as win32
def openWorkbook(xlapp, xlfile):
try:
xlwb = xlapp.Workbooks(xlfile)
except Exception as e:
try:
xlwb = xlapp.Workbooks.Open(xlfile)
except Exception as e:
print(e)
xlwb = None
return(xlwb)
try:
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = openWorkbook(excel, 'my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
excel.Visible = True
except Exception as e:
print(e)
finally:
# RELEASES RESOURCES
ws = None
wb = None
excel = None