Копировать весь текстовый документ, включая таблицы, в другой, используя Python

1

Мне нужно скопировать все содержимое шаблона в новый документ. Проблема в том, что таблицы просто не могут быть скопированы. В настоящее время мой код заботится о копировании стилей, как жирный и курсив.

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')

Большая часть помощи, которую я нашел для копирования таблиц, - это добавить их. Но я копирую шаблон в пустой документ, так что это мне совсем не помогает.

Теги:
python-3.x
ms-word
python-docx

1 ответ

4
Лучший ответ

Вы выполняете только итерацию по .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

Таблицы могут содержаться только в теле документа, в ячейках таблицы (так вложенных внутри других таблиц), в верхних и нижних колонтитулах, сносках и отслеживаемых изменениях, но не внутри абзацев.

  • 0
    Спасибо! Я попробую это.
  • 0
    Привет, извините за поздний ответ. Не могли бы вы объяснить, что такое ребенок и злоумышленники? Этот код на самом деле не работает для меня. Нет ошибок, но нет и изменений в выводе. Даже текст в параграфе не копируется сейчас.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню