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


  1. GAG
    21.09.2021 11:41
    +6

    Когда прочитал название «Автоматическое заполнение файлами документов Word и подписей к ним с помощью Python и библиотеки docx», то предположил, что "подписи" — это криптографические подписи, а оказалось, что "файлы" — это изображения, а "подписи" — это текстовые описания под изображениями. Более однозначным было бы название «Автоматизация вставки изображений с описаниями в документы Word с помощью Python и библиотеки docx».


  1. Oleh_Lastovetskyi Автор
    21.09.2021 12:09
    -1

    возможно в некоторых случаях нужно будет импортировать numpy в начале кода

    import numpy as np


  1. 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 году как-то не своевременно ;-)


    1. GAG
      21.09.2021 19:32
      +1

      Самый "дешёвый" вариант — это собрать исполняемый бинарный файл (.exe) на основе скрипта Python. На каком-то этапе всё равно придётся установить интерпретатор Python, но после сборки можно будет его удалить и оставить только результирующий бинарь.

      Несколько инструментов, которые можно использовать для создания исполняемого бинарнаго файла:

      1. PyInstaller + Auto PY to EXE

      2. cx_Freeze


      1. adeshere
        23.09.2021 00:18

        Спасибо. Получается, в любом случае нужно искать компьютер, где можно безопасно осваивать технологию. Рабочий комп у меня один (удаленка), и экспериментировать на нем нежелательно. Особенно с языком, на котором пока еще не написал ни одной буквы ;-)


    1. repanoid
      22.09.2021 09:50
      +1

      https://winpython.github.io/ - портабельный интерпретатор


      1. adeshere
        23.09.2021 00:19

        Спасибо, буду разбираться...


    1. atmega644
      24.09.2021 15:59
      +1

      1. adeshere
        26.09.2021 03:57

        Попробовал - для экспериментов вполне годится! Спасибо!


    1. looogle
      25.09.2021 19:59

      Есть ещё Nuitka, компилятор питон кода. Собирал ей достаточно сложные проекты — работало. Для простых я думаю отлично будет функционировать.


  1. axtrace
    27.09.2021 10:19

    Для такого и похожего булшита рекомендую Automate the Boring Stuff with Python Programming: их сайт https://automatetheboringstuff.com/ или курс с теми же материалами https://www.udemy.com/course/automate/