Давайте посмотрим правде в глаза. Независимо от того, чем мы занимаемся, рано или поздно нам придется иметь дело с повторяющимися задачами, такими как обновление ежедневного отчета в Excel.
Python идеально подходит для решения задач автоматизации. Но если вы работаете компании, которая не использует Python, вам будет сложно автоматизировать рабочие задачи с помощью этого языка. Но не волнуйтесь: даже в этом случае вы все равно сможете использовать свои навыки питониста.
Для автоматизации отчетов в Excel вам не придется убеждать своего начальника перейти на Python! Можно просто использовать модуль Python openpyxl, чтобы сообщить Excel, что вы хотите работать через Python. При этом процесс создания отчетов получится автоматизировать, что значительно упростит вашу жизнь.
Набор данных
В этом руководстве мы будем использовать файл Excel с данными о продажах. Он похож на те файлы, которые используются в качестве входных данных для создания отчетов во многих компаниях. Вы можете скачать этот файл на Kaggle. Однако он имеет формат .csv
, поэтому вам следует изменить расширение на .xlsx
или просто загрузить его по этой ссылке на Google Диск (файл называется supermarket_sales.xlsx).
Прежде чем писать какой-либо код, внимательно ознакомьтесь с файлом на Google Drive. Этот файл будет использоваться как входные данные для создания следующего отчета на Python:

Теперь давайте сделаем этот отчет и автоматизируем его составление с помощью Python!
Создание сводной таблицы с помощью pandas
Импорт библиотек
Теперь, когда вы скачали файл Excel, давайте импортируем библиотеки, которые нам понадобятся.
import pandas as pd import openpyxl from openpyxl import load_workbook from openpyxl.styles import Font from openpyxl.chart import BarChart, Reference import string
Чтобы прочитать файл Excel, создать сводную таблицу и экспортировать ее в Excel, мы будем использовать Pandas. Затем мы воспользуемся библиотекой openpyxl для написания формул Excel, создания диаграмм и форматирования электронной таблицы с помощью Python. Наконец, мы создадим функцию на Python для автоматизации всего этого процесса.
Примечание. Если у вас не установлены эти библиотеки в Python, вы можете легко установить их, выполнив pip install pandas
и pip install openpyxl
в командной строке.
Чтение файла Excel
Прежде чем читать Excel-файл, убедитесь, что он находится там же, где и ваш файл со скриптом на Python. Затем можно прочитать файл Excel с помощью pd.read_excel()
, как показано в следующем коде:
excel_file = pd.read_excel('supermarket_sales.xlsx') excel_file[['Gender', 'Product line', 'Total']]
В файле много столбцов, но для нашего отчета мы будем использовать только столбцы Gender
, Product line
и Total
. Чтобы показать вам, как они выглядят, я выбрал их с помощью двойных скобок. Если мы выведем это в Jupyter Notebooks, увидим следующий фрейм данных, похожий на таблицу Excel:

Создание сводной таблицы
Теперь мы можем легко создать сводную таблицу из ранее созданного фрейма данных excel_file
. Для этого нам просто нужно использовать метод .pivot_table()
.
Предположим, мы хотим создать сводную таблицу, которая показывает, сколько в целом потратили на разные продуктовые линейки мужчины и женщины. Для этого мы пишем следующий код:
report_table = excel_file.pivot_table(index='Gender', columns='Product line', values='Total', aggfunc='sum').round(0)
Таблица report_table
должна выглядеть примерно так:

