ћерион Ќетворкс

7 минут

¬ этой статье мы расскажем как интегрировать Python c Excel и Word, чтобы без проблем создавать автоматические отчеты. Microsoft Excel и Microsoft Word Ц это, без доли сомнений, две наиболее широко используемые программы как в мире бизнеса, так и в некорпоративной сфере. ќни практически €вл€ютс€ синонимами слову Ђработаї.  ак правило, не проходит и недели, чтобы мы тем или иным способом не воспользовались их преимуществами. » хот€ дл€ обычных повседневных задач автоматизаци€ не требуетс€, бывают случаи, когда она может стать необходимостью. ј именно, когда у вас есть множество диаграмм, рисунков, таблиц и отчетов, которые необходимо сделать, это может стать очень утомительным зан€тием, если все это выполн€ть вручную. ј это не должно быть так. Ќа самом деле существует способ создать конвейер в Python, где можно будет легко интегрировать эти программы дл€ создани€ электронных таблиц в Excel, а затем передавать результаты в Word дл€ создани€ отчета практически мгновенно.


Openpyxl

ѕознакомьтесь с Openpyxl, возможно, одной из самых универсальных прив€зок в Python, котора€ превращает взаимодействие с Excel буквально в прогулку по парку. »спользу€ этот пакет, вы сможете читать и записывать все новые и старые форматы Excel, то есть .xlsx и .xls. Openpyxl позвол€ет заполн€ть строки и столбцы, выполн€ть формулы, создавать 2D- и 3D-диаграммы, маркировать оси и заголовки, а также имеет множество других возможностей, которые могут пригодитьс€. ќднако здесь наиболее важно то, что этот пакет позвол€ет вам перебирать бесконечное количество строк и столбцов Excel, тем самым избавл€€ вас от всех этих утомительных вычислений и построени€ графиков, которые вам приходилось делать ранее самим.


Python-docx

ј затем по€вл€етс€ Python-docx Ц пакет дл€ Word Ц то же, что Openpyxl дл€ Excel. ≈сли вы все еще не изучили их документацию, то вам все же стоит на нее взгл€нуть. Python-docx Ц без преувеличени€ один из самых простых и пон€тных наборов инструментов, с которыми € работал с тех пор, как начал работать с Python. ќн позвол€ет автоматизировать создание документов, автоматически вставл€€ текст, заполн€€ таблицы и отобража€ изображени€ в отчете без каких-либо усилий.

Ѕез лишних церемоний давайте создадим наш собственный автоматизированный конвейер. «апустите IDE по вашему выбору и установите следующие пакеты:

pip install openpyxlpip install python-docx

јвтоматизаци€ Microsoft Excel

ƒл€ начала загрузим уже созданную книгу Excel (как показано ниже):

workbook = xl.load_workbook('Book1.xlsx')
sheet_1 = workbook['Sheet1']
Book1.xlsx

«атем мы пройдемс€ по всем строкам в нашей электронной таблице дл€ того, чтобы вычислить и вставить значение мощности, которую мы получим, умножив ток на напр€жение:

for row in range(2, sheet_1.max_row + 1):
    current = sheet_1.cell(row, 2)
    voltage = sheet_1.cell(row, 3)
    power = float(current.value) * float(voltage.value)
    power_cell = sheet_1.cell(row, 1)
    power_cell.value = power    

 ак только мы сделаем это, то мы сможем использовать рассчитанные значени€ мощности дл€ построени€ линейной диаграммы, котора€ будет вставлена в указанную €чейку, как показано ниже:

values = Reference(sheet_1, min_row = 2, max_row = sheet_1.max_row, min_col = 1, max_col = 1)
chart = LineChart()
chart.y_axis.title = 'Power'
chart.x_axis.title = 'Index'
chart.add_data(values)
sheet_1.add_chart(chart, 'e2') 
workbook.save('Book1.xlsx')
јвтоматически сгенерированна€ таблица Excel

»звлечение диаграммы

“еперь, когда мы построили нашу диаграмму, нам нужно ее извлечь в формате изображени€ дл€ того, чтобы мы могли использовать ее в нашем отчете Word. ƒл€ начала объ€вим точное местоположени€ нашего файла Excel, а также место, куда мы хотим сохранить изображение получившейс€ диаграммы:

input_file = "C:/Users/.../Book1.xlsx"
output_image = "C:/Users/.../chart.png"    

«атем необходимо получить доступ к таблице, использу€ следующий метод:

operation = win32com.client.Dispatch("Excel.Application")
operation.Visible = 0
operation.DisplayAlerts = 0
workbook_2 = operation.Workbooks.Open(input_file)
sheet_2 = operation.Sheets(1)    

» далее вы можете перебрать все диаграммы в таблице (если их больше одной) и сохранить их в указанном месте:

for x, chart in enumerate(sheet_2.Shapes):
    chart.Copy()
    image = ImageGrab.grabclipboard()
    image.save(output_image, 'png')
    passworkbook_2.Close(True)
operation.Quit()    

јвтоматизаци€ Microsoft Word

“еперь, когда у нас есть изображение диаграммы, мы должны создать шаблон документа, который представл€ет собой обычный документ Microsoft Word (.docx), сформированный именно так, как нам необходимо, чтобы наш отчет имел определенный тип и размер шрифта, нужное форматирование и структуру страницы. ƒалее, все, что нам необходимо сделать, это создать заполнители дл€ нашего автоматизированного содержимого, то есть значений таблиц и изображений, и объ€вить их с переменными, как показано ниже.

Ўаблон документа Microsoft Word

¬нутри двойных фигурных скобок {{variable_name}} может быть объ€влен любое автоматизированное содержимое, включа€ текст и изображени€. ƒл€ таблиц вам необходимо создать таблицу с шаблонной строкой, в которую включены все столбцы, а затем вам необходимо добавить еще одну строку выше и одну строку ниже со следующими обозначени€ми:

ѕерва€ строка:

{%tr for item in variable_name %}

ѕоследн€€ строка:

{%tr endfor %}

Ќа рисунке выше указаны следующие имена переменных:

  • table_contents дл€ словар€ Python, в котором будут хранитьс€ наши табличные данные.
  • Index дл€ ключей словар€ (первый столбец).
  • Power, Current и Voltage дл€ значений словар€ (второй, третий и четвертый столбцы).

«атем мы импортируем наш документ-шаблон в Python и создаем словарь, в котором будут хранитьс€ значени€ нашей таблицы:

template = DocxTemplate('template.docx')
table_contents = []for i in range(2, sheet_1.max_row + 1):
    table_contents.append({
        'Index': i-1,
        'Power': sheet_1.cell(i, 1).value,
        'Current': sheet_1.cell(i, 2).value,
        'Voltage': sheet_1.cell(i, 3).value
        })    

ƒалее мы импортируем изображение диаграммы, которое ранее мы создали в Excel, и создаем еще один словарь дл€ создани€ экземпл€ров всех переменных-заполнителей, объ€вленных в документе-шаблоне:

image = InlineImage(template,'chart.png',Cm(10))context = {
    'title': 'Automated Report',
    'day': datetime.datetime.now().strftime('%d'),
    'month': datetime.datetime.now().strftime('%b'),
    'year': datetime.datetime.now().strftime('%Y'),
    'table_contents': table_contents,
    'image': image
    }    

», наконец, мы отображаем отчет с нашей таблицей значений и изображением диаграммы:

template.render(context)
template.save('Automated_report.docx')    

«аключение

» вот, мы получили автоматически созданный отчет Microsoft Word с числами и диаграммами, созданными в Microsoft Excel. ѕри этом у вас есть полностью автоматизированный конвейер, который можно использовать дл€ создани€ любого количества таблиц, диаграмм и документов.

јвтоматически созданный отчет

»сходный код программы

import openpyxl as xl
from openpyxl.chart import LineChart, Reference

import win32com.client
import PIL
from PIL import ImageGrab, Image
import os
import sys

from docx.shared import Cm
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Cm, Inches, Mm, Emu
import random
import datetime
import matplotlib.pyplot as plt


######## Generate automated excel workbook ########

workbook = xl.load_workbook('Book1.xlsx')
sheet_1 = workbook['Sheet1']
  
for row in range(2, sheet_1.max_row + 1):
    current = sheet_1.cell(row, 2)
    voltage = sheet_1.cell(row, 3)
    power = float(current.value) * float(voltage.value)
    power_cell = sheet_1.cell(row, 1)
    power_cell.value = power
  
values = Reference(sheet_1, min_row = 2, max_row = sheet_1.max_row, min_col = 1, max_col = 1)
chart = LineChart()
chart.y_axis.title = 'Power'
chart.x_axis.title = 'Index'
chart.add_data(values)
sheet_1.add_chart(chart, 'e2')
  
workbook.save('Book1.xlsx')


######## Extract chart image from Excel workbook ########

input_file = "C:/Users/.../Book1.xlsx"
output_image = "C:/Users/.../chart.png"

operation = win32com.client.Dispatch("Excel.Application")
operation.Visible = 0
operation.DisplayAlerts = 0
    
workbook_2 = operation.Workbooks.Open(input_file)
sheet_2 = operation.Sheets(1)
    
for x, chart in enumerate(sheet_2.Shapes):
    chart.Copy()
    image = ImageGrab.grabclipboard()
    image.save(output_image, 'png')
    pass

workbook_2.Close(True)
operation.Quit()


######## Generating automated word document ########

template = DocxTemplate('template.docx')

#Generate list of random values
table_contents = []

for i in range(2, sheet_1.max_row + 1):
    
    table_contents.append({
        'Index': i-1,
        'Power': sheet_1.cell(i, 1).value,
        'Current': sheet_1.cell(i, 2).value,
        'Voltage': sheet_1.cell(i, 3).value
        })

#Import saved figure
image = InlineImage(template,'chart.png',Cm(10))

#Declare template variables
context = {
    'title': 'Automated Report',
    'day': datetime.datetime.now().strftime('%d'),
    'month': datetime.datetime.now().strftime('%b'),
    'year': datetime.datetime.now().strftime('%Y'),
    'table_contents': table_contents,
    'image': image
    }

#Render automated report
template.render(context)
template.save('Automated_report.docx')
    

—кидки 50% в Merion Academy

¬ыбрать курс