Найти в Дзене
Записки сисадмина

Python. Excel. Изменяем внешний вид таблиц.

Да, мы технари. И нам в первую очередь важен точный результат. Но нельзя забывать и про репрезентативность нашего конечного продукта. Ранее я говорил, что автоматически формирую отчеты в Excel таблицах. И каждый раз я слышал одну и ту же фразу «Миша, сделай красиво». Ну давайте сделаем наши таблицы читаемыми даже с телефонов. pip install openpyxl from openpyxl import load_workbook
from openpyxl.styles import PatternFill В дальнейшем нам придется обращаться к листам по имени: На вывод мы получаем "1000000" и тип данных - число (<class 'int'>) Поскольку запрос звучит как просто "сделать красиво", мы можем пожертвовать некоторым функционалом Excel и перевести значения из чисел в строки. Итак, что важно: 1. Вы можете упростить все до одной строки: ws[f'{col}{row}'].value = '{0:,}'.format(ws[f'{col}{row}'].value).replace(',', ' ') 2. К ячейке можно обращаться по имени и по индексам: ws['A1'].value ws.cell(row=1, column=1).value Здесь мы будем изменять параметр alignment у каждой ячейки.
Оглавление

Да, мы технари. И нам в первую очередь важен точный результат. Но нельзя забывать и про репрезентативность нашего конечного продукта.

Ранее я говорил, что автоматически формирую отчеты в Excel таблицах. И каждый раз я слышал одну и ту же фразу «Миша, сделай красиво».

Ну давайте сделаем наши таблицы читаемыми даже с телефонов.

  • Устанавливаем библиотеку openpyxl:
pip install openpyxl
  • И импортируем те модули, которые будем сегодня использовать:
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
  • Создадим тестовый Excel файл, над которым и будем проводить опыты:
  • Открываем наш файл с помощью openpyxl и смотрим, какие листы у него есть.

В дальнейшем нам придется обращаться к листам по имени:

-2
-3
  • В данном примере пропишем название листа в переменную:
-4

Добавляем разделитель порядков в числах

  • Достаем значение из ячейки А1:
-5

На вывод мы получаем "1000000" и тип данных - число (<class 'int'>)

Поскольку запрос звучит как просто "сделать красиво", мы можем пожертвовать некоторым функционалом Excel и перевести значения из чисел в строки.

  • Разбиваем наше число по порядкам:
-6
-7
  • Изменяем разделитель порядка с запятой на пробел:
-8
-9
  • Добавляем все это в цикл по колонкам и строкам и сохраняем результат:
-10
-11

Итак, что важно:

1. Вы можете упростить все до одной строки:

ws[f'{col}{row}'].value = '{0:,}'.format(ws[f'{col}{row}'].value).replace(',', ' ')

2. К ячейке можно обращаться по имени и по индексам:

ws['A1'].value
ws.cell(row=1, column=1).value

Изменяем размер ячеек

  • Устанавливаем высоту строк:
-12
-13
  • Изменяем ширину столбцов:
-14

Изменяем положение текста в ячейке

Здесь мы будем изменять параметр alignment у каждой ячейки. При запросе его мы получим следующие параметры:

<openpyxl.styles.alignment.Alignment object>
Parameters:
horizontal='general', vertical='bottom', textRotation=0, wrapText=None, shrinkToFit=None, indent=0.0, relativeIndent=0.0, justifyLastLine=None, readingOrder=0.0

Основная проблема в том, что мы не можем изменять стиль на лету, как мы изменяли значения в ячейках. Поэтому данный код не сработает:

-15
  • Мы должны обращаться к методу copy и сразу задавать нужные нам параметры:
-16

В переменную alignment мы копируем стили из ячейки, изменяя нужные нам параметры:

horizontal - положение текста по горизонтали.

vertical - положение текста по вертикали.

wrap_text - True/False - перенос текста внутри ячейки.

-17

Заливка ячеек

Так же, как и со значениями, мы можем управлять цветом заливки ячеек, обращаясь к методу fill и модулю PatternFill.

-18
-19

Стандартные цвета вы можете найти по этой ссылке.

Объединяем все воедино:

-20

Весь код из статьи выложил здесь.