Диаграммы — отличный способ быстро визуализировать и понять огромное количество данных. Существует множество различных типов диаграмм: столбчатая диаграмма, линейная диаграмма, круговая диаграмма, и так далее. Модуль openpyxl
поддерживает многие из них.
Здесь будут разбираться приемы создания наиболее часто используемых диаграмм — это столбчатая и линейная диаграммы. Так как теория лежащая в основе создания диаграмм одинакова, создание остальных типов диаграмм не составит труда.
Примечание: В зависимости от того, что используется для просмотра документа XLSX — Microsoft Excel или альтернатива с открытым исходным кодом (LibreOffice Calc или OpenOffice Calc), диаграмма может выглядеть немного иначе. В частности, LibreOffice Calc неправильно отображает подписи осей, заголовок диаграммы вообще не выводится. Кстати китайский WPS Office Calc отображает все корректно.
Содержание:
- Основы построения диаграмм.
- Создание столбчатых гистограмм.
- 3D столбчатые гистограммы.
- Создание линейных диаграмм.
- 3D линейные диаграммы.
- Таблицы диаграмм XLSX-документа.
- Отображение определенных регионов на диаграмме.
Основы построения диаграмм.
Диаграммы состоят, по крайней мере, из одного или нескольких рядов данных. Сами ряды данных состоят из ссылок на диапазоны ячеек.
from openpyxl import Workbook from openpyxl.chart import BarChart, Reference wb = Workbook() ws = wb.active # данные для диаграммы data = [ ["Product", "Online", "Store"], [1, 30, 45], [2, 40, 30], [3, 40, 25], [4, 50, 30], [5, 30, 25], [6, 25, 35], [7, 20, 40], ] for row in data: ws.append(row) # выбираем диапазоны значений для диаграммы values = Reference(worksheet=ws, min_row=1, max_row=8, min_col=2, max_col=3) # создаем объект столбчатой диаграммы chart = BarChart() # добавляем в диаграмму выбранный диапазон значений chart.add_data(values, titles_from_data=True) # привязываем диаграмму к ячейке `E15` ws.add_chart(chart, "A11") # определяем размеры диаграммы в сантиметрах chart.width = 20 chart.height = 5 # сохраняем и смотрим что получилось wb.save("sample-chart.xlsx")
По умолчанию верхний левый угол диаграммы привязан к ячейке 'A11'
и имеет размер 15 x 7,5 см. Размеры диаграммы можно изменить, задав нижеуказанные свойства:
chart.width
— ширина диаграммы, по умолчанию 15 сантиметров.chart.heigh
— высота диаграммы, по умолчанию 7,5 сантиметров.
Внимание. Фактический размер будет зависеть от операционной системы и устройства.
Создание столбчатых гистограмм.
На столбчатых гистограммах, значения отображаются либо в виде горизонтальных полос, либо в виде вертикальных столбцов.
Следующие настройки влияют на вид столбчатых гистограмм:
- Для переключения между вертикальной и горизонтальной гистограммами, необходимо просто изменить ее тип
.type = "col"
(вертикальные столбцы) или.type = "bar"
(горизонтальные полосы). - При использовании диаграмм с накоплением, для свойства
.overlap
необходимо установить значение 100. - Если диаграмма имеет вид горизонтальных полос, то оси
x
иy
меняются местами. - Свойство объекта диаграммы
.grouping
может принимать одно из значений:'percentStacked'
,'stacked'
,'standard'
(по умолчанию).
Смотрим пример четырех гистограмм, который иллюстрирует различные возможности и настройки (с подробным описанием кода):
from copy import deepcopy from openpyxl import Workbook from openpyxl.chart import BarChart, Reference wb = Workbook() ws = wb.active # данные для построения диаграмм rows = [ ('Number', 'Batch 1', 'Batch 2'), (2, 10, 30), (3, 40, 60), (4, 50, 70), (5, 20, 10), (6, 10, 40), (7, 50, 30), ] for row in rows: ws.append(row) # ДИАГРАММА №1 # создаем объект диаграммы chart1 = BarChart() # установим тип - `вертикальные столбцы` chart1.type = "col" # установим стиль диаграммы (цветовая схема) chart1.style = 10 # заголовок диаграммы chart1.title = "Столбчатая диаграмма" # подпись оси `y` chart1.y_axis.title = 'Длина выборки' # показывать данные на оси (для LibreOffice Calc) chart1.y_axis.delete = False # подпись оси `x` chart1.x_axis.title = 'Номер теста' chart1.x_axis.delete = False # выберем 2 столбца с данными для оси `y` data = Reference(ws, min_col=2, max_col=3, min_row=1, max_row=7) # теперь выберем категорию для оси `x` categor = Reference(ws, min_col=1, min_row=2, max_row=7) # добавляем данные в объект диаграммы chart1.add_data(data, titles_from_data=True) # установим метки на объект диаграммы chart1.set_categories(categor) # добавим диаграмму на лист, в ячейку "A10" ws.add_chart(chart1, "A10") # ДИАГРАММА №2 # что бы показать типы столбчатых диаграмм, скопируем # первую диаграмму и будем менять настройки chart2 = deepcopy(chart1) # изменяем стиль chart2.style = 11 # установим тип - `горизонтальные полосы` chart2.type = "bar" chart2.title = "Горизонтальные полосы" ws.add_chart(chart2, "A25") # ДИАГРАММА №3 chart3 = deepcopy(chart1) chart3.type = "col" chart3.style = 12 # зададим группировку chart3.grouping = "stacked" # для диаграммы с группировкой, # необходимо установить перекрытие chart3.overlap = 100 chart3.title = 'Сложенная диаграмма' ws.add_chart(chart3, "A40") # ДИАГРАММА №4 chart4 = deepcopy(chart1) chart4.type = "bar" chart4.style = 13 chart4.grouping = "percentStacked" chart4.overlap = 100 # отключим линии сетки chart4.y_axis.majorGridlines = None # уберем легенду chart4.legend = None chart4.title = 'Диаграмма с процентным накоплением' ws.add_chart(chart4, "A55") # сохраняем и смотрим что получилось wb.save("bar.xlsx")
3D столбчатые гистограммы.
При помощи модуля openpyxl
также можно создавать трехмерные гистограммы. Смотрим пример простой трехмерной гистограммы:
from openpyxl import Workbook from openpyxl.chart import Reference, BarChart3D wb = Workbook() ws = wb.active rows = [ (None, 2013, 2014), ("Apples", 5, 4), ("Oranges", 6, 2), ("Pears", 8, 3) ] for row in rows: ws.append(row) data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=4) titles = Reference(ws, min_col=1, min_row=2, max_row=4) chart = BarChart3D() chart.title = "3D Bar Chart" chart.add_data(data=data, titles_from_data=True) chart.set_categories(titles) ws.add_chart(chart, "E5") wb.save("bar3d.xlsx")
Создание линейных диаграмм.
Линейные диаграммы позволяют отображать данные относительно фиксированной оси. Они похожи на точечные диаграммы, главное отличие состоит в том, что в линейных диаграммах каждый ряд данных отображается на основе одних и тех же значений. В качестве вспомогательных осей можно использовать различные типы осей.
Как и столбчатые гистограммы, линейные диаграммы бывают трех видов: 'standard'
(стандартные), 'stacked'
(с накоплением) и 'percentStacked'
(с процентным накоплением).
Смотрим пример линейных диаграмм, который иллюстрирует различные возможности и настройки (с подробным описанием кода):
from openpyxl import Workbook from openpyxl.chart import LineChart, Reference from openpyxl.chart.axis import DateAxis from datetime import date from copy import deepcopy wb = Workbook() ws = wb.active # данные для построения диаграммы rows = [ ['Date', 'Batch 1', 'Batch 2', 'Batch 3'], [date(2015,9, 1), 40, 30, 25], [date(2015,9, 2), 40, 25, 30], [date(2015,9, 3), 50, 30, 45], [date(2015,9, 4), 30, 25, 40], [date(2015,9, 5), 25, 35, 30], [date(2015,9, 6), 20, 40, 35], ] for row in rows: ws.append(row) # ДИАГРАММА №1 # создаем объект диаграммы chart1 = LineChart() # заголовок диаграммы chart1.title = "Линейная диаграмма" # установим цветовую схему диаграммы chart1.style = 13 # подпись оси `y` chart1.y_axis.title = 'Размер' # показывать данные на оси (для LibreOffice Calc) chart1.y_axis.delete = False # подпись оси `x` chart1.x_axis.title = 'Номер теста' chart1.x_axis.delete = False # выберем 4 столбца с данными для оси `y` # в итоге получим 4 графика data = Reference(ws, min_col=2, max_col=4, min_row=1, max_row=7) # добавляем данные в объект диаграммы chart1.add_data(data, titles_from_data=True) # ТЕПЕРЬ ЗАДАДИМ СТИЛЬ ЛИНИЙ # ЛИНИЯ С ДАННЫМИ ИЗ 1 СТОЛБЦА ДАННЫХ line1 = chart1.series[0] # символ маркера для текущего значения line1.marker.symbol = "x" # цвет заливки маркера line1.marker.graphicalProperties.solidFill = "FF0000" line1.marker.graphicalProperties.line.solidFill = "FF0000" # не заливаем линию между маркерами (прозрачная) line1.graphicalProperties.line.noFill = True # ЛИНИЯ С ДАННЫМИ ИЗ 2 СТОЛБЦА ДАННЫХ line2 = chart1.series[1] # цвет заливки линии графика line2.graphicalProperties.line.solidFill = "00AAAA" # делаем линию пунктирной line2.graphicalProperties.line.dashStyle = "sysDot" # ширина указывается в EMU line2.graphicalProperties.line.width = 100050 # ЛИНИЯ С ДАННЫМИ ИЗ 3 СТОЛБЦА ДАННЫХ line3 = chart1.series[2] # символ маркера для текущего значения line3.marker.symbol = "triangle" # покрасим маркер в другой цвет line1.marker.graphicalProperties.solidFill = "FF0000" line3.marker.graphicalProperties.line.solidFill = "0000FF" # делаем линию гладкой line3.smooth = True # добавим диаграмму на лист, в ячейку "A10" ws.add_chart(chart1, "A10") # ДИАГРАММА №2 # скопируем первую диаграмму stacked = deepcopy(chart1) # диаграмма с накоплением stacked.grouping = "stacked" stacked.title = "Графики с накоплением" ws.add_chart(stacked, "A27") # ДИАГРАММА №3 percent_stacked = deepcopy(chart1) # диаграмма с процентным накоплением percent_stacked.grouping = "percentStacked" percent_stacked.title = "Графики с процентным накоплением" ws.add_chart(percent_stacked, "A44") # ДИАГРАММА №4 с датами по оси `x`, все линии # графиков будут иметь стиль по умолчанию # создаем объект диаграммы chart2 = LineChart() chart2.title = "Графики с осью дат" # установим другую цветовую схему chart2.style = 12 # подпись оси `y` chart2.y_axis.title = "Размер" chart2.y_axis.delete = False # поперечная ось chart2.y_axis.crossAx = 500 # подпись оси `x` chart2.x_axis.title = "Дата" chart2.x_axis.delete = False chart2.x_axis = DateAxis(crossAx=100) # формат отображения дат на оси `x` chart2.x_axis.number_format = 'd-mmm' # задаем временную единицу даты chart2.x_axis.majorTimeUnit = "days" # добавляем выборку данных из первой диаграммы chart2.add_data(data, titles_from_data=True) # делаем выборку данных для оси `x` dates = Reference(ws, min_col=1, min_row=2, max_row=7) chart2.set_categories(dates) ws.add_chart(chart2, "A61") # сохраняем и смотрим что получилось wb.save("line.xlsx")
Примечание:
- Атрибут линии
dashStyle
может принимать одно из значений:‘dot’
,‘lgDashDot’
,‘lgDashDotDot’
,‘sysDash’
,‘lgDash’
,‘sysDot’
,‘solid’
(по умолчанию),‘dashDot’
,‘sysDashDotDot’
,‘dash’
,‘sysDashDot’
- Атрибут маркера
marker.symbol
может принимать одно из значений:‘dot’
,‘plus’
,‘triangle’
,‘x’
,‘star’
,‘diamond’
,‘square’
,‘circle’
,‘dash’
,‘auto’
(по умолчанию).
3D линейные диаграммы.
В трехмерных линейных диаграммах проекция третьей оси совпадает с названием столбцов выбранных данных, в общем с легендой.
from datetime import date from openpyxl import Workbook from openpyxl.chart import LineChart3D, Reference from openpyxl.chart.axis import DateAxis wb = Workbook() ws = wb.active rows = [ ['Date', 'Batch 1', 'Batch 2', 'Batch 3'], [date(2015,9, 1), 40, 30, 25], [date(2015,9, 2), 40, 25, 30], [date(2015,9, 3), 50, 30, 45], [date(2015,9, 4), 30, 25, 40], [date(2015,9, 5), 25, 35, 30], [date(2015,9, 6), 20, 40, 35], ] for row in rows: ws.append(row) # создаем объект диаграммы chart = LineChart3D() # устанавливаем атрибуты chart.title = "3D Линейный график" # легенда не нужна, т.к. 3-я ось совпадает # с названиями столбцов выборки chart.legend = None chart.style = 15 chart.y_axis.title = 'Размер' chart.x_axis.title = 'Номер теста' # делаем выборку и добавляем ее в объект диаграммы data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7) chart.add_data(data, titles_from_data=True) # добавляем диаграмму на лист в ячейку "A10" ws.add_chart(chart, "A10") # сохраняем и смотрим что получилось wb.save("line3D.xlsx")
Таблицы диаграмм XLSX-документа.
Диаграммы можно добавлять в специальные рабочие листы, называемые таблицами диаграмм, которые содержат только диаграммы.
Все данные для диаграммы должны быть на другом листе электронной таблицы.
from openpyxl import Workbook from openpyxl.chart import PieChart, Reference, Series wb = Workbook() ws = wb.active # создаем таблицу диаграммы chartsheet = wb.create_chartsheet("Круговая диаграмма") rows = [ ["Bob", 3], ["Harry", 2], ["James", 4], ] for row in rows: ws.append(row) # создаем rheujde. lbfuhfvve chart = PieChart() # выбираем данные labels = Reference(ws, min_col=1, min_row=1, max_row=3) data = Reference(ws, min_col=2, min_row=1, max_row=3) # добавляем данные chart.add_data(data, titles_from_data=False) chart.set_categories(labels) chart.title = "Круговая диаграмма" # размеры диаграммы chart.width = 15 chart.height = 15 # добавляем на лист диаграмм chartsheet.add_chart(chart) wb.save("create_chartsheet.xlsx")
Отображение определенных регионов на диаграмме.
Минимальные и максимальные значения осей можно установить вручную для отображения определенных регионов на диаграмме.
from openpyxl import Workbook from openpyxl.chart import ScatterChart, Reference, Series wb = Workbook() ws = wb.active # данные диаграммы ws.append(['X', '1/X']) for x in range(-10, 11): if x: ws.append([x, 1.0 / x]) # ДИАГРАММА 1 chart1 = ScatterChart() chart1.title = "Полные Оси" chart1.x_axis.title = 'x' chart1.x_axis.delete = False chart1.y_axis.title = '1/x' chart1.y_axis.delete = False chart1.legend = None # ДИАГРАММА 2 chart2 = ScatterChart() chart2.title = "Clipped Axes" chart2.x_axis.title = 'x' chart2.x_axis.delete = False chart2.y_axis.title = '1/x' chart2.y_axis.delete = False chart2.legend = None # устанавливаем минимумы chart2.x_axis.scaling.min = 0 chart2.y_axis.scaling.min = 0 # устанавливаем максимумы chart2.x_axis.scaling.max = 11 chart2.y_axis.scaling.max = 1.5 # делаем выборку x = Reference(ws, min_col=1, min_row=2, max_row=22) y = Reference(ws, min_col=2, min_row=2, max_row=22) # собираем серию series = Series(y, xvalues=x) # добавляем в объекты диаграмм chart1.append(series) chart2.append(series) # добавляем диаграммы на лист Excel ws.add_chart(chart1, "d1") ws.add_chart(chart2, "d17") wb.save("minmax.xlsx")
Примечание. В некоторых случаях, таких как в примере, установка пределов оси фактически эквивалентна отображению поддиапазона данных. Для больших наборов данных визуализация точечных диаграмм (и, возможно, других) будет намного быстрее при использовании подмножеств данных, а не ограничений по осям как в Excel, так и в OpenOffice Calc/LibreOffice Calc.
Creating a chart¶
Charts are composed of at least one series of one or more data points. Series
themselves are comprised of references to cell ranges.
>>> from openpyxl import Workbook >>> wb = Workbook() >>> ws = wb.active >>> for i in range(10): ... ws.append([i]) >>> >>> from openpyxl.chart import BarChart, Reference, Series >>> values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10) >>> chart = BarChart() >>> chart.add_data(values) >>> ws.add_chart(chart, "E15") >>> wb.save("SampleChart.xlsx")
By default the top-left corner of a chart is anchored to cell E15 and the
size is 15 x 7.5 cm (approximately 5 columns by 14 rows). This can be changed
by setting the anchor, width and height properties of the chart. The
actual size will depend on operating system and device. Other anchors are
possible; see openpyxl.drawing.spreadsheet_drawing
for further information.
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Prerequisite: Python | Plotting charts in excel sheet using openpyxl module | Set – 1 Openpyxl is a Python library using which one can perform multiple operations on excel files like reading, writing, arithmetic operations and plotting graphs. Charts are composed of at least one series of one or more data points. Series themselves are comprised of references to cell ranges. Let’s see how to plot Scatter, Bubble, Pie, 3D Pie Chart on an excel sheet using openpyxl. For plotting the charts on an excel sheet, firstly, create chart object of specific chart class( i.e ScatterChart, PieChart etc.). After creating chart objects, insert data in it and lastly, add that chart object in the sheet object. Let’s see how to plot different charts using realtime data. Code #1 : Plot the Bubble Chart. Bubble charts are similar to scatter charts but use a third dimension to determine the size of the bubbles. Charts can include multiple series. For plotting the bubble chart on an excel sheet, use BubbleChart class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
BubbleChart, Reference, Series
wb
=
openpyxl.Workbook()
sheet
=
wb.active
rows
=
[
("Number of Products", "Sales
in
USD", "Market share"),
(
14
,
12200
,
15
),
(
20
,
60000
,
33
),
(
18
,
24400
,
10
),
(
22
,
32000
,
42
),
]
for
row
in
rows:
sheet.append(row)
chart
=
BubbleChart()
xvalues
=
Reference(sheet, min_col
=
1
,
min_row
=
2
, max_row
=
5
)
yvalues
=
Reference(sheet, min_col
=
2
,
min_row
=
2
, max_row
=
5
)
size
=
Reference(sheet, min_col
=
3
,
min_row
=
2
, max_row
=
5
)
series
=
Series(values
=
yvalues, xvalues
=
xvalues,
zvalues
=
size, title
=
"
2013
")
chart.series.append(series)
chart.title
=
" BUBBLE
-
CHART "
chart.x_axis.title
=
" X_AXIS "
chart.y_axis.title
=
" Y_AXIS "
sheet.add_chart(chart, "E2")
wb.save("bubbleChart.xlsx")
Output: Code #2 : Plot the Scatter Chart Scatter, or xy charts are similar to some line charts. For plotting the Scatter chart on an excel sheet, use ScatterChart class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
ScatterChart, Reference, Series
wb
=
openpyxl.Workbook()
sheet
=
wb.active
rows
=
[
("Number of Products", "Sales
in
USD", "Market share"),
(
14
,
12200
,
15
),
(
20
,
60000
,
33
),
(
18
,
24400
,
10
),
(
22
,
32000
,
42
),
]
for
row
in
rows:
sheet.append(row)
chart
=
ScatterChart()
xvalues
=
Reference(sheet, min_col
=
1
,
min_row
=
2
, max_row
=
5
)
yvalues
=
Reference(sheet, min_col
=
2
,
min_row
=
2
, max_row
=
5
)
size
=
Reference(sheet, min_col
=
3
,
min_row
=
2
, max_row
=
5
)
series
=
Series(values
=
yvalues, xvalues
=
xvalues,
zvalues
=
size, title
=
"
2013
")
chart.series.append(series)
chart.title
=
" SCATTER
-
CHART "
chart.x_axis.title
=
" X_AXIS "
chart.y_axis.title
=
" Y_AXIS "
sheet.add_chart(chart, "E2")
wb.save(" ScatterChart.xlsx")
Output: Code #3 : Plot the Pie Chart Pie charts plot data as slices of a circle with each slice representing the percentage of the whole. Slices are plotted in a clockwise direction with 0° being at the top of the circle. Pie charts can only take a single series of data. For plotting the Pie chart on an excel sheet, use PieChart class from openpyxl.chart submodule.
Python
import
openpyxl
from
openpyxl.chart
import
PieChart, Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
datas
=
[
[
'Pie'
,
'Sold'
],
[
'Apple'
,
50
],
[
'Cherry'
,
30
],
[
'Pumpkin'
,
10
],
[
'Chocolate'
,
40
],
]
for
row
in
datas:
sheet.append(row)
chart
=
PieChart()
labels
=
Reference(sheet, min_col
=
1
,
min_row
=
2
, max_row
=
5
)
data
=
Reference(sheet, min_col
=
2
,
min_row
=
1
, max_row
=
5
)
chart.add_data(data, titles_from_data
=
True
)
chart.set_categories(labels)
chart.title
=
" PIE
-
CHART "
sheet.add_chart(chart, "E2")
wb.save(" PieChart.xlsx")
Output: Code #4: Plot the Bar Chart For plotting the 3D pie chart on an excel sheet, use PieChart3D class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
PieChart3D, Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
datas
=
[
[
'Pie'
,
'Sold'
],
[
'Apple'
,
50
],
[
'Cherry'
,
30
],
[
'Pumpkin'
,
10
],
[
'Chocolate'
,
40
],
]
for
row
in
datas:
sheet.append(row)
chart
=
PieChart3D()
labels
=
Reference(sheet, min_col
=
1
,
min_row
=
2
, max_row
=
5
)
data
=
Reference(sheet, min_col
=
2
,
min_row
=
1
, max_row
=
5
)
chart.add_data(data, titles_from_data
=
True
)
chart.set_categories(labels)
chart.title
=
"
3DPIE
-
CHART "
sheet.add_chart(chart, "E2")
wb.save("
3DPieChart
.xlsx")
Output:
Like Article
Save Article
Vote for difficulty
Current difficulty :
Medium
Давайте посмотрим правде в глаза. Независимо от того, чем мы занимаемся, рано или поздно нам придется иметь дело с повторяющимися задачами, такими как обновление ежедневного отчета в 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
в командной строке.
[python_ad_block]
Чтение файла 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.
Предположим, мы хотим суммировать данные в ячейках 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».
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Prerequisite: Reading & Writing to excel sheet using openpyxl Openpyxl is a Python library using which one can perform multiple operations on excel files like reading, writing, arithmetic operations and plotting graphs. Let’s see how to plot different charts using realtime data. Charts are composed of at least one series of one or more data points. Series themselves are comprised of references to cell ranges. For plotting the charts on an excel sheet, firstly, create chart object of specific chart class( i.e BarChart, LineChart etc.). After creating chart objects, insert data in it and lastly, add that chart object in the sheet object.
Code #1 : Plot the Bar Chart For plotting the bar chart on an excel sheet, use BarChart class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
BarChart,Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
for
i
in
range
(
10
):
sheet.append([i])
values
=
Reference(sheet, min_col
=
1
, min_row
=
1
,
max_col
=
1
, max_row
=
10
)
chart
=
BarChart()
chart.add_data(values)
chart.title
=
" BAR
-
CHART "
chart.x_axis.title
=
" X_AXIS "
chart.y_axis.title
=
" Y_AXIS "
sheet.add_chart(chart, "E2")
wb.save("barChart.xlsx")
Output: Code #2 : Plot the 3D Bar Chart For plotting the 3D bar chart on an excel sheet, use BarChart3D class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
BarChart3D,Reference
for
i
in
range
(
10
):
sheet.append([i])
values
=
Reference(sheet, min_col
=
1
, min_row
=
1
,
max_col
=
1
, max_row
=
10
)
chart
=
BarChart3D()
chart.add_data(values)
chart.title
=
" BAR
-
CHART3D "
chart.x_axis.title
=
" X AXIS "
chart.y_axis.title
=
" Y AXIS "
sheet.add_chart(chart, "E2")
wb.save("BarChart3D.xlsx")
Output: Code #3 : Plot the Area Chart For plotting the Area chart on an excel sheet, use AreaChart class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
AreaChart,Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
for
i
in
range
(
10
):
sheet.append([i])
values
=
Reference(sheet, min_col
=
1
, min_row
=
1
,
max_col
=
1
, max_row
=
10
)
chart
=
AreaChart()
chart.add_data(values)
chart.title
=
" AREA
-
CHART "
chart.x_axis.title
=
" X
-
AXIS "
chart.y_axis.title
=
" Y
-
AXIS "
sheet.add_chart(chart, "E2")
wb.save("AreaChart.xlsx")
Output: Code #4 : Plot the 3D Area Chart For plotting the 3D Area chart on an excel sheet, use AreaChart3D class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
AreaChart3D,Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
for
i
in
range
(
10
):
sheet.append([i])
values
=
Reference(sheet, min_col
=
1
, min_row
=
1
,
max_col
=
1
, max_row
=
10
)
chart
=
AreaChart3D()
chart.add_data(values)
chart.title
=
" AREA
-
CHART3D "
chart.x_axis.title
=
" X
-
AXIS "
chart.y_axis.title
=
" Y
-
AXIS "
sheet.add_chart(chart, "E2")
wb.save("AreaChart3D.xlsx")
Output: Code #5 : Plot a Line Chart. For plotting the Line chart on an excel sheet, use LineChart class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
LineChart,Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
for
i
in
range
(
10
):
sheet.append([i])
values
=
Reference(sheet, min_col
=
1
, min_row
=
1
,
max_col
=
1
, max_row
=
10
)
chart
=
LineChart()
chart.add_data(values)
chart.title
=
" LINE
-
CHART "
chart.x_axis.title
=
" X
-
AXIS "
chart.y_axis.title
=
" Y
-
AXIS "
sheet.add_chart(chart, "E2")
wb.save("LineChart.xlsx")
Output: Code #6 : Plot a 3D Line Chart. For plotting the 3D Line chart on an excel sheet we have to use LineChart3D class from openpyxl.chart submodule.
Python3
import
openpyxl
from
openpyxl.chart
import
LineChart3D,Reference
wb
=
openpyxl.Workbook()
sheet
=
wb.active
for
i
in
range
(
10
):
sheet.append([i])
values
=
Reference(sheet, min_col
=
1
, min_row
=
1
,
max_col
=
1
, max_row
=
10
)
chart
=
LineChart3D()
chart.add_data(values)
chart.title
=
" LINE
-
CHART3D "
chart.x_axis.title
=
" X
-
AXIS "
chart.y_axis.title
=
" Y
-
AXIS "
sheet.add_chart(chart, "E2")
wb.save("LineChart3D.xlsx")
Output:
Like Article
Save Article