Программная обработка Word документов с помощью Python

Раздел: Обработка данных -> Работа с документами

Введение

Python предоставляет несколько способов взаимодействия с документами Microsoft Word. Наиболее популярным и удобным решением является библиотека python-docx. Она позволяет создавать новые файлы, редактировать существующие, управлять стилями, таблицами, изображениями и многим другим. В данной статье рассматриваются основные приёмы работы с этой библиотекой, а также альтернативные подходы.

Как выполнить установку python-docx?

Установка библиотеки выполняется через менеджер пакетов pip.

pip install python-docx

Python docx библиотека (библиотека python-docx для работы с документами)

После успешной установки библиотека готова к использованию. При возникновении ошибок может потребоваться обновление pip или установка в виртуальное окружение.

Типичная проблема: ошибка импорта после установки

Иногда система сообщает, что модуль не найден. Причина часто кроется в том, что pip установил библиотеку для другой версии Python. Решение заключается в использовании команды python -m pip install python-docx.

Как создать новый документ и добавить в него текст?

from docx import Document
doc = Document()
doc.add_paragraph('Привет, мир!')
doc.save('example.docx')

Python документ word (работа с документами word в python (python-docx))

В результате будет создан файл example.docx с одним абзацем. Метод add_paragraph возвращает объект Paragraph, который можно далее настраивать.

Как применить форматирование к тексту (жирный, курсив, цвет)?

Форматирование осуществляется через объект Run:

doc = Document()
p = doc.add_paragraph()
run = p.add_run('Жирный текст')
run.bold = True
run = p.add_run(' обычный текст ')
run = p.add_run('Курсивный текст')
run.italic = True
doc.save('format.docx')

Атрибуты bold, italic, underline, font.color.rgb позволяют гибко управлять внешним видом.

Проблема: не применяется изменение цвета шрифта

Цвет шрифта задаётся через объект RGBColor. Необходимо импортировать from docx.shared import RGBColor. Пример: run.font.color.rgb = RGBColor(0xFF, 0x00, 0x00).

Как добавить таблицу в документ?

doc = Document()
table = doc.add_table(rows=3, cols=2)
table.style = 'Table Grid'
cell = table.cell(0, 0)
cell.text = 'Ячейка A1'
for row in table.rows:
    for cell in row.cells:
        cell.text = 'Текст'
doc.save('table.docx')

Таблицы можно создавать как с нуля, так и преобразовывать существующие. Доступ к ячейкам осуществляется по индексам строки и столбца.

Как изменить существующий документ, не перезаписывая его содержимое?

doc = Document('existing.docx')
for paragraph in doc.paragraphs:
    if 'старый текст' in paragraph.text:
        paragraph.clear()
        paragraph.add_run('новый текст')
doc.save('existing_modified.docx')

Библиотека читает документ в память, затем позволяет модифицировать любой элемент. Сохранение лучше выполнять под новым именем, чтобы не потерять исходный файл.

Ошибка: при открытии документа возникает исключение 'docx.opc.exceptions.PackageNotFoundError'

Это означает, что файл не является корректным документом Word (например, повреждён или имеет другой формат). Решение проверять расширение и целостность файла.

Какие альтернативы существуют для работы с Word?

Помимо python-docx, применяются и другие подходы. Ниже рассмотрены два варианта.

Вариант 1. Использование pywin32 (только Windows)

Библиотека pywin32 предоставляет доступ к COM-объектам Microsoft Office. Это позволяет управлять Word напрямую, но требует установленного Word на компьютере.

import win32com.client
word = win32com.client.Dispatch('Word.Application')
word.Visible = False
doc = word.Documents.Open('document.docx')
doc.Content.Text = 'Новый текст'
doc.Save()
word.Quit()

Преимущество: полный контроль над всеми функциями Word. Недостаток: привязанность к Windows и лицензии Office.

Проблема: ошибка 'The client is not authorized'

Иногда Word не разрешает программное управление из-за настроек безопасности. Нужно включить опцию 'Trust access to the VBA project object model' в настройках Word.

Вариант 2. Извлечение текста с помощью docx2txt

Для простого чтения текста из файлов Word (без форматирования) удобна библиотека docx2txt.

import docx2txt
text = docx2txt.process('document.docx')
print(text)

Она извлекает весь текст из документа, включая текст в таблицах. Не подходит для создания или редактирования файлов.

Расширенные примеры работы с python-docx

Пример 1. Создание документа с несколькими разделами и колонтитулами

Пример
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt, Inches
doc = Document()
# Добавляем раздел
section = doc.sections[0]
section.left_margin = Inches(1)
section.right_margin = Inches(1)
# Заголовок
header = section.header
header_para = header.paragraphs[0]
header_para.text = 'Заголовок колонтитула'
# Основной текст
for i in range(3):
    doc.add_paragraph(f'Абзац номер {i+1}', style='Normal')
doc.save('sections.docx')
Результат: файл sections.docx с одним разделом, отступами и колонтитулом.

Пример 2. Замена текста во всём документе с помощью регулярных выражений

Пример
import re
from docx import Document
def replace_text_in_doc(doc_path, old, new, output_path):
    doc = Document(doc_path)
    for para in doc.paragraphs:
        if old in para.text:
            inline = para.runs
            for run in inline:
                if old in run.text:
                    run.text = re.sub(old, new, run.text)
    doc.save(output_path)
# Использование
replace_text_in_doc('input.docx', 'старый', 'новый', 'output.docx')
Все вхождения 'старый' заменяются на 'новый'. Обратите внимание, что замена может не сработать, если текст разбит на несколько Run.

Проблема: текст частично в разных Run

Чтобы обойти это, можно полностью изменить текст параграфа, уничтожив исходные Run: para.clear(); para.add_run(new_text).

Пример 3. Вставка изображения с настройкой размера

Пример
from docx import Document
from docx.shared import Inches
doc = Document()
doc.add_picture('photo.jpg', width=Inches(3), height=Inches(2))
doc.save('with_image.docx')

Изображение вставляется в текущую позицию. Если нужно выравнивание, его можно задать через параграф после добавления.

Пример 4. Создание нумерованного списка

Пример
from docx import Document
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
# Создаём параграф с номером
para = doc.add_paragraph(style='List Number')
para.add_run(' Первый элемент')
para = doc.add_paragraph(style='List Number')
para.add_run(' Второй элемент')
doc.save('numbered_list.docx')

Стиль 'List Number' автоматически создаёт нумерацию.

Пример 5. Объединение двух документов Word

Пример
from docx import Document
doc1 = Document('doc1.docx')
doc2 = Document('doc2.docx')
for element in doc2.element.body:
    doc1.element.body.append(element)
doc1.save('merged.docx')

Этот метод копирует всё содержимое doc2 в конец doc1. Стили и изображения при таком подходе могут потеряться, если они не хранятся в общей части document.xml. Более надёжным является копирование через итерацию по параграфам и таблицам.

Пример
def merge_docs(doc_merge, doc_source):
    for para in doc_source.paragraphs:
        new_para = doc_merge.add_paragraph(para.text, style=para.style)
    doc_merge.save('merged_adv.docx')
merge_docs(doc1, doc2)

Этот способ сохраняет только основной текст и ссылки на стили, но не гарантирует перенос изображений.

Ошибка: при копировании element.body возникает 'ValueError: cannot insert'

Решение: убедиться, что не вставляется сам элемент документа. Лучше использовать doc_merge.element.body.append(doc_source.element.body[i]) в цикле.

Работа с документами Word в Python (python-docx) - comments

En
Python документ word (python)