Экспорт сводной таблицы в файл Excel
Чтобы экспортировать созданную сводную таблицу, мы используем метод .to_excel()
. Внутри скобок нужно написать имя выходного файла Excel. В данном случае давайте назовем этот файл report_2021.xlsx.
Мы также можем указать имя листа, который хотим создать, и в какой ячейке должна находиться сводная таблица.
report_table.to_excel('report_2021.xlsx', sheet_name='Report', startrow=4)
Теперь файл Excel экспортируется в ту же папку, в которой находится ваш скрипт Python.
Создание отчета с помощью openpyxl
Каждый раз, когда мы захотим получить доступ к файлу, мы будем использовать load_workbook()
, импортированный из openpyxl. В конце работы мы будем сохранять полученные результаты с помощью метода .save()
.
В следующих разделах мы будем загружать и сохранять файл при каждом изменении. Вам это нужно сделать только один раз (как в полном коде, показанном в самом конце этого руководства).
Создание ссылки на строку и столбец
Чтобы автоматизировать отчет, нам нужно взять минимальный и максимальный активный столбец или строку, чтобы код, который мы собираемся написать, продолжал работать, даже если мы добавим больше данных.
Чтобы получить ссылки в книге Excel, мы сначала загружаем её с помощью функции load_workbook()
и находим лист, с которым хотим работать, используя wb[‘имя листа’]
. Затем мы получаем доступ к активным ячейкам с помощью метода .active
.
wb = load_workbook('report_2021.xlsx') sheet = wb['Report'] # cell references (original spreadsheet) min_column = wb.active.min_column max_column = wb.active.max_column min_row = wb.active.min_row max_row = wb.active.max_row
Давайте выведем на экран созданные нами переменные, чтобы понять, что они означают. В данном случае мы получим следующие числа:
Min Columns: 1 Max Columns: 7 Min Rows: 5 Max Rows: 7
Откройте файл report_2021.xlsx, который мы экспортировали ранее, чтобы убедиться в этом.

Как видно на картинке, минимальная строка – 5, максимальная — 7. Кроме того, минимальная ячейка – это A1
, а максимальная – G7
. Эти ссылки будут чрезвычайно полезны для следующих разделов.
Добавление диаграмм в Excel при помощи Python
Чтобы создать диаграмму в Excel на основе созданной нами сводной таблицы, нужно использовать модуль Barchart
. Его мы импортировали ранее. Для определения позиций значений данных и категорий мы используем модуль Reference
из openpyxl (его мы тоже импортировали в самом начале).
wb = load_workbook('report_2021.xlsx') sheet = wb['Report'] # barchart barchart = BarChart() #locate data and categories data = Reference(sheet, min_col=min_column+1, max_col=max_column, min_row=min_row, max_row=max_row) #including headers categories = Reference(sheet, min_col=min_column, max_col=min_column, min_row=min_row+1, max_row=max_row) #not including headers # adding data and categories barchart.add_data(data, titles_from_data=True) barchart.set_categories(categories) #location chart sheet.add_chart(barchart, "B12") barchart.title = 'Sales by Product line' barchart.style = 5 #choose the chart style wb.save('report_2021.xlsx')
После написания этого кода файл report_2021.xlsx должен выглядеть следующим образом:

Объяснение кода:
barchart = BarChart()
инициализирует переменнуюbarchart
из классаBarchart
.data
иcategories
– это переменные, которые показывают, где находится необходимая информация. Для автоматизации мы используем ссылки на столбцы и строки, которые определили выше. Также имейте в виду, что мы включаем заголовки в данные, но не в категории.- Мы используем
add_data()
иset_categories()
, чтобы добавить необходимые данные в гистограмму. Внутриadd_data()
добавимtitle_from_data = True
, потому что мы включили заголовки для данных. - Метод
sheet.add_chart()
используется для указания, что мы хотим добавить нашу гистограмму в лист Report. Также мы указываем, в какую ячейку мы хотим её добавить. - Дальше мы изменяем заголовок и стиль диаграммы, используя
barchart.title
иbarchart.style
. - И наконец, сохраняем все изменения с помощью
wb.save()
Вот и всё! С помощью данного кода мы построили диаграмму в Excel.
Применение формул в Excel через Python
Вы можете набирать формулы в Excel при помощи Python так же, как вы это делаете непосредственно на листе Excel.
Предположим, мы хотим суммировать данные в ячейках B5
и B6
и отображать их в ячейке B7
. Кроме того, мы хотим установить формат ячейки B7
как денежный. Сделать мы это можем следующим образом:
sheet['B7'] = '=SUM(B5:B6)' sheet['B7'].style = 'Currency'
Довольно просто, не правда ли? Мы можем протянуть эту формулу от столбца B до G или использовать цикл for
для автоматизации. Однако сначала нам нужно получить алфавит, чтобы ссылаться на столбцы в Excel (A, B, C, …). Для этого воспользуемся библиотекой строк и напишем следующий код:
import string alphabet = list(string.ascii_uppercase) excel_alphabet = alphabet[0:max_column] print(excel_alphabet)
Если мы распечатаем excel_alphabet
, мы получим список от A до G.
Так происходит потому, что сначала мы создали алфавитный список от A до Z, а затем взяли срез [0:max_column]
, чтобы сопоставить длину этого списка с первыми 7 буквами алфавита (A-G).
Примечание. Нумерация в Python начинаются с 0, поэтому A = 0, B = 1, C = 2 и так далее. Срез [a:b]
возвращает элементы от a
до b-1
.
Применение формулы к нескольким ячейкам
После этого пройдемся циклом по столбцам и применим формулу суммы, но теперь со ссылками на столбцы. Таким образом вместо того, чтобы многократно писать это:
sheet['B7'] = '=SUM(B5:B6)' sheet['B7'].style = 'Currency'
мы используем ссылки на столбцы и помещаем их в цикл for
:
wb = load_workbook('report_2021.xlsx') sheet = wb['Report'] # sum in columns B-G for i in excel_alphabet: if i!='A': sheet[f'{i}{max_row+1}'] = f'=SUM({i}{min_row+1}:{i}{max_row})' sheet[f'{i}{max_row+1}'].style = 'Currency' # adding total label sheet[f'{excel_alphabet[0]}{max_row+1}'] = 'Total' wb.save('report_2021.xlsx')
После запуска кода мы получаем формулу суммы в строке Total
для столбцов от B до G:

Посмотрим, что делает данный код:
for i in excel_alphabet
проходит по всем активным столбцам, кроме столбца A (if i! = 'A'
), так как столбец A не содержит числовых данных- запись
sheet[f'{i}{max_row+1}'] = f'=SUM({i}{min_row+1}:{i}{max_row}'
это то же самое, что иsheet['B7'] = '=SUM(B5:B6)'
, только для столбцов от A до G - строчка
sheet [f '{i} {max_row + 1}'].style = 'Currency'
задает денежный формат ячейкам с числовыми данными (т.е. тут мы опять же исключаем столбец А) - мы добавляем запись
Total
в столбец А под максимальной строкой (т.е. под седьмой), используя код[f '{excel_alphabet [0]} {max_row + 1}'] = 'Total'
Форматирование листа с отчетом
Теперь давайте внесем финальные штрихи в наш отчет. Мы можем добавить заголовок, подзаголовок, а также настроить их шрифт.
wb = load_workbook('report_2021.xlsx') sheet = wb['Report'] sheet['A1'] = 'Sales Report' sheet['A2'] = '2021' sheet['A1'].font = Font('Arial', bold=True, size=20) sheet['A2'].font = Font('Arial', bold=True, size=10) wb.save('report_2021.xlsx')
Вы также можете добавить другие параметры внутри Font()
. В документации openpyxl можно найти список доступных стилей.
Итоговый отчет должен выглядеть следующим образом:

Автоматизация отчета с помощью функции Python
Теперь, когда отчет готов, мы можем поместить весь наш код в функцию, которая автоматизирует создание отчета. И в следующий раз, когда мы захотим создать такой отчет, нам нужно будет только ввести имя файла и запустить код.
Примечание. Чтобы эта функция работала, имя файла должно иметь структуру «sales_month.xlsx». Кроме того, мы добавили несколько строк кода, которые используют месяц/год файла продаж в качестве переменной, чтобы мы могли повторно использовать это в итоговом файле и подзаголовке отчета.
Приведенный ниже код может показаться устрашающим, но это просто объединение всего того, что мы написали выше. Плюс новые переменные file_name
, month_name
и month_and_extension
.
import pandas as pd import openpyxl from openpyxl import load_workbook from openpyxl.styles import Font from openpyxl.chart import BarChart, Reference import string def automate_excel(file_name): """The file name should have the following structure: sales_month.xlsx""" # read excel file excel_file = pd.read_excel(file_name) # make pivot table report_table = excel_file.pivot_table(index='Gender', columns='Product line', values='Total', aggfunc='sum').round(0) # splitting the month and extension from the file name month_and_extension = file_name.split('_')[1] # send the report table to excel file report_table.to_excel(f'report_{month_and_extension}', sheet_name='Report', startrow=4) # loading workbook and selecting sheet wb = load_workbook(f'report_{month_and_extension}') sheet = wb['Report'] # cell references (original spreadsheet) min_column = wb.active.min_column max_column = wb.active.max_column min_row = wb.active.min_row max_row = wb.active.max_row # adding a chart barchart = BarChart() data = Reference(sheet, min_col=min_column+1, max_col=max_column, min_row=min_row, max_row=max_row) #including headers categories = Reference(sheet, min_col=min_column, max_col=min_column, min_row=min_row+1, max_row=max_row) #not including headers barchart.add_data(data, titles_from_data=True) barchart.set_categories(categories) sheet.add_chart(barchart, "B12") #location chart barchart.title = 'Sales by Product line' barchart.style = 2 #choose the chart style # applying formulas # first create alphabet list as references for cells alphabet = list(string.ascii_uppercase) excel_alphabet = alphabet[0:max_column] #note: Python lists start on 0 -> A=0, B=1, C=2. #note2 the [a:b] takes b-a elements # sum in columns B-G for i in excel_alphabet: if i!='A': sheet[f'{i}{max_row+1}'] = f'=SUM({i}{min_row+1}:{i}{max_row})' sheet[f'{i}{max_row+1}'].style = 'Currency' sheet[f'{excel_alphabet[0]}{max_row+1}'] = 'Total' # getting month name month_name = month_and_extension.split('.')[0] # formatting the report sheet['A1'] = 'Sales Report' sheet['A2'] = month_name.title() sheet['A1'].font = Font('Arial', bold=True, size=20) sheet['A2'].font = Font('Arial', bold=True, size=10) wb.save(f'report_{month_and_extension}') return
Применение функции к одному файлу Excel
Представим, что исходный файл, который мы загрузили, имеет имя sales_2021.xlsx вместо supermarket_sales.xlsx. Чтобы применить формулу к отчету, пишем следующее:
automate_excel('sales_2021.xlsx')
После запуска этого кода вы получите файл Excel с именем report_2021.xlsx в той же папке, где находится ваш скрипт Python.
Применение функции к нескольким файлам Excel
Представим, что теперь у нас есть только ежемесячные файлы Excel sales_january.xlsx, sales_february.xlsx и sales_march.xlsx (эти файлы можно найти на GitHub).
Вы можете применить нашу функцию к ним всем, чтобы получить 3 отчета.
automate_excel('sales_january.xlsx') automate_excel('sales_february.xlsx') automate_excel('sales_march.xlsx')
Или можно сначала объединить эти три отчета с помощью pd.concat()
, а затем применить функцию только один раз.
# read excel files excel_file_1 = pd.read_excel('sales_january.xlsx') excel_file_2 = pd.read_excel('sales_february.xlsx') excel_file_3 = pd.read_excel('sales_march.xlsx') # concatenate files new_file = pd.concat([excel_file_1, excel_file_2, excel_file_3], ignore_index=True) # export file new_file.to_excel('sales_2021.xlsx') # apply function automate_excel('sales_2021.xlsx')
Заключение
Код на Python, который мы написали в этом руководстве, можно запускать на вашем компьютере по расписанию. Для этого нужно просто использовать планировщик задач или crontab. Вот и все!
В этой статье мы рассмотрели, как автоматизировать создание базового отчета в Excel. В дальнейшем вы сможете создавать и более сложные отчеты. Надеемся, это упростит вашу жизнь. Успехов в написании кода!
Перевод статьи «A Simple Guide to Automate Your Excel Reporting with Python».