Сообщить об ошибке.

Установка формата ячеек Excel при помощи openpyxl

Для лучшей читабельности электронной таблицы .XLSX иногда бывает нужно указать формат ячейки, представляющую дату (день, месяц, год), проценты, денежный формат и т.д. Модуль openpyxl предоставляет такую возможность при помощи атрибута ячейки .number_format.

Формат даты в ячейку, можно установить используя дату и время Python:

>>> import datetime
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
# установим формат ячейки как дата, 
# используя дату и время Python
>>> ws['A1'] = datetime.date.today()
>>> ws['A1'].number_format
# 'yyyy-mm-dd'
>>> ws['A2'] = datetime.datetime.now()
>>> ws['A2'].number_format
# 'yyyy-mm-dd h:mm:ss'

Во-первых, не каждого пользователя устроит формат даты, возвращаемый модулем Python datetime. Во-вторых, как быть с денежным форматом или например с процентами?

Модуль openpyxl предоставляет некоторые встроенные форматы ячеек в своем подмодуле openpyxl.styles.numbers, в частности в словаре BUILTIN_FORMATS.

Пример установки формата ячейки:

>>> from openpyxl.styles.numbers import BUILTIN_FORMATS
# укажем, что ячейка будет иметь формат процентов
>>> ws['A3'].number_format = BUILTIN_FORMATS[10]
>>> ws['A3'] = 100

Что бы посмотреть все встроенные форматы ячеек, нужно просто распечатать словарь BUILTIN_FORMATS.

>>> from openpyxl.styles.numbers import BUILTIN_FORMATS
>>> for key, val in BUILTIN_FORMATS.items():
...     print(f'{key}: {val}')
# 0: General
# 1: 0
# 2: 0.00
# 3: #,##0
# 4: #,##0.00
# 5: "$"#,##0_);("$"#,##0)
# 6: "$"#,##0_);[Red]("$"#,##0)
...
# 14: mm-dd-yy
...
# 37: #,##0_);(#,##0)
# 38: #,##0_);[Red](#,##0)
# 39: #,##0.00_);(#,##0.00)
# 40: #,##0.00_);[Red](#,##0.00)
...

Как можно видеть, словарь со встроенными форматами BUILTIN_FORMATS не содержит формата привычной нам даты ДД-ММ-ГГГГ, а так же денежного формата в рублях. Но это не беда, ведь формат ячейки - это простой текст, который определяет правила форматирования ячейки электронные таблицы. Другими словами, этот текст заставляет программу Excel форматировать ячейку определенным образом. Например денежный формат в рублях будет выглядеть как то так: '# ###0,00 [$₽-419]'

Примеры составления и записи в ячейки собственных форматов:

# стандартный денежный формат
>>> ws['A4'].number_format = '# ###0,00 [$₽-419]'
>>> ws['A4'] = 8000000
# или
>>> ws['A5'].number_format = '# ###0,00 [$RUR-419]'
>>> ws['A5'] = 9000000
# денежный формат можно записать и так, отрицательные
# значения будут автоматически выделятся красным
>>> ws['A6'].number_format = '# ###0,00" руб.";[RED]-# ###0,00" руб."'
>>> ws['B6'].number_format = '# ###0,00" руб.";[RED]-# ###0,00" руб."'
>>> ws['A6'] = 900
>>> ws['B6'] = -90
# привычный формат даты можно записать так
>>> ws['A7'].number_format = 'DD.MM.YYYY'
# а еще даты можно записать так
>>> ws['A8'].number_format = 'D MMM, YYYY'
# или так
>>> ws['A9'].number_format = 'D MMMM, YYYY'
>>> ws['A10'].number_format = 'NN, D MMM, YY'
>>> ws['A11'].number_format = 'NNNND MMMM, YYYY'
# теперь время
>>> ws['A12'].number_format = 'HH:MM:SS'
>>> ws['A13'].number_format = 'HH:MM'
# теперь вставим в ячейки дату
>>> for row in range(7, 14):
...     ws.cell(row, 1, datetime.datetime.now())
# сохраняем и смотрим что получилось
>>> wb.save("cell_format.xlsx")

Еще можно открыть программу Excel, перейти на любую ячейку, выбрать нужный формат, а потом скопировать паттерн формата, который выдала программа. Вот и все.

Более подробно о составлении форматов ячеек читайте в документации к Microsoft Excel.