Отменить событие закрытия Excel с помощью python и win32com

В настоящее время я пытаюсь отменить закрытие Excel, используя Python и win32com. Я уже справился с этой проблемой с IronPython месяц назад. Но для дальнейших целей моего отдела компаний это также должно быть в Python. Затем вы увидите два фрагмента. Первый будет содержать рабочий код IronPython

import clr clr.AddReference("Microsoft.Office.Interop.Excel") clr.AddReference("System.Windows.Forms") from Microsoft.Office.Interop import Excel from System.Windows.Forms import Form, Application, MessageBox, MessageBoxButtons, MessageBoxIcon, DialogResult class CloseEventTry(Form): def __init__(self): excel = Excel.ApplicationClass() excel.Visible = True excel.DisplayAlerts = False self.workbooks = excel.Workbooks.Add() self.Text = "Dummy GUI Window" #link "BeforeCloseEvent" to the "beforeClose" method self.workbooks.BeforeClose +=Excel.WorkbookEvents_BeforeCloseEventHandler(self.beforeClose) def beforeClose(self, cancel): print type(cancel) #Type: 'StrongBox[bool] choice = MessageBox.Show("Close Excel", "Close", MessageBoxButtons.YesNo, MessageBoxIcon.Information) if choice == DialogResult.Yes: cancel.Value = False #do't cancel the close action self.Close() elif choice == DialogResult.No: cancel.Value = True #prevent excel from closing Application.Run(CloseEventTry()) 

Второй вариант будет содержать версию с Python и win32com. Это основано на моем фрагменте IronPython и образце этой ссылки

Events in Microsoft Word and Excel

 import clr clr.AddReference("System.Windows.Forms") from System.Windows.Forms import Form, Application, MessageBox, MessageBoxButtons, MessageBoxIcon, DialogResult import win32com.client as win32 #workbook event handler class. Needed according to this example https://win32com.goermezer.de/microsoft/office/events-in-microsoft-word-and-excel.html class WorkBookEvents(object): def OnBeforeClose(self, cancel): print(type(cancel)) #Type: class 'bool' choice = MessageBox.Show("Close Excel", "Close", MessageBoxButtons.YesNo, MessageBoxIcon.Information) if choice == DialogResult.Yes: #do't cancel the close action => raises AttributeError: 'bool' object has no attribute 'Value' Exception cancel.Value = False self.Close() elif choice == DialogResult.No: #prevent excel from closing => raises AttributeError: 'bool' object has no attribute 'Value' Exception cancel.Value = True class CloseEventTry(Form): def __init__(self): excel = win32.DispatchEx('Excel.Application') excel.Visible = True # makes the Excel application visible to the user excel.DisplayAlerts = False self.Text = "Dummy GUI Window" self.workbooks = excel.Workbooks.Add() #define event handler according to this example https://win32com.goermezer.de/microsoft/office/events-in-microsoft-word-and-excel.html self.workbooks = win32.DispatchWithEvents(self.workbooks, WorkBookEvents) Application.Run(CloseEventTry()) 

Как вы увидите, я могу подключиться к событию «OnBeforeClose», но не могу отменить событие закрытия, как я сделал это с версией IronPython. Как упоминалось в последнем комментарии фрагмента кода, версия Python вызывает исключение AttributeError. Далее вы также увидите, что типы необходимой переменной «cancel» обработчиков событий имеют два разных типа. В версии IronPython это «StrongBox [bool]». С другой стороны, тип версии Python – это обычный тип класса «bool» (который объясняет исключение). То, как я пытался просто набрать

 cancel = True #prevent excel from closing 

Но, используя этот способ, Excel все равно закрывается. Я также сделал некоторые исследования, но не смог найти решение этой проблемы. Мое предположение заключается в том, что нужна какая-то оболочка?

Interesting Posts

xlrd Преобразование сценария Excel "# N / A" в 42

Строка Autoformat на основе значений в каждой ячейке с использованием Excel VBA?

Как установить текстовый формат в конкретный столбец в Excel с помощью элементов Aspose

Редактирование строки в пользовательской форме Excel VBA с использованием специальных символов

Spring, JXLS: Трансформатор XLS не загружен, хотя существует зависимость.

Простой запрос в наборе данных объемом 2,5 миллиона записей

Как сохранить звуковой сигнал Воспроизведение до закрытия Msgbox

Сравнение текста в Excel 2010

Целевое значение Excel в состоянии boolean

Excel sumproduct с условием

Как загрузить данные в excel от Angular 4

если заявление см. «Мужчины / Мужчины / Мужчины» или «Женщины / Женщины / Женщины», возвращающие «Муж или женщина»,

Поиск определенного числа внутри строки?

Microsoft Graph for Excel 'TableRowCollection: добавить "vs." Создать TableRow "

Динамически удалять пробелы из ряда клеток excel

Давайте будем гением компьютера.