Программная обработка Word документов с помощью Python
Введение
Python предоставляет несколько способов взаимодействия с документами Microsoft Word. Наиболее популярным и удобным решением является библиотека python-docx. Она позволяет создавать новые файлы, редактировать существующие, управлять стилями, таблицами, изображениями и многим другим. В данной статье рассматриваются основные приёмы работы с этой библиотекой, а также альтернативные подходы.
Как выполнить установку python-docx?
Установка библиотеки выполняется через менеджер пакетов pip.
pip install python-docxPython 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]) в цикле.