Автоматическое заполнение файлами документов Word и подписей к ним с помощью Python и библиотеки docx

от автора

Рассмотрим пример простой программы на Python с помощью библотекы docx для автоматизации рабочего процесса, а именно автоматической вставки файлов (в данном случае изображений) и их подпись в документах Word (docx).

Данная статья будет интересна для начинающих изучающих Python, а также полезна для тех кто работает с большими объемами изображений, графиков, осциллограмм и тому подобное. В ней мы рассмотрим простой и удобный способ вставки изображений в Word и их подписью с помощью Python.

Я опишу свой максимально дубовый и непрофессиональный но простой код который Вы сможете повторить в своих проектах. (Полный код в низу статьи).

Цель

В жизни каждого инженера или аналитика или другого специалиста, наступает момент, когда нужно оформлять отчет. Часто это осциллограммы, графики, ВАХ или другие графические изображения. Отчет нужно оформить в вордовском файле, с приведением изображений и их подписью. Делать вручную это очень увлекательно и интересно долго, неэффективно, скучно и другие синонимы к етим словам.

Рассмотрим простой способ вставки изображений и их подписью в файл docx с помощью Python.

Начало написания программы

Сначала нам нужно добавить библиотеку docx для работы с файлами Word.

import docx

Давайте создадим блок в коде в котором укажем название docx файла и путь к нему, а также путь к папке с изображениями. Чтобы в дальнейшем для удобства было достаточно внести изменения путь к файлам только в верху кода.

folder_doc = r'D:\PITON\Project'       # Папка в которой docx файл name_doc = '\Report.docx'              # Название doc файла folder_png = 'D:\PITON\Project\Png'    # Папка в которой находятся графики

Далее добавим объект doc из библиотеки и укажем путь к файлу с названием документа.

doc = docx.Document(folder_doc + name_doc)  # Указываем параметры которые задавали в коде раньше (путь и имя)

Формируем последовательность вставки файлов

Исходя из названия файлов (изображений) нам нужно определить в какой последовательности мы будем вставлять изображения в Word.
В моем случае ето: Test_number1_Outside_humidity_10_Outside_temperature_25. Отличие в названии файлов есть в числах возле названия параметра (их мы и будем менять в коде для автоматического заполнения файла).
Создаем массивы с значениями этих чисел:

test_number = [1, 2, 3, 4, 5]                           # Указываем номер теста outside_humidity = [10, 20, 30, 40, 50, 60, 70, 80, 90] # Указываем влажность outside_temperature = [25, 50, 75, 100]                 # Указываем температуру

Основная часть программы

После того как мы разобрались с тем, как мы будем идентифицировать изображение для последующей вставки, нам необходимо определиться в порядке в котором будут идти изображения. У меня все картинки будут идти в таком порядке: test_number, outside_humidity, outside_temperature. Вы же можете сделать произвольный порядок.

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

for r in range(len(test_number)):     for d in range(len(outside_humidity)):         for i in range(len(outside_temperature)):

Далее стандартными средствами библиотеки добавляем картинки в файл и создаем подписи.
doc.add_picture — добавляет изображения в файл Word
folder_png — это путь к папке которую мы указывали вверху кода
После этого мы указываем точное название файлов в папке, но вместо значений которые меняются вставляем в фигурные скобки.
В функции .format указываем те значения переменных которые меняются в каждом файле и которые мы внесли в цикле for. Эти значения будут применяться к каждому файлу, где мы указывали фигурные скобки (в той же последовательности).

Для подписи файла используем такой же алгоритм.
doc.add_paragraph — используем для записи параграфу
doc.add_paragraph(" ") — делаем отступ

doc.add_picture(folder_png + '/Test_number{}_Outside_humidity_{}_Outside_temperature_{}.png' .format(test_number[r],outside_humidity[d], outside_temperature[i]))  doc.add_paragraph("Figure {}, Test number {}, Outside humidity = {} %, Outside temperature = {} C;"  .format(i + 1, test_number[r], outside_humidity[d], outside_temperature[i]))   doc.add_paragraph(" ")

Сохраняем файл

doc.save(folder_doc + name_doc)

Меняем параметры изображения

Изображение будем вставлять размером 13.33 х 10 см, для этого воспользуемся дополнительными возможностями библиотеки docx.
Сначала напишем функцию которая будет конвертировать размер с inch в см.

def inch_to_cm(value):     return value / 2.54

Теперь добавим данные параметры к основному коду:

doc.add_picture(folder_png + '/Test_number{}_Outside_humidity_{}_Outside_temperature_{}.png' .format(test_number[r],outside_humidity[d], outside_temperature[i]),  width=docx.shared.Inches(inch_to_cm(13.330)),  height=docx.shared.Inches(inch_to_cm(9)))

Результат

В данной папке находится 180 изображений:

После запуска кода с помощью Python, в течение 5 секунд мы получаем следующий результат:

Вывод

Имея структурированные данные на базе данного кода с помощью Python и библиотеки docx можно в течение 10 минут написать свой код, который в течение нескольких секунд сделает всю грязную работу за Вас.

Разве не для этого придумывали компьютер?

Полный код программы

import docx  folder_doc = r'D:\PITON\Project'       # Папка в которой docx файл name_doc = '\Report.docx'              # Название doc файла folder_png = 'D:\PITON\Project\Png'    # Папка в которой находятся графики  doc = docx.Document(folder_doc + name_doc) # Указываем параметры которые задавали в коде раньше (путь и имя файла)  test_number = [1, 2, 3, 4, 5]                           # Указываем номер теста outside_humidity = [10, 20, 30, 40, 50, 60, 70, 80, 90] # Указываем влажность outside_temperature = [25, 50, 75, 100]                 # Указываем температуру  def inch_to_cm(value):     return value / 2.54 # Конвертируем в см  for r in range(len(test_number)):     for d in range(len(outside_humidity)):         for i in range(len(outside_temperature)):              # Test_number1_Outside_humidity_10_Outside_temperature_25             doc.add_picture(folder_png + '/Test_number{}_Outside_humidity_{}_Outside_temperature_{}.png'.format(test_number[r],outside_humidity[d], outside_temperature[i]), width=docx.shared.Inches(inch_to_cm(13.330)), height=docx.shared.Inches(inch_to_cm(9)))             doc.add_paragraph("Figure {}, Test number {}, Outside humidity = {} %, Outside temperature = {} C;" .format(i + 1, test_number[r], outside_humidity[d], outside_temperature[i]))             doc.add_paragraph(" ")  doc.save(folder_doc + name_doc)


ссылка на оригинал статьи https://habr.com/ru/articles/579094/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *