Задать вопрос
@d3d_ins
Junior разработчик телеграмм ботов и не только

Не открывается книжка excel на python windows, как исправить?

Разрабатываю бота, который должен отсылать в ответ пользователю скриншот определенной области из excel файла. Сейчас проблема в том, что он не может открыть книжку. Стек: Python, win32com, PIL, gc.
Код:
import win32com.client as win32
import os
import time
from PIL import ImageGrab
import gc


def screenshot_excel_range(output_file, sheet_name, range_address=None):
    file_path = output_file.replace(".png", ".xlsx")

    print(f"Открываю файл: {file_path}")
    abs_path = os.path.abspath(file_path)
    print(f"Абсолютный путь: {abs_path}")

    if not os.path.exists(file_path):
        print(f"ОШИБКА: Файл не существует: {file_path}")
        return

    try:
        excel = win32.Dispatch('Excel.Application')
        excel.Visible = True 
        excel.DisplayAlerts = False

        print("Excel запущен, пытаюсь открыть книгу...")

        try:
            workbooks = excel.Workbooks
            workbook = workbooks.Open(r"{}".format(abs_path), ReadOnly=1)

            print("Книга успешно открыта")

            try:
                sheet = workbook.Worksheets(sheet_name)
                print(f"Лист '{sheet_name}' найден")

                if range_address is None:
                    print("Используем видимую область")
                    excel.ActiveWindow.View = 1 
                    sheet.Activate()
                    visible_range = excel.ActiveWindow.VisibleRange
                    rng = visible_range
                else:
                    print(f"Используем указанный диапазон: {range_address}")
                    rng = sheet.Range(range_address)

                print("Копирую изображение в буфер обмена...")
                rng.CopyPicture(Appearance=1, Format=2)  
                time.sleep(2.0) 

                print("Получаю изображение из буфера обмена...")
                img = ImageGrab.grabclipboard()
                if img:
                    print(f"Сохраняю изображение в {output_file}")
                    img.save(output_file)
                    print(f"Изображение успешно сохранено в {output_file}")
                else:
                    print("Не удалось получить изображение из буфера обмена.")
            except Exception as e:
                print(f"Ошибка при работе с листом: {e}")
            finally:
                print("Закрываю книгу...")
                workbook.Close(SaveChanges=False)
                print("Книга закрыта")
        except Exception as e:
            print(f"Ошибка при открытии книги: {e}")
        finally:
            print("Закрываю Excel...")
            excel.Quit()
            print("Excel закрыт")
    except Exception as e:
        print(f"Общая ошибка: {e}")
    finally:
        print("Очистка COM-объектов...")
        gc.collect()
        print("Готово")

Логи:
Открываю файл: C:\Users\Administrator\Desktop\Bot_Count_Roof_Cost\таблица_998992278_a951318df67b429faec3bf26486b9416.xlsx
Абсолютный путь: C:\Users\Administrator\Desktop\Bot_Count_Roof_Cost\таблица_998992278_a951318df67b429faec3bf26486b9416.xlsx
Excel запущен, пытаюсь открыть книгу...
Ошибка при открытии книги: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Open method of Workbooks class failed', 'xlmain11.chm', 0, -2146827284), None)
Закрываю Excel...
Excel закрыт
Очистка COM-объектов...
Готово


Может кто-то с таким сталкивался? Как исправить? Функционал отправки именно скриншота обязателен.
  • Вопрос задан
  • 67 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121
Начни с документации
Удаляйте ваши принты и делайте нормальное логгирование через logging. В частности нужен logging.exception, чтобы нормально понимать где вообще происходит ошибка. С учетом тройной вложенности except Exception сейчас код хуже, чем он был бы вообще без обработки ошибок.

Предположу по принтам, что ошибка в строке
workbook = workbooks.Open(r"{}".format(abs_path), ReadOnly=1)
и далее может быть 2 класса ошибок: ошибки, которые можно обработать и нельзя. Чтобы понять какая это ошибка, нужно видеть полный traceback, но с учетом какой-то черной виндовой магии для работы с экселем, возможно его вообще не получить.
К первому типу ошибок может отнестись то, что возможно Open принимает иные аргументы или ждет другой разделитель пути.
Ко второму какие-то внешние ошибки, например если эксель не может открыть 2 экземпляра, нет прав на чтение файла или какая-то иная херня на стороне винды/экселя. Текст ошибки очень абстрактный, я уверен ошибка именно подобного рода.

Ну и задумайтесь о том, чтобы придумать менее проклятое и более масштабируемое решение. Не знаю как выглядит вызывающий код и надеюсь вы не используете эксель как базу данных, но генерировать реальный xlsx файл с копией диапазона было бы значительно безопаснее, быстрее и проще.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы