Мне нужно скопировать все содержимое шаблона в новый документ. Проблема в том, что таблицы просто не могут быть скопированы. В настоящее время мой код заботится о копировании стилей, как жирный и курсив.
def get_para_data(output_doc_name, paragraph):
output_para = output_doc_name.add_paragraph()
for run in paragraph.runs:
output_run = output_para.add_run(run.text)
# Run bold data
output_run.bold = run.bold
# Run italic data
output_run.italic = run.italic
# Run underline data
output_run.underline = run.underline
# Run color data
output_run.font.color.rgb = run.font.color.rgb
# Run font data
output_run.style.name = run.style.name
# Paragraph alignment data
output_para.paragraph_format.alignment =
paragraph.paragraph_format.alignment
input_doc=Document('templatemain.docx')
output_doc=Document()
for para in input_doc.paragraphs:
get_para_data(output_doc, para)
output_doc.save('OutputDoc.docx')
Большая часть помощи, которую я нашел для копирования таблиц, - это добавить их. Но я копирую шаблон в пустой документ, так что это мне совсем не помогает.
Вы выполняете только итерацию по .paragraphs
документа. Таблицы перечислены отдельно, через атрибут .tables
.
Вам нужно будет перебрать все дочерние элементы тела документа вместе, в порядке документа, иначе вы закончите со всеми параграфами и таблицами, сгруппированными вместе. Библиотека python-docx
не предлагает эту функцию напрямую, вам нужно будет создать свой собственный итератор.
Например, упрощенная версия:
from docx.oxml.text.paragraph import CT_P
from docx.oxml.table import CT_Tbl
from docx.table import Table
from docx.text.paragraph import Paragraph
# select only paragraphs or table nodes
for child in input_doc.element.body.xpath('w:p | w:tbl'):
if isinstance(child, CT_P):
paragraph = Paragraph(child, input_doc)
get_para_data(output_doc, paragraph)
elif isinstance(child, CT_Tbl):
table = Table(child, input_doc)
# do something with the table
Таблицы могут содержаться только в теле документа, в ячейках таблицы (так вложенных внутри других таблиц), в верхних и нижних колонтитулах, сносках и отслеживаемых изменениях, но не внутри абзацев.