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

Kate

Administrator
Команда форума
Рассмотрим пример простой программы на 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))

doc.add_paragraph("Figure {}, Test number {}, Outside humidity = {} %, Outside temperature = {} C;"
.format(i + 1, test_number[r], outside_humidity[d], outside_temperature))

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),
width=docx.shared.Inches(inch_to_cm(13.330)),
height=docx.shared.Inches(inch_to_cm(9)))

Результат​

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

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

Вывод​

Имея структурированные данные на базе данного кода с помощью 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), 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))
doc.add_paragraph(" ")

doc.save(folder_doc + name_doc)


 
Сверху