Python и Excel - проверьте, открыт ли файл - PullRequest
2 голосов
/ 12 мая 2010

Эй, ребята, мне нужна помощь, учитывая win32com в Python: У меня есть процедура, которая открывает рабочую книгу, создает лист и помещает в него некоторые данные. Если все работает нормально, книга работ сохраняется и закрывается. Если нет, сеанс python завершается, но книга работы остается открытой. Таким образом, ссылка потеряна. Теперь при перезапуске кода Excel выдает сообщение «рабочая книга еще открыта, хотите ли вы открыть заново?». Так что я хочу, чтобы подавить это сообщение. Я нашел решение, которое работает для меня, когда python завершает работу перед записью на лист:

        open_copys = self.xlApp.Workbooks.Count
        if  open_copys > 0:
            """ Check if any copy is the desired one"""
            for i in range(0, open_copys):
                if(self.xlApp.Workbooks[i].FullName == self.file_path):
                    self.xlBook = self.xlApp.Workbooks[i]
        else:
            self.xlBook = self.xlApp.Workbooks.Open(self.file_path)

Но если в лист EXCEL были внесены какие-либо изменения, этот метод является устаревшим. Кто-нибудь получил иды, как вернуть ссылку на открытый и измененный лист из нового сеанса Python? ТНХ

Ответы [ 3 ]

3 голосов
/ 12 мая 2010

Я не знаком с Python, но написал код COM для Excel / Word на других языках.
Может помочь свойство Application.DisplayAlerts в Excel. Установка этого параметра на False подавляет большинство сообщений, которые Excel обычно может отображать, и автоматически выбирает ответ по умолчанию, хотя я думаю, что есть некоторые исключения. Глядя на существующий код, я думаю, вы вставите эту строку до открытия книги:

  self.xlApp.DisplayAlerts = False
1 голос
/ 13 мая 2010

Вы идете об этом неправильно. Вы НЕ хотите, чтобы Python завершал свою работу, оставляя потерянные процессы Excel. Это особенно важно, если вы собираетесь установить и запустить этот код на других машинах. Вместо этого найдите свои ошибки и обработайте их - тогда у вас никогда не будет потерянных процессов для обработки.

Тем не менее, есть несколько вещей, которые вы можете рассмотреть. Вы можете выбрать либо создание нового процесса Excel каждый раз (Dispatch), либо работу с существующим (DispatchEx). Это позволяет вам делать такие вещи, как видеть, какие книги открыты и закрывать их, или гарантирует, что ваш процесс не будет мешать другим. Также, как сказал Скотт, приложение Excel имеет некоторые интересные свойства, такие как подавление ошибок при автоматическом запуске, которые стоит изучить.

1 голос
/ 12 мая 2010

Вы пытались удалить все ссылки на ваши COM-объекты перед завершением интерпретатора Python? Вы можете заставить их собирать мусор (используя gc.collect ()), чтобы быть уверенными, что они исчезли. Таким образом, рабочая книга не должна оставаться открытой в памяти, и у вас не будет сообщения об ошибке.

Попробуйте добавить метод "close ()" в ваш класс, например, следующим образом, и вызовите его до конца вашего скрипта.

import gc

...

def close(self):
    del self.xlApp
    if hasattr(self, 'xlBook'):
        del self.xlBook
    gc.collect()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...