Задать вопрос
Alex_Geer
@Alex_Geer
System Engineer

Почему не открывается файл docx?

Приветствую товарищи подскажите есть вот такой вот код на python который должен открывать файл, находить в нем слово PASTESCHEME и вставлять вместо него схемку Visio. В общем у меня возникает проблема, ошибка при открытии фалйа docx.

Файл доступен, права на него для всех пользователей полные.

Ошибка

Произошла ошибка: Не удалось открыть документ Word. или если закомментировать raise, то
Произошла ошибка: 'NoneType' object has no attribute 'Content'


Код
import os
import win32com.client as win32

def replace_placeholder_with_visio(docx_file, visio_file, output_file):
    word_app = None
    visio_app = None
    word_doc = None
    visio_doc = None

    try:
        # Проверка существования файлов
        if not os.path.exists(docx_file):
            raise FileNotFoundError(f"Файл Word не найден: {docx_file}")
        if not os.path.exists(visio_file):
            raise FileNotFoundError(f"Файл Visio не найден: {visio_file}")

        # Инициализация COM-объектов для работы с Word и Visio
        word_app = win32.Dispatch("Word.Application")
        visio_app = win32.Dispatch("Visio.Application")

        # Открываем документ Word
        word_doc = word_app.Documents.Open(docx_file)
        word_app.Visible = False  # Скрываем Word при работе

        # Проверяем, что документ успешно открыт
        if word_doc is None:
            raise RuntimeError("Не удалось открыть документ Word.")

        # Поиск слова "PASTESCHEME" в документе
        word_range = word_doc.Content  # Получаем весь контент документа
        find = word_range.Find
        find.Text = "PASTESCHEME"
        found = find.Execute()

        if found:
            print("Слово 'PASTESCHEME' найдено. Вставка схемы Visio...")

            # Открываем файл Visio
            visio_doc = visio_app.Documents.Open(visio_file)

            # Копируем первую страницу Visio в буфер обмена
            visio_page = visio_doc.Pages.Item(1)
            temp_image_path = r"C:\temp\visio_image.emf"
            visio_page.Export(temp_image_path)  # Экспорт в EMF для вставки как объект
            visio_doc.Close(SaveChanges=0)  # Закрываем документ Visio без сохранения изменений

            # Вставка объекта Visio вместо найденного слова
            word_range.PasteSpecial(Link=False, DataType=15)  # 15 - тип данных для OLE-объекта

            # Удаляем текст "PASTESCHEME", если он остался
            word_range.Text = ""  # Очищаем найденный текст
        else:
            print("Слово 'PASTESCHEME' не найдено в документе.")

        # Сохраняем измененный документ
        word_doc.SaveAs(output_file)
        print(f"Документ успешно сохранен: {output_file}")

    except Exception as e:
        print(f"Произошла ошибка: {e}")
    finally:
        # Освобождаем ресурсы
        if word_doc:
            word_doc.Close(SaveChanges=0)
        if word_app:
            word_app.Quit()
        if visio_doc:
            visio_doc.Close(SaveChanges=0)
        if visio_app:
            visio_app.Quit()


# Пути к файлам
docx_file = r"C:\Users\Администратор\Documents\RecomendBaseTpl.docx"
visio_file = r"C:\Users\Администратор\Documents\standalone.vsdx"
output_file = r"C:\Users\Администратор\Documents\output.docx"

# Вызов функции
replace_placeholder_with_visio(docx_file, visio_file, output_file)
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
@elderl
Не скрывать Word и смотреть его ошибку.
Ответ написан
Ваш ответ на вопрос

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

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