Изучаем openpyxl на примере
Давайте сыграем в азартную игру. Возьмём 4 участников, каждому выдадим по 1000 рублей, а затем предложим им бросить монетку 5000 раз. Если выпадет орёл, то участник получает 10 рублей. Если решка, то теряет.
Результаты бросков для каждого игрока запишем в таблицу, а для наглядности ещё и построим график. И всё это сделаем с помощью openpyxl.
Подготовка
from openpyxl import Workbook
# 1. Создаём новую книгу Excel в памяти
workbook = Workbook()
# 2. Получаем активный лист книги и переименовываем его
sheet = workbook.active
sheet.title = 'Важные данные'
# 3. Изменяем размеры первых 5 столбцов
for letter in 'ABCDE':
sheet.column_dimensions[letter].width = 15
# 4. Сохраняем книгу
filename = 'Броски монетки.xlsx'
workbook.save(filename)
Адресация ячеек/строк/столбцов происходит точно так же, как и в самом Excel: столбцы обозначаются буквами, ряды - цифрами, а ячейки - комбинацией вида 'A1'
. Соответственно, в третьем блоке кода мы растянули столбцы A-E до 15 символов в ширину.
После вызова wb.save()
вы сможете найти в рабочей директории файл «Броски монетки.xlsx». Откройте его и проверьте, что первые 5 столбцов действительно отличаются по ширине от остальных.
Стилизация ячеек
Добавим в самом начале таблицы большую красную надпись «Изучаем OpenPyXL». Должно получиться вот так:
Для этого:
- Поместим в верхнюю левую ячейку соответствующий текст;
- Изменим шрифт (цвет - красный, размер - 30 пикселей, начертание - жирное);
- Выровняем содержимое ячейки по центру;
- Объединим 5 ячеек в верхнем ряду (A1:E1), чтобы надпись выглядела как большой заголовок для таблицы из 5 столбцов.
from openpyxl.styles import Font, Alignment
...
cell = sheet['A1']
cell.value = 'Изучаем OpenPyXL'
cell.font = Font(color='FF0000', size=30, bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center')
sheet.merge_cells('A1:E1')
Генерируем данные
4 игрока, у каждого по 1000 рублей. Каждый делает по 5000 бросков, в каждом броске либо выигрывает 10 рублей, либо проигрывает столько же.
Так как это учебный пример, то не будем его усложнять, накладывая дополнительные ограничения вида «капитал не может быть меньше 0». Позволим игрокам влезать в долги :)
bet = 10
bankrolls = [1000] * 4
n = 5000
for row in range(2, n + 2):
left_cell = sheet.cell(row=row, column=1)
left_cell.value = f'Бросок №{row - 1}'
for col in range(2, 6):
player_idx = col - 2
bankrolls[player_idx] += bet if random() < 0.5 else -bet
cell = sheet.cell(row=row, column=col)
cell.value = bankrolls[player_idx]
Результат:
Добавляем график
Для этого создадим ссылку на область данных, которые будут использоваться для построения графика, с помощью класса Reference
.
from openpyxl.chart import LineChart, Reference
...
# Создаём ссылку на область данных "A2:E5001"
data = Reference(sheet, min_col=1, min_row=2, max_col=5, max_row=5001)
# Создаём график и добавляем в него данные
chart = LineChart()
chart.add_data(data)
# Помещаем график на лист и сохраняем документ
sheet.add_chart(chart, 'G2')
workbook.save(filename)
В конечном итоге должно получиться следующее: