Построение графиков excel python

Диаграммы — отличный способ быстро визуализировать и понять огромное количество данных. Существует множество различных типов диаграмм: столбчатая диаграмма, линейная диаграмма, круговая диаграмма, и так далее. Модуль 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

  • Read
  • Discuss
  • 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

  • Read
  • Discuss
  • 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

    Понравилась статья? Поделить с друзьями:
  • Построение графика цель к таблице в excel
  • Построение графика функция если то в excel примеры
  • Построение графика функций в excel 2003
  • Построение графика функции с модулем excel
  • Построение графика функции распределения в excel