Рассмотрим пример простой программы на 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
- добавляет изображения в файл Wordfolder_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)
Oleh_Lastovetskyi Автор
21.09.2021 12:09-1возможно в некоторых случаях нужно будет импортировать numpy в начале кода
import numpy as np
adeshere
21.09.2021 16:01Вопрос-оффтопик от чайника: а есть ли "дешевый" способ запустить этот скрипт (или аналогичный ему) на компьютере с Win 7-64, где не установлен Python?
Подробности вопроса
Дешевый в том плане, чтобы не изучать многостраничную документацию, а просто скачать какой-то портабельный (не требующий установки!) вариант интерпретатора, и потом можно было бы в командной строке писать что-то вроде:
Python_интерпретатор.exe MyScript.py > Output.log
(подразумевается, что скрипт должен работать с файлами, а Output.log используется только в отладочных целях).
Существенно, что интерпретатор не должен интегрироваться в систему, а просто лежал бы в какой-то локальной папке внешнего диска. Который, в идеале, можно сегодня включить в один комп, а завтра - в другой. Но чтобы при этом работал импорт всяческих модулей типа docx, sys, os, requests и т.п. - без них возможный полезный эффект от подобных скриптов вряд ли окупит затраты на освоение технологии...
Задача у меня почти в точности такая, как написано в статье, только я массово (иногда по паре раз в год! ;-) вставляю в Word-файлы не научные графики, а фотографии в отчеты о велосипедных и других подобных походах. До сих пор автоматизировал эту вставку с помощью макросов офиса. Понятно, что "запускать на исполнение" эту задачу приходится только изредка, поэтому решение нужно или "дешевое", с минимальным порогом вхождения, или не нужно вообще. С программированием я в общем знаком, но эрудиция закончилась в молодости на всяких реликтовых языках типа ЯУЗА ОС RSX11M. Сейчас пишу программы для научных расчетов исключительно на фортране. А там готовых инструментов для работы с docx не прикручено ;-) А парсить такие форматы вручную в 2021 году как-то не своевременно ;-)
GAG
21.09.2021 19:32+1Самый "дешёвый" вариант — это собрать исполняемый бинарный файл (.exe) на основе скрипта Python. На каком-то этапе всё равно придётся установить интерпретатор Python, но после сборки можно будет его удалить и оставить только результирующий бинарь.
Несколько инструментов, которые можно использовать для создания исполняемого бинарнаго файла:
adeshere
23.09.2021 00:18Спасибо. Получается, в любом случае нужно искать компьютер, где можно безопасно осваивать технологию. Рабочий комп у меня один (удаленка), и экспериментировать на нем нежелательно. Особенно с языком, на котором пока еще не написал ни одной буквы ;-)
axtrace
27.09.2021 10:19Для такого и похожего булшита рекомендую Automate the Boring Stuff with Python Programming: их сайт https://automatetheboringstuff.com/ или курс с теми же материалами https://www.udemy.com/course/automate/
GAG
Когда прочитал название «Автоматическое заполнение файлами документов Word и подписей к ним с помощью Python и библиотеки docx», то предположил, что "подписи" — это криптографические подписи, а оказалось, что "файлы" — это изображения, а "подписи" — это текстовые описания под изображениями. Более однозначным было бы название «Автоматизация вставки изображений с описаниями в документы Word с помощью Python и библиотеки docx».