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