E. Epstein Ответов: 2

Как скопировать содержимое документа word?


Я хочу написать программу, которая копирует текст из документа Word и вставляет его в другой. Я пытаюсь сделать это с помощью python-docx библиотека. Я смог сделать это с помощью следующего кода, но он не копирует жирный, курсивный, подчеркнутый ни цветные части как они есть и только их текст:
from docx import Document


input = Document('SomeDoc.docx')

paragraphs = []
for para in input.paragraphs:
    p = para.text
    paragraphs.append(p)

output = Document()
for item in paragraphs:
    output.add_paragraph(item)
output.save('OutputDoc.docx')


Что я уже пробовал:

Я пробовал копировать paragraph объект непосредственно в выходной документ, но он тоже не работает:
from docx import Document


input = Document('SomeDoc.docx')
output = Document()

for para in input.paragraphs:
    output.add_paragraph(para)
output.save('OutputDoc.docx')

2 Ответов

Рейтинг:
16

E. Epstein

Для того чтобы скопировать текст с его стилями, вам нужно будет написать свою собственную функцию, так как ее нет python-docx функция, которая делает такую вещь. Это функция, которую я написал:

def get_para_data(output_doc_name, paragraph):
    """
    Write the run to the new file and then set its font, bold, alignment, color etc. data.
    """

    output_para = output_doc_name.add_paragraph()
    for run in paragraph.runs:
        output_run = output_para.add_run(run.text)
        # Run's bold data
        output_run.bold = run.bold
        # Run's italic data
        output_run.italic = run.italic
        # Run's underline data
        output_run.underline = run.underline
        # Run's color data
        output_run.font.color.rgb = run.font.color.rgb
        # Run's font data
        output_run.style.name = run.style.name
    # Paragraph's alignment data
    output_para.paragraph_format.alignment = paragraph.paragraph_format.alignment


Как Работает Эта Функция
1. Добавляет новый paragraph объект к файлу.
2. Добавляет новый run к этому абзацу.
3. проверяет, соответствует ли каждый из стилей жирный, курсивный и подчеркивать является True, False, None. Если это True, этот run будет в таком стиле, если это так. False, это будет не в том стиле, и если это так, то ... None, он будет унаследован стилем по умолчанию абзаца, в котором он находится. Затем он применяет стили к run.
3. проверяет, какого цвета обкатка формат RGB и применяет найденный цвет к run.
4. проверяет, какой шрифт используется в прогоне, и применяет найденный шрифт к run.
5. проверяет, каково выравнивание прогона, и применяет найденную настройку выравнивания к run.


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

# Imports

input_doc = Document('InputDoc.docx')
output_doc = Document()

# Call the function
get_para_data(output_doc, input_doc.paragraphs[3])

# Save the new file
output_doc.save('OutputDoc.docx')

Если вы хотите скопировать весь документ я предлагаю вам сделать это:

for para in input_doc.paragraphs:
    get_para_data(output_doc, para)

output_doc.save('OutputDoc.docx')


Рейтинг:
0

Richard MacCutchan

Вам нужно получить информацию о стиле из абзаца, см. Текстовые объекты — документация python-docx 0.8.6[^].


E. Epstein

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