Замена стиля таблицы в 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 шт):
Вижу, что вы создаёте новый документ. Так вот он никак не зависит от Word и не знает, что вы где-то там создали новый стиль. Поэтому у вас есть два варианта либо:
- Либо создать добавлять новый стиль в через Python после созданиа докмента.
- Либо открыть документ, где это стиль уже есть, и после внесения изменений сохранить его под новым именем. То есть использовать какой-то документ в качестве шаблона.
Ошибка, которую вы видите, говорит о том, что стиль '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потребуется снова заменить оригинальный шаблон на модифицированный.