Как я могу использовать стили из существующего файла docx в своем новом документе?

У меня есть красивый файл .docx, созданный товарищем по команде, и я хотел бы использовать стили в нем по умолчанию для новых документов, которые я создаю программно с помощью Python-docx.

Я могу загрузить существующий файл docx, но неясно, как использовать стили из документа в моих вновь созданных документах.

Нужно ли мне выполнять следующий псевдокод для каждого стиля, который я использую из существующего файла?

# Read in our template file to enable style reuse
template = Document("MyTemplate.docx")

# Create our new, empty document
doc = Document()
set_style(doc.styles['Heading 1'] = template.styles['Heading 1']
set_style(doc.styles['Title'] = template.styles['Title']
# etc
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Копирование стилей не поддерживается напрямую в python.docx. Но, конечно, можно скопировать XML стиля из одного документа в XML стилей другого документа. Это будет выглядеть так:

from docx import Document
from copy import copy

def copy_style(source_document: Document, target_document: Document, style_name: str):
    source_style_names = [style.name for style in source_document.styles]
    target_style_names = [style.name for style in target_document.styles]
    if style_name in source_style_names:
        source_style = source_document.styles[style_name]
        if style_name in target_style_names:
            target_document.styles[style_name].delete()
        target_document.styles.element.append(copy(source_style.element))

template = Document('MyTemplate.docx')

document = Document()

style_name = 'Heading 1'
copy_style(template, document, style_name)
style_name = 'Title'
copy_style(template, document, style_name)
    
document.add_paragraph('Title Text', style='Title')
document.add_paragraph('Heading 1', style='Heading 1')

document.save('output.docx')

Но это не совсем надежно, поскольку стили в исходном документе могут ссылаться на другие стили в исходном документе, имеющие имена, которые затем не определены в целевом документе.

Таким образом, лучший подход — оставить MyTemplate.docx пустым и предоставить только стили. Затем можно поместить содержимое в документ, созданный из MyTemplate.docx, просто используя стили. Затем сохраните результат, используя другое имя, чтобы MyTemplate.docx в качестве шаблона оставалось пустым.

Это отличное предложение @axel-richter. Спасибо. Я предполагаю, что XML встроен в файл .docx и его нелегко прочитать.

Not a machine 14.07.2024 23:25

@Не машина: любой файл Office Open XML, например *.docx, представляет собой просто ZIP-архив. Вы можете открыть его с помощью приложения ZIP (7-Zip может сделать это напрямую через 7-Zip — Открыть). Тогда вы найдете /word/document.xm и word/styles.xml в этом ZIP-архиве.

Axel Richter 15.07.2024 05:34

Удивительный! Я не знал этого. Большое спасибо! @axel-richter.

Not a machine 15.07.2024 22:57

Другие вопросы по теме