Замена стиля таблицы в python docx на пользовательский

В ворде создал новый пользовательский стиль таблицы. название стиля таблицы

Однако, этот пользовательский шаблон не вижу при создании нового документа в ворде.

Часть кода:

a = docx.Document()
ab_3 = a.add_paragraph()
#ab_3.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER - выравнивание абзаца 3 по центру. Однако, на параметры таблицы не влияет, т.е. значения в ячейках не выравниваются по центру в соответствии с форматированием абзаца
ab_3.add_run('Таблица 1 - Район работ').bold = True
t_1 = a.add_table(rows=1, cols=3)
count_t_1 = 1
def change_table_style(a,style_name):
# custom_style=a.styles.add_style('NEW_STYLE',WD_STYLE_TYPE.TABLE)
    style1=a.styles[style_name]
    t_1.style = style1
#ниже применяю стиль для таблицы1
# t_1.style = style1 #добавляет лини в таблицу. Бывает ещё 'Colorful List'
change_table_style(a,  'My Table Cell Style (Centered)')

При попытке применить новый пользовательский стиль в коде - выдает ошибку:

Traceback (most recent call last):
  File "D:\PythonProjects\Попытка создать таблицу от 08.12..py", line 20, in <module>
    change_table_style(a,  'My Table Cell Style (Centered)')
  File "D:\PythonProjects\Попытка создать таблицу от 08.12..py", line 16, in change_table_style
    style1=a.styles[style_name]
  File "C:\Users\isobin\AppData\Roaming\Python\Python310\site-packages\docx\styles\styles.py", line 53, in __getitem__
    raise KeyError("no style with name '%s'" % key)
KeyError: "no style with name 'My Table Cell Style (Centered)'"

Process finished with exit code 1

Вопрос: не могли бы вы подсказать ,как заменить стиль таблицы на созданный мною ранее?


Ответы (3 шт):

Автор решения: Alexander C

Вижу, что вы создаёте новый документ. Так вот он никак не зависит от Word и не знает, что вы где-то там создали новый стиль. Поэтому у вас есть два варианта либо:

  • Либо создать добавлять новый стиль в через Python после созданиа докмента.
  • Либо открыть документ, где это стиль уже есть, и после внесения изменений сохранить его под новым именем. То есть использовать какой-то документ в качестве шаблона.
→ Ссылка
Автор решения: Armen Legran

Ошибка, которую вы видите, говорит о том, что стиль 'My Table Cell Style (Centered)' не найден в документе. Вероятно, вы создали этот стиль в Word, но он не доступен в документе, который вы создаете с помощью библиотеки python-docx.

Библиотека python-docx не имеет доступа к стилям, определенным в Word. Она имеет свой собственный набор стилей, которые можно использовать при создании документа. Если вы хотите использовать пользовательский стиль, который вы создали в Word, вам нужно добавить этот стиль в документ python-docx.

Однако, python-docx не поддерживает создание пользовательских стилей таблиц. Вы можете изменить стиль каждой ячейки в таблице, но не можете создать новый стиль таблицы.

Вместо этого, вы можете создать функцию, которая будет применять желаемые параметры форматирования к каждой ячейке в таблице. Например:

def format_table(table):
    for row in table.rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER


Эта функция будет выравнивать текст по центру в каждой ячейке таблицы.

→ Ссылка
Автор решения: Алексей Р

Из python-docx 1.1.0 documentation в гугл-переводе:

from docx import Document

document = Document()
document.save('test.docx')

Это создаст новый документ из встроенного шаблона по умолчанию и сохранит его без изменений в файле с именем «test.docx». Так называемый «шаблон по умолчанию» на самом деле представляет собой просто файл Word без содержимого, хранящийся вместе с установленным пакетом python-docx. Это примерно то же самое, что вы получаете, выбирая шаблон документа Word после выбора пункта меню Word «Файл» > «Новый из шаблона…».

Этот шаблон лежит в ..\Lib\site-packages\docx\templates\default.docx.

Один из небесспорных, конечно, вариантов - модифицировать этот шаблон, например, так: введите сюда описание изображения

После чего создаваемые книги будут иметь внутри заданный пользовательский стиль таблицы:

import docx

a = docx.Document()
for style in a.styles:
    nm = style.name
    if '#' in nm:
        print(nm)
#MyTable

При этом, конечно, нужно:

  • сделать резервную копию оригинального default.docx;
  • учесть, что при обновлении python-docx потребуется снова заменить оригинальный шаблон на модифицированный.
→ Ссылка