Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров13K

Рассмотрим пример простой программы на 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)
Теги:
Хабы:
Всего голосов 11: ↑9 и ↓2+7
Комментарии11

Публикации

Истории

Работа

Python разработчик
138 вакансий
Data Scientist
61 вакансия

Ближайшие события