Статьи из блога
Чтение и создание docx-документов в Python
Python - мощный современный язык, с помощью которого можно упростить работу с docx и xlsx документами. Особенно если вам нужно читать или генерировать сразу много файлов.
Опустим момент с установкой Python и запуском вашей первой программы, об этом есть много статей и видео-роликов. Отталкиваться будем от того, что у вас есть минимальный опыт работы с питоном. Если же вы совсем новичок, то можете посмотреть бесплатные уроки с этого курса по Python или посмотреть курс на Stepik. Знаний в бесплатных уроках будет достаточно, чтобы попробовать примеры из этой статьи.
Что такое docx-файл
docx-файл – это сложный контейнер, который внутри себя содержит набор каталогов и файлов в разных форматах. Текстовые процессоры, вроде Word или LibreOffice, умеют работать с этим контейнером: правильно его читать и записывать новые данные.
Так выглядит типичный docx-файл внутри.
Если же мы попытаемся открыть docx-контейнер самостоятельно, то без специальной подготовки не сможем что-то в нём поменять. И даже если мы откроем его с помощью стандартных средств Python, то содержимое docx-файла окажется малопонятным.
И там, где не справляются стандартные средства, нужно использовать специализированные.
Установка библиотеки
Как я написал ранее – Python мощный язык и его сила в богатом выборе библиотек на все случаи жизни. Одна из таких библиотек - это python-docx, именно с помощью неё мы будем читать и создавать документы.Установить библиотеку довольно легко. Вам нужно открыть командную строку Windows или терминал MacOS или Linux (далее я буду использовать слово терминал). И внутри выполнить следующую команду:
# Для Windows py -m pip install python-docx # Для MacOS python3 -m pip install python-docx # Для Linux python -m pip install python-docxЕсли вы знаете, что такое виртуальные окружения, то можете устанавливать python-docx сразу в виртуальное окружение.
После можно приступать к написанию программы в любом удобном для вас редакторе. Только учтите, что нельзя писать python-программы в Ворде. Word предназначен для работы с docx-документами, а для Python используются IDE: PyCharm или VS Code.
Чтение docx-документа
Получить данные из водровского документа очень просто и ниже находится элементарный код на Python, который читает параграфы один за одним и выводит их:# Импортируем класс Document из библиотеки docx
from docx import Document
# Читаем файл cert.docx, который находится рядом с программой.
# Либо любой другой файл, главное поместите его в каталог с вашим скриптом.
document = Document("cert.docx")
# В цикле перебираем всем параграфы документа.
for p in document.paragraphs:
# Выводим текст параграфов.
print(p.text)
Это самый простой способ прочитать весь документ целиком и получить доступ к его текстовой части. Далее с помощью Python вы можете проанализировать этот текст или сохранить в другой файл или базу данных.
Чтение таблиц
Если в вашем документе есть таблицы, то прочитать их можно через свойство tables:# В цикле перебираем все таблицы документа. for table in document.tables: # Далее перебираем все строки таблицы. for row in table.rows: # И наконец перебираем все ячейки строки. for cell in row.cells: # Выводим текст ячейки. print(cell.text)Обратите внимание, что cell внутри содержит параграф и когда мы пишем cell.text, то получаем текст этого параграфа.
Формально таблицы – это еще более крупные контейнеры, которые внутри себя содержат другие элементы: параграфы, потоки, изображения.
Проблема изменения docx-документов
Чтение docx-документа в примере выше происходило по параграфам, но дело в том, что параграф – это всего лишь контейнер для текста. Сам текст находится чуть глубже в так называемых runs (потоках).Каждый параграф может содержать множество потоков и именно потоки отвечают за текст или часть текста.
Когда в слове или фразе мы выделяем жирным какую-то часть, например “Python курс“, то слово “Python” уходит в один поток, а пробел и “курс“ в другой.
Но даже если у нас слово записано в одном стиле, это не гарантирует, что всё оно будет в одном потоке. Так, если мы написали “программа“, а потом заменили окончание на “ы” - “программы“, то Word легко может разделить слово на несколько потоков: “программ” и “ы”.
Поэтому, когда мы читаем параграфы с помощью p.text, то получаем чистый текст параграфа из всех его потоков. Но если мы хотим получить не только текст, но и его стили, то нам нужно спуститься вглубь, к потокам. Сделать это можно так:
# В цикле пробегаемся по всем параграфам документа.
for p in document.paragraphs:
# Выводим текст параграфов.
print(p.text)
# Перебираем все потоки параграфа.
for run in p.runs:
# Выводим текст потоков.
print(" >", run.text)
И вот если текст внутри параграфов менять нельзя, то внутри потоков замены разрешены:
# Приводим текст потока к верхнему регистру.
run.text = run.text.upper()
# Делаем замену текста MYVAR на наше значение.
run.text = run.text.replace("MYVAR", "Значение переменной")
Но такой подход таит опасности. Даже если мы создадим Word-документ с текстом MYVAR в надежде его заменить через Python, то может возникнуть ситуация, когда MYVAR будет записана в несколько потоков (например, так: “MYV”, “A” и “R”) и следовательно конструкция:
run.text = run.text.replace("MYVAR", "Значение переменной")
не сработает, потому что чистого текста MYVAR в документе нет. Именно из-за этой особенности изменять docx-документы через Python сложно. Но их легко создавать.
Создание docx-документов
Понимание устройства параграфов и потоков очень важно, ведь когда мы добавляем в документ текст, то сперва создаем параграф, а потом внутри него поток, в который и помещаем наш текст (поэтому я уделил им так много внимания).Сам документ создается сверху вниз, как если бы мы его писали в Ворде. На каждом этапе мы формируем некие параграфы (+потоки) с текстом и сразу же их оформляем (выравниваем, устанавливаем шрифты).
Давайте посмотрим пример создания справки от том, что ученик закончил онлайн-курс по программированию на Python:
# Импортируем библиотеку для работы с датой
from datetime import datetime as dt
# Импортируем класс для работы с документом
from docx import Document
# Импортируем константы для выравнивания текста
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
# Импортируем единицы измерения
from docx.shared import Pt, Cm
# Создаём пустой документ
document = Document()
#
# Заголовок
#
# Добавляем параграф
header_paragraph = document.add_paragraph()
# Добавляем поток внутри параграфа
header_run = header_paragraph.add_run()
# Добавляем текст в поток
header_run.text = "Справка"
# --- Формируем стили параграфа ---
# Получаем точку входа в оформление стилей параграфа
header_paragraph_format = header_paragraph.paragraph_format
# Устанавливаем выравнивание по центру
header_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Устанавливаем отступ после параграфа (1,9 см)
header_paragraph_format.space_after = Cm(1.9)
# -- Установка шрифта ---
# Если выравнивание текста - это опция параграфа, то вот шрифт мы
# устанавливаем на поток.
# Получаем точку входа в оформление шрифта потока
font = header_run.font
# Устанавливаем шрифт, размер и жирность
font.name = 'Tahoma'
font.size = Pt(16)
font.bold = True
#
# Основной контент
#
# Снова создаем параграф и поток внутри него
content_paragraph = document.add_paragraph()
content_run = content_paragraph.add_run()
# Формируем текст
text = "Выдана Гвидо ван Россуму\n"
text += "о том, что он успешно закончил\n"
text += "онлайн-курс «Программирование на языке Python»"
# Вставляем текст в поток
content_run.text = text
# Оформляем параграф:
# - делаем межстрочный интервал 1.5
# - выравниваем текст по центру
content_paragraph_format = content_paragraph.paragraph_format
content_paragraph_format.line_spacing = 1.5
content_paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
# Устанавливаем шрифт потока
font = content_run.font
font.name = 'Arial'
font.size = Pt(12)
#
# Вставка таблицы
#
# Добавляем в документ таблицу
# из одной строки и тремя ячейками (колонками).
table = document.add_table(rows=1, cols=3)
# --- Вставка даты ---
# Выбираем первую ячейку
date_cell = table.cell(0, 0)
# Устанавливаем вертикальное выравнивание по центру
date_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
# Создаем параграф для вставки в ячейку.
date_paragraph = date_cell.add_paragraph()
# Сразу вставляем текст в параграф.
# На внутреннем уровне docx сам создаст поток.
# Вставляем сегодняшнюю дату.
date_paragraph.text = dt.now().strftime("%d.%m.%Y")
# -- Вставка печати ---
# Выбираем вторую ячейку
image_cell = table.cell(0, 1)
# Создаем параграф и поток
image_paragraph = image_cell.add_paragraph()
image_run = image_paragraph.add_run()
# Вставляем изображение в поток (ширина изображения 5 см).
# Файл stamp_alpha.png должен быть рядом с вашей программой.
image_run.add_picture('stamp_alpha.png', width=Cm(5))
# --- Вставка ФИО ---
# Выбираем третью ячейку
fio_cell = table.cell(0, 2)
После выполнения этого сĸрипта, рядом с программой появится файл user-cert.docx,
ĸоторый вы можете отĸрывать в любом теĸстовом процессоре, ĸоторый умеет работать
в word-доĸументами.
# Выравниваем в ней текст по центру (вертикально)
fio_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
# Формируем параграф и сразу вставляем в него текст
fio_paragraph = fio_cell.add_paragraph()
fio_paragraph.text = "Шультайс Н. А."
# Выравниваем параграф по правой стороне
fio_paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT
# Сохраняем docx-документ
document.save("user-cert.docx")
После выполнения этого сĸрипта, рядом с программой появится файл user-cert.docx,
ĸоторый вы можете отĸрывать в любом теĸстовом процессоре, ĸоторый умеет работать
в word-доĸументами.
Еще записи по вопросам использования Microsoft Word:
- 10 полезных заметок о колонтитулах
- 3 способа очистки списка недавно открытых документов
- Microsoft Office: популярные команды на одной вкладке
- SQL для начинающих: изучите SQL онлайн за 9 часов
- Word 2007: полотно, рисунки, линии
- Word 97. Слияние документов как один из способов упростить свою работу
- Автозаполняемые колонтитулы
- Автоматизация текстового набора в Word
- Автоматическая запись макроса
- Автоматическая нумерация билетов
- Автоматическое сохранение всех открытых документов
- Автотекст с последовательной нумерацией
- Белый текст на синем фоне: ностальгия по DOS
- Быстрое выделение идущих рядом слов
- Быстрое изменение стиля форматирования текста
- Быстрое перемещение между открытыми документами Word
- Быстрое создание списков в документе
- Быстрый доступ к диалоговому окну Параметры страницы
- Быстрый поиск форматированного текста
- Быстрый способ создания закладок со ссылками на них
- В чем различие между Автозаменой и Автотекстом
- Ввод повторяющихся фрагментов текста в Word 2007
- Вертикальное выравнивание текста
- Возможности для удалённого заработка с таблицами и текстами
- Восстановление поврежденных документов Word

Форум
Читают
Обсуждают
страницы
сайты
статистика
Оставьте комментарий